From d8fda339bc9a8d9defb30e868951c995765e3821 Mon Sep 17 00:00:00 2001 From: Katello Devel Date: Wed, 15 Jun 2011 10:26:51 -0700 Subject: [PATCH] initial commit --- .gitignore | 19 + .rspec | 1 + Gemfile | 66 + Gemfile.lock | 196 + LICENSE | 339 + README | 256 + Rakefile | 7 + app/controllers/accounts_controller.rb | 19 + app/controllers/api/api_controller.rb | 114 + .../api/distributions_controller.rb | 28 + .../api/environments_controller.rb | 71 + app/controllers/api/errata_controller.rb | 29 + .../api/organizations_controller.rb | 55 + app/controllers/api/packages_controller.rb | 29 + app/controllers/api/ping_controller.rb | 24 + app/controllers/api/products_controller.rb | 47 + app/controllers/api/providers_controller.rb | 106 + app/controllers/api/proxies_controller.rb | 48 + .../api/puppetclasses_controller.rb | 23 + .../api/repositories_controller.rb | 48 + app/controllers/api/status_controller.rb | 28 + app/controllers/api/sync_controller.rb | 82 + app/controllers/api/systems_controller.rb | 62 + app/controllers/api/templates_controller.rb | 94 + app/controllers/application_controller.rb | 327 + app/controllers/auto_complete_search.rb | 30 + app/controllers/certificates_controller.rb | 26 + app/controllers/changesets_controller.rb | 194 + app/controllers/consumers_controller.rb | 31 + app/controllers/content_controller.rb | 19 + app/controllers/dashboard_controller.rb | 21 + app/controllers/entitlements_controller.rb | 26 + app/controllers/environments_controller.rb | 120 + app/controllers/errata_controller.rb | 38 + .../failed_authentication_controller.rb | 29 + app/controllers/nodes_controller.rb | 28 + app/controllers/notices_controller.rb | 102 + app/controllers/operations_controller.rb | 19 + app/controllers/organizations_controller.rb | 129 + app/controllers/packages_controller.rb | 47 + app/controllers/pools_controller.rb | 22 + app/controllers/products_controller.rb | 93 + app/controllers/promotions_controller.rb | 159 + app/controllers/providers_controller.rb | 188 + app/controllers/puppetclasses_controller.rb | 21 + app/controllers/repositories_controller.rb | 79 + app/controllers/roles_controller.rb | 161 + app/controllers/search_controller.rb | 77 + app/controllers/sync_management_controller.rb | 164 + app/controllers/sync_plans_controller.rb | 128 + app/controllers/sync_schedules_controller.rb | 60 + app/controllers/system_settings_controller.rb | 16 + app/controllers/systems_controller.rb | 110 + app/controllers/user_sessions_controller.rb | 60 + app/controllers/users_controller.rb | 134 + app/helpers/api/puppetclasses_helper.rb | 14 + app/helpers/application_helper.rb | 135 + app/helpers/content_helper.rb | 14 + app/helpers/dashboard_helper.rb | 14 + app/helpers/environments_helper.rb | 14 + app/helpers/errata_helper.rb | 14 + app/helpers/nodes_helper.rb | 14 + app/helpers/notices_helper.rb | 21 + app/helpers/operations_helper.rb | 14 + app/helpers/packages_helper.rb | 14 + app/helpers/promotions_helper.rb | 86 + app/helpers/puppetclasses_helper.rb | 18 + app/helpers/repositories_helper.rb | 14 + app/helpers/roles_helper.rb | 38 + app/helpers/search_helper.rb | 35 + app/helpers/sync_management_helper.rb | 14 + app/helpers/sync_plans_helper.rb | 2 + app/helpers/sync_schedules_helper.rb | 15 + app/helpers/systems_helper.rb | 14 + app/helpers/translation_helper.rb | 27 + app/helpers/users_helper.rb | 20 + app/models/authorization.rb | 101 + app/models/changeset.rb | 161 + app/models/changeset_erratum.rb | 23 + app/models/changeset_package.rb | 23 + app/models/changeset_repo.rb | 19 + app/models/cp_consumer_user.rb | 21 + app/models/errors.rb | 22 + app/models/glue.rb | 152 + app/models/glue/candlepin/consumer.rb | 170 + app/models/glue/candlepin/owner.rb | 87 + app/models/glue/candlepin/product.rb | 199 + app/models/glue/candlepin/product_content.rb | 29 + app/models/glue/provider.rb | 169 + app/models/glue/pulp/distribution.rb | 31 + app/models/glue/pulp/errata.rb | 43 + app/models/glue/pulp/package.rb | 30 + app/models/glue/pulp/repo.rb | 186 + app/models/glue/pulp/repos.rb | 307 + app/models/glue/pulp/sync.rb | 23 + app/models/glue/pulp/sync_status.rb | 33 + app/models/hash_util.rb | 35 + app/models/help_tip.rb | 15 + .../katello_description_format_validator.rb | 20 + app/models/katello_name_format_validator.rb | 30 + app/models/kp_environment.rb | 149 + app/models/lazy_accessor.rb | 133 + app/models/login_credential.rb | 31 + app/models/no_trailing_space_validator.rb | 23 + app/models/notice.rb | 57 + app/models/organization.rb | 52 + app/models/permission.rb | 57 + app/models/ping.rb | 74 + app/models/pool.rb | 19 + app/models/product.rb | 73 + app/models/provider.rb | 74 + app/models/puppetclasses.rb | 24 + app/models/resource_type.rb | 16 + app/models/role.rb | 201 + app/models/search_favorite.rb | 32 + app/models/search_history.rb | 15 + app/models/support.rb | 17 + app/models/sync_plan.rb | 68 + app/models/system.rb | 55 + app/models/system_template.rb | 184 + app/models/tag.rb | 37 + app/models/user.rb | 160 + app/models/user_notice.rb | 29 + app/models/username_validator.rb | 20 + app/models/verb.rb | 29 + app/stylesheets/_base.scss | 144 + app/stylesheets/_liberation.scss | 42 + app/stylesheets/_overpass.scss | 21 + app/stylesheets/_text.scss | 40 + app/stylesheets/fancyqueries.scss | 217 + app/stylesheets/grid.scss | 16 + app/stylesheets/ie.scss | 5 + app/stylesheets/katello.scss | 1039 ++ app/stylesheets/print.scss | 3 + app/stylesheets/screen.scss | 856 ++ app/views/accounts/show.html.haml | 6 + app/views/changesets/_changeset.html.haml | 67 + .../changesets/_dependency_list.html.haml | 3 + app/views/changesets/_edit.html.haml | 43 + app/views/changesets/_list.html.haml | 2 + app/views/changesets/_name.html.haml | 6 + app/views/changesets/index.html.haml | 17 + app/views/common/403.html.haml | 7 + app/views/common/_common_i18n.html.haml | 6 + app/views/common/_edit_i18n.html.haml | 10 + app/views/common/_env_select.html.haml | 26 + app/views/common/_helptip.html.haml | 6 + app/views/common/_helptip_button.html.haml | 3 + app/views/common/_list_item.html.haml | 8 + app/views/common/_list_items.html.haml | 2 + app/views/common/_list_remove.js.haml | 2 + app/views/common/_list_update.html.haml | 4 + app/views/common/_one_panel.html.haml | 10 + app/views/common/_one_panel_list_item.haml | 5 + app/views/common/_panel.html.haml | 63 + app/views/common/_search.html.haml | 17 + app/views/consumers/export_status.html.haml | 8 + app/views/content/index.html.haml | 6 + app/views/dashboard/index.html.haml | 6 + app/views/environments/_edit.html.haml | 30 + app/views/environments/_new.html.haml | 24 + app/views/errata/_packages.html.haml | 16 + app/views/errata/_show.html.haml | 49 + app/views/layouts/_ajax_notices.haml | 9 + app/views/layouts/_footer.haml | 7 + app/views/layouts/_header.haml | 23 + app/views/layouts/_notification.haml | 24 + app/views/layouts/_org.haml | 2 + app/views/layouts/katello.haml | 43 + app/views/nodes/_list.html.haml | 5 + app/views/nodes/index.html.haml | 1 + app/views/nodes/show.html.haml | 7 + app/views/notices/show.html.haml | 43 + app/views/operations/index.html.haml | 4 + app/views/organizations/_edit.html.haml | 39 + app/views/organizations/_new.html.haml | 17 + app/views/organizations/index.html.haml | 15 + app/views/owners/import_status.html.haml | 17 + app/views/packages/_changelog.html.haml | 12 + app/views/packages/_dependencies.html.haml | 31 + app/views/packages/_filelist.html.haml | 15 + app/views/packages/_show.html.haml | 98 + app/views/products/_edit.html.haml | 33 + app/views/products/_new.html.haml | 35 + app/views/promotions/_detail.html.haml | 22 + app/views/promotions/_errata.html.haml | 16 + app/views/promotions/_packages.html.haml | 17 + app/views/promotions/_products.html.haml | 27 + app/views/promotions/_repos.html.haml | 17 + app/views/promotions/show.html.haml | 67 + app/views/providers/_edit.html.haml | 34 + app/views/providers/_form.html.haml | 29 + app/views/providers/_new.html.haml | 8 + app/views/providers/_products_repos.html.haml | 39 + app/views/providers/_subscriptions.html.haml | 38 + app/views/providers/index.html.haml | 15 + app/views/providers/schedule.html.haml | 4 + app/views/puppetclasses/index.html.haml | 9 + app/views/repositories/_edit.html.haml | 24 + app/views/repositories/_new.html.haml | 20 + app/views/roles/_closed_permission.html.haml | 20 + app/views/roles/_edit.html.haml | 25 + app/views/roles/_new.html.haml | 13 + app/views/roles/_permission.html.haml | 47 + app/views/roles/index.html.haml | 7 + app/views/sync_management/_products.html.haml | 75 + app/views/sync_management/index.html.haml | 12 + app/views/sync_plans/_edit.html.haml | 28 + app/views/sync_plans/_form.html.haml | 32 + app/views/sync_plans/_new.html.haml | 6 + app/views/sync_plans/index.html.haml | 13 + app/views/sync_schedules/index.html.haml | 16 + app/views/systems/_edit.html.haml | 65 + app/views/systems/_facts.html.haml | 25 + app/views/systems/_packages.html.haml | 19 + app/views/systems/_subscriptions.html.haml | 11 + app/views/systems/index.html.haml | 9 + app/views/user_sessions/new.html.haml | 19 + app/views/users/_edit.html.haml | 50 + app/views/users/_new.html.haml | 28 + app/views/users/index.html.haml | 16 + app/views/users/show.html.haml | 9 + app/views/welcome/show.html.haml | 15 + autotest/discover.rb | 2 + config.ru | 4 + config/application.rb | 56 + config/assets.yml | 111 + config/boot.rb | 13 + config/candlepin-ca.crt | 15 + config/compass.rb | 13 + config/database.yml | 30 + config/environment.rb | 7 + config/environments/development.rb | 27 + config/environments/production.rb | 49 + config/environments/test.rb | 35 + config/initializers/active_record.rb | 1 + config/initializers/active_resource.rb | 1 + config/initializers/app_config.rb | 66 + config/initializers/backtrace_silencers.rb | 7 + config/initializers/compass.rb | 7 + config/initializers/inflections.rb | 10 + config/initializers/mime_types.rb | 6 + config/initializers/secret_token.rb | 7 + config/initializers/session_store.rb | 8 + config/initializers/simple_navigation.rb | 1 + config/initializers/warden.rb | 107 + config/locales/en.yml | 181 + config/locales/fr.yml | 181 + config/locales/ja.yml | 243 + config/locales/ko.yml | 186 + config/locales/pt-BR.yml | 171 + config/locales/pt-PT.yml | 190 + config/locales/zh-CN.yml | 207 + config/locales/zh-TW.yml | 207 + config/navigation.rb | 93 + config/routes.rb | 275 + config/subsystems.yml | 1 + .../20110216102335_create_organizations.rb | 14 + .../20110216105056_create_environments.rb | 15 + .../20110216171120_add_environment_priors.rb | 12 + db/migrate/20110303031905_create_products.rb | 16 + .../20110303032320_environments_products.rb | 12 + db/migrate/20110303154949_create_providers.rb | 16 + .../20110303161104_create_changesets.rb | 14 + db/migrate/20110304121337_create_users.rb | 14 + db/migrate/20110304121603_create_roles.rb | 13 + db/migrate/20110304121750_create_verbs.rb | 13 + .../20110304121831_create_resource_types.rb | 13 + db/migrate/20110304122059_create_tags.rb | 13 + .../20110304123436_create_permissions.rb | 18 + .../20110307082628_create_permission_verb.rb | 15 + .../20110307082853_create_permission_tag.rb | 15 + db/migrate/20110307090341_create_role_user.rb | 15 + .../20110308164810_changesets_products.rb | 12 + db/migrate/20110325212617_create_help_tips.rb | 14 + .../20110331084953_add_owner_to_role.rb | 9 + db/migrate/20110405175601_create_notices.rb | 23 + db/migrate/20110414142344_create_systems.rb | 16 + .../20110427180336_changeset_packages.rb | 13 + db/migrate/20110429140623_changeset_errata.rb | 13 + .../20110506182638_create_sync_plans.rb | 17 + ...0517193547_add_changeset_promotion_date.rb | 9 + db/migrate/20110525133106_changeset_repos.rb | 13 + .../20110527155402_create_search_histories.rb | 15 + .../20110527155434_create_search_favorites.rb | 15 + .../20110602143210_add_changeset_status.rb | 11 + .../20110607191922_add_plan_to_product.rb | 9 + db/migrate/20110609101438_create_templates.rb | 20 + .../20110609190603_add_user_page_size.rb | 9 + db/products.json | 118 + db/seeds.rb | 106 + doc/README_FOR_APP | 2 + extras/bundle-config | 2 + extras/fedora/katello.completion.sh | 123 + extras/fedora/katello.init | 134 + extras/fedora/katello.logrotate | 12 + extras/fedora/katello.sysconfig | 12 + katello.spec | 168 + lib/http_resource.rb | 165 + lib/ldap.rb | 35 + lib/queue.rb | 65 + lib/resource_permissions.rb | 157 + lib/resources/candlepin.rb | 380 + lib/resources/foreman.rb | 155 + lib/resources/pulp.rb | 246 + lib/task.rb | 46 + lib/tasks/.gitkeep | 0 lib/tasks/configuration.rake | 6 + lib/tasks/hudson.rake | 15 + lib/tasks/pretty_routes.rake | 25 + lib/tasks/rcov.rake | 8 + lib/tasks/sass.rake | 6 + lib/tasks/setup-check.rake | 5 + lib/tasks/setup.rake | 4 + lib/tasks/yard.rake | 5 + lib/util/model_util.rb | 37 + lib/util/threadsession.rb | 87 + lib/util/url_matcher.rb | 104 + locale/app.pot | 1190 ++ locale/en/app.po | 1189 ++ locale/flies.xml | 17 + locale/fr/app.po | 1189 ++ locale/ja/app.po | 1231 ++ locale/ko/app.po | 1189 ++ locale/pom.xml | 35 + locale/pt-BR/app.po | 1189 ++ locale/pt-PT/app.po | 1189 ++ locale/zh-CN/app.po | 1189 ++ locale/zh-TW/app.po | 1189 ++ public/404.html | 26 + public/422.html | 26 + public/500.html | 26 + public/fakedata.html | 16 + public/favicon.ico | Bin 0 -> 90022 bytes public/fonts/LiberationSans-Bold-webfont.eot | Bin 0 -> 32630 bytes public/fonts/LiberationSans-Bold-webfont.svg | 154 + public/fonts/LiberationSans-Bold-webfont.ttf | Bin 0 -> 32428 bytes public/fonts/LiberationSans-Bold-webfont.woff | Bin 0 -> 20808 bytes .../LiberationSans-BoldItalic-webfont.eot | Bin 0 -> 36814 bytes .../LiberationSans-BoldItalic-webfont.svg | 154 + .../LiberationSans-BoldItalic-webfont.ttf | Bin 0 -> 36584 bytes .../LiberationSans-BoldItalic-webfont.woff | Bin 0 -> 23092 bytes .../fonts/LiberationSans-Italic-webfont.eot | Bin 0 -> 36382 bytes .../fonts/LiberationSans-Italic-webfont.svg | 154 + .../fonts/LiberationSans-Italic-webfont.ttf | Bin 0 -> 36172 bytes .../fonts/LiberationSans-Italic-webfont.woff | Bin 0 -> 23036 bytes .../fonts/LiberationSans-Regular-webfont.eot | Bin 0 -> 32962 bytes .../fonts/LiberationSans-Regular-webfont.svg | 154 + .../fonts/LiberationSans-Regular-webfont.ttf | Bin 0 -> 32748 bytes .../fonts/LiberationSans-Regular-webfont.woff | Bin 0 -> 20796 bytes public/fonts/Red Hat Liberation License.txt | 78 + public/fonts/demo.html | 48 + public/fonts/overpass_bold-web.eot | Bin 0 -> 32369 bytes public/fonts/overpass_bold-web.svg | 470 + public/fonts/overpass_bold-web.ttf | Bin 0 -> 63656 bytes public/fonts/overpass_bold-web.woff | Bin 0 -> 38056 bytes public/fonts/overpass_regular-web.eot | Bin 0 -> 31030 bytes public/fonts/overpass_regular-web.svg | 470 + public/fonts/overpass_regular-web.ttf | Bin 0 -> 61808 bytes public/fonts/overpass_regular-web.woff | Bin 0 -> 36352 bytes public/fonts/stylesheet.css | 52 + public/images/3rd-level-bg.png | Bin 0 -> 572 bytes public/images/960.png | Bin 0 -> 5659 bytes public/images/center-background.png | Bin 0 -> 2121 bytes public/images/footer-shade.png | Bin 0 -> 747 bytes public/images/icons/action-icons.png | Bin 0 -> 9750 bytes public/images/icons/close.png | Bin 0 -> 422 bytes public/images/icons/edit-hover.png | Bin 0 -> 531 bytes public/images/icons/edit.png | Bin 0 -> 528 bytes .../images/icons/expander-collapsed-left.png | Bin 0 -> 221 bytes public/images/icons/expander-collapsed.png | Bin 0 -> 239 bytes public/images/icons/expander-expanded.png | Bin 0 -> 240 bytes public/images/icons/favorite.png | Bin 0 -> 469 bytes public/images/icons/grabber.png | Bin 0 -> 325 bytes public/images/icons/icon_menu_arrow.gif | Bin 0 -> 56 bytes public/images/icons/icon_search.png | Bin 0 -> 449 bytes public/images/icons/info-hover.png | Bin 0 -> 357 bytes public/images/icons/info.png | Bin 0 -> 352 bytes public/images/icons/objects.png | Bin 0 -> 3252 bytes public/images/icons/recent.png | Bin 0 -> 465 bytes public/images/icons/right-arrow.png | Bin 0 -> 3159 bytes public/images/icons/status.png | Bin 0 -> 1124 bytes public/images/icons/statusicons.png | Bin 0 -> 632 bytes public/images/input-bg.png | Bin 0 -> 235 bytes public/images/katello_32x32_icon.png | Bin 0 -> 2279 bytes public/images/nav_pipe.png | Bin 0 -> 114 bytes public/images/navtab_off.png | Bin 0 -> 159 bytes public/images/navtab_on.png | Bin 0 -> 125 bytes public/images/order-asc.png | Bin 0 -> 210 bytes public/images/order-desc.png | Bin 0 -> 211 bytes public/images/outer-background.png | Bin 0 -> 371 bytes public/images/simplePassMeterSprite.png | Bin 0 -> 3328 bytes public/images/spinner.gif | Bin 0 -> 3532 bytes public/images/spinner_head.gif | Bin 0 -> 847 bytes public/images/subnav-shadow.png | Bin 0 -> 217 bytes public/images/ui.totop.png | Bin 0 -> 1734 bytes public/javascripts/application.js | 2 + public/javascripts/changeset.js | 32 + public/javascripts/changeset_edit.js | 39 + public/javascripts/content.js | 193 + public/javascripts/env_select.js | 101 + public/javascripts/environment_edit.js | 101 + public/javascripts/facebox.js | 320 + public/javascripts/html5.js | 6 + public/javascripts/jeditable_helpers.js | 83 + public/javascripts/jquery-1.5.2.js | 8374 +++++++++++ public/javascripts/jquery-1.5.2.min.js | 16 + public/javascripts/jquery-svg/blank.svg | 3 + public/javascripts/jquery-svg/custom_test.js | 67 + public/javascripts/jquery-svg/jquery.svg.css | 9 + public/javascripts/jquery-svg/jquery.svg.js | 1101 ++ .../javascripts/jquery-svg/jquery.svg.min.js | 7 + .../javascripts/jquery-svg/jquery.svg.pack.js | 7 + .../jquery-svg/jquery.svgfilter.js | 396 + .../jquery-svg/jquery.svgfilter.min.js | 7 + .../jquery-svg/jquery.svgfilter.pack.js | 7 + .../javascripts/jquery-svg/jquery.svggraph.js | 1337 ++ .../jquery-svg/jquery.svggraph.min.js | 7 + .../jquery-svg/jquery.svggraph.pack.js | 7 + public/javascripts/jquery-svg/lion.svg | 161 + public/javascripts/jquery-svg/test.js | 714 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../ui-bg_highlight-hard_75_dadada_1x100.png | Bin 0 -> 97 bytes .../ui-bg_highlight-hard_75_e6e6e6_1x100.png | Bin 0 -> 94 bytes .../ui-bg_highlight-hard_95_ffffff_1x100.png | Bin 0 -> 98 bytes .../ui-bg_highlight-soft_80_e0e0e0_1x100.png | Bin 0 -> 100 bytes .../ui-bg_inset-hard_65_ffffff_1x100.png | Bin 0 -> 93 bytes .../ui-bg_inset-soft_95_fef1ec_1x100.png | Bin 0 -> 123 bytes .../images/ui-icons_8f8f8f_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_97baed_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../custom-theme/jquery-ui-1.8.11.custom.css | 573 + .../development-bundle/AUTHORS.txt | 30 + .../development-bundle/GPL-LICENSE.txt | 278 + .../development-bundle/MIT-LICENSE.txt | 25 + .../demos/accordion/collapsible.html | 57 + .../demos/accordion/custom-icons.html | 69 + .../demos/accordion/default.html | 85 + .../demos/accordion/fillspace.html | 76 + .../demos/accordion/hoverintent.html | 134 + .../demos/accordion/index.html | 25 + .../demos/accordion/mouseover.html | 57 + .../demos/accordion/no-auto-height.html | 60 + .../demos/accordion/sortable.html | 83 + .../demos/addClass/default.html | 52 + .../demos/addClass/index.html | 18 + .../demos/animate/default.html | 61 + .../demos/animate/index.html | 18 + .../demos/autocomplete/categories.html | 71 + .../demos/autocomplete/combobox.html | 171 + .../demos/autocomplete/custom-data.html | 95 + .../demos/autocomplete/default.html | 64 + .../demos/autocomplete/folding.html | 62 + .../autocomplete/images/jquery_32x32.png | Bin 0 -> 1417 bytes .../autocomplete/images/jqueryui_32x32.png | Bin 0 -> 1193 bytes .../autocomplete/images/sizzlejs_32x32.png | Bin 0 -> 999 bytes .../autocomplete/images/transparent_1x1.png | Bin 0 -> 95 bytes .../images/ui-anim_basic_16x16.gif | Bin 0 -> 1459 bytes .../demos/autocomplete/index.html | 27 + .../demos/autocomplete/london.xml | 114 + .../demos/autocomplete/maxheight.html | 79 + .../demos/autocomplete/multiple-remote.html | 84 + .../demos/autocomplete/multiple.html | 99 + .../demos/autocomplete/remote-jsonp.html | 86 + .../demos/autocomplete/remote-with-cache.html | 59 + .../demos/autocomplete/remote.html | 59 + .../demos/autocomplete/search.php | 640 + .../demos/autocomplete/xml.html | 72 + .../demos/button/checkbox.html | 44 + .../demos/button/default.html | 38 + .../demos/button/icons.html | 56 + .../demos/button/index.html | 23 + .../demos/button/radio.html | 39 + .../demos/button/splitbutton.html | 55 + .../demos/button/toolbar.html | 120 + .../demos/datepicker/alt-field.html | 36 + .../demos/datepicker/animation.html | 58 + .../demos/datepicker/buttonbar.html | 35 + .../demos/datepicker/date-formats.html | 47 + .../demos/datepicker/date-range.html | 49 + .../demos/datepicker/default.html | 33 + .../demos/datepicker/dropdown-month-year.html | 36 + .../demos/datepicker/icon-trigger.html | 37 + .../demos/datepicker/images/calendar.gif | Bin 0 -> 269 bytes .../demos/datepicker/index.html | 31 + .../demos/datepicker/inline.html | 33 + .../demos/datepicker/localization.html | 162 + .../demos/datepicker/min-max.html | 33 + .../demos/datepicker/multiple-calendars.html | 36 + .../demos/datepicker/other-months.html | 37 + .../demos/datepicker/show-week.html | 39 + .../development-bundle/demos/demos.css | 334 + .../demos/dialog/animated.html | 56 + .../demos/dialog/default.html | 54 + .../demos/dialog/index.html | 23 + .../demos/dialog/modal-confirmation.html | 69 + .../demos/dialog/modal-form.html | 167 + .../demos/dialog/modal-message.html | 71 + .../demos/dialog/modal.html | 60 + .../demos/draggable/constrain-movement.html | 69 + .../demos/draggable/cursor-style.html | 49 + .../demos/draggable/default.html | 39 + .../demos/draggable/delay-start.html | 45 + .../demos/draggable/events.html | 77 + .../demos/draggable/handle.html | 50 + .../demos/draggable/index.html | 28 + .../demos/draggable/revert.html | 44 + .../demos/draggable/scroll.html | 51 + .../demos/draggable/snap-to.html | 68 + .../demos/draggable/sortable.html | 57 + .../demos/draggable/visual-feedback.html | 77 + .../demos/droppable/accepted-elements.html | 60 + .../demos/droppable/default.html | 53 + .../demos/droppable/images/high_tatras.jpg | Bin 0 -> 22994 bytes .../demos/droppable/images/high_tatras2.jpg | Bin 0 -> 25619 bytes .../droppable/images/high_tatras2_min.jpg | Bin 0 -> 2164 bytes .../demos/droppable/images/high_tatras3.jpg | Bin 0 -> 24583 bytes .../droppable/images/high_tatras3_min.jpg | Bin 0 -> 1901 bytes .../demos/droppable/images/high_tatras4.jpg | Bin 0 -> 24870 bytes .../droppable/images/high_tatras4_min.jpg | Bin 0 -> 2541 bytes .../droppable/images/high_tatras_min.jpg | Bin 0 -> 2147 bytes .../demos/droppable/index.html | 24 + .../demos/droppable/photo-manager.html | 184 + .../demos/droppable/propagation.html | 80 + .../demos/droppable/revert.html | 61 + .../demos/droppable/shopping-cart.html | 101 + .../demos/droppable/visual-feedback.html | 78 + .../demos/effect/default.html | 109 + .../demos/effect/easing.html | 108 + .../demos/effect/index.html | 19 + .../demos/hide/default.html | 102 + .../development-bundle/demos/hide/index.html | 18 + .../demos/images/calendar.gif | Bin 0 -> 269 bytes .../demos/images/demo-config-on-tile.gif | Bin 0 -> 172 bytes .../demos/images/demo-config-on.gif | Bin 0 -> 335 bytes .../demos/images/demo-spindown-closed.gif | Bin 0 -> 103 bytes .../demos/images/demo-spindown-open.gif | Bin 0 -> 105 bytes .../demos/images/icon-docs-info.gif | Bin 0 -> 206 bytes .../demos/images/pbar-ani.gif | Bin 0 -> 7970 bytes .../development-bundle/demos/index.html | 321 + .../demos/position/cycler.html | 122 + .../demos/position/default.html | 153 + .../demos/position/images/earth.jpg | Bin 0 -> 29850 bytes .../demos/position/images/flight.jpg | Bin 0 -> 33637 bytes .../demos/position/images/rocket.jpg | Bin 0 -> 32986 bytes .../demos/position/index.html | 19 + .../demos/progressbar/animated.html | 44 + .../demos/progressbar/default.html | 35 + .../demos/progressbar/images/pbar-ani.gif | Bin 0 -> 7970 bytes .../demos/progressbar/index.html | 20 + .../demos/progressbar/resize.html | 40 + .../demos/removeClass/default.html | 52 + .../demos/removeClass/index.html | 18 + .../demos/resizable/animate.html | 43 + .../demos/resizable/aspect-ratio.html | 42 + .../demos/resizable/constrain-area.html | 47 + .../demos/resizable/default.html | 40 + .../demos/resizable/delay-start.html | 52 + .../demos/resizable/helper.html | 43 + .../demos/resizable/index.html | 28 + .../demos/resizable/max-min.html | 45 + .../demos/resizable/snap-to-grid.html | 42 + .../demos/resizable/synchronous-resize.html | 49 + .../demos/resizable/textarea.html | 41 + .../demos/resizable/visual-feedback.html | 43 + .../demos/selectable/default.html | 50 + .../demos/selectable/display-grid.html | 55 + .../demos/selectable/index.html | 20 + .../demos/selectable/serialize.html | 61 + .../demos/show/default.html | 104 + .../development-bundle/demos/show/index.html | 18 + .../demos/slider/colorpicker.html | 95 + .../demos/slider/default.html | 37 + .../demos/slider/hotelrooms.html | 59 + .../demos/slider/index.html | 29 + .../demos/slider/multiple-vertical.html | 77 + .../demos/slider/range-vertical.html | 51 + .../demos/slider/range.html | 52 + .../demos/slider/rangemax.html | 50 + .../demos/slider/rangemin.html | 51 + .../demos/slider/side-scroll.html | 140 + .../demos/slider/slider-vertical.html | 52 + .../demos/slider/steps.html | 51 + .../development-bundle/demos/slider/tabs.html | 67 + .../sortable/connect-lists-through-tabs.html | 78 + .../demos/sortable/connect-lists.html | 58 + .../demos/sortable/default.html | 51 + .../demos/sortable/delay-start.html | 67 + .../demos/sortable/display-grid.html | 54 + .../demos/sortable/empty-lists.html | 69 + .../demos/sortable/index.html | 26 + .../demos/sortable/items.html | 70 + .../demos/sortable/placeholder.html | 56 + .../demos/sortable/portlets.html | 96 + .../demos/switchClass/default.html | 47 + .../demos/switchClass/index.html | 18 + .../development-bundle/demos/tabs/ajax.html | 53 + .../demos/tabs/ajax/content1.html | 4 + .../demos/tabs/ajax/content2.html | 4 + .../demos/tabs/ajax/content3-slow.php | 7 + .../demos/tabs/ajax/content4-broken.php | 3 + .../development-bundle/demos/tabs/bottom.html | 60 + .../demos/tabs/collapsible.html | 55 + .../development-bundle/demos/tabs/cookie.html | 56 + .../demos/tabs/default.html | 49 + .../development-bundle/demos/tabs/index.html | 25 + .../demos/tabs/manipulation.html | 124 + .../demos/tabs/mouseover.html | 53 + .../demos/tabs/sortable.html | 58 + .../demos/tabs/vertical.html | 61 + .../demos/toggle/default.html | 94 + .../demos/toggle/index.html | 18 + .../demos/toggleClass/default.html | 46 + .../demos/toggleClass/index.html | 18 + .../development-bundle/docs/accordion.html | 1017 ++ .../development-bundle/docs/addClass.html | 109 + .../development-bundle/docs/animate.html | 78 + .../development-bundle/docs/autocomplete.html | 833 ++ .../development-bundle/docs/button.html | 500 + .../development-bundle/docs/datepicker.html | 2570 ++++ .../development-bundle/docs/dialog.html | 1698 +++ .../development-bundle/docs/draggable.html | 1577 +++ .../development-bundle/docs/droppable.html | 829 ++ .../development-bundle/docs/effect.html | 143 + .../development-bundle/docs/hide.html | 144 + .../development-bundle/docs/position.html | 227 + .../development-bundle/docs/progressbar.html | 460 + .../development-bundle/docs/removeClass.html | 113 + .../development-bundle/docs/resizable.html | 1201 ++ .../development-bundle/docs/selectable.html | 848 ++ .../development-bundle/docs/show.html | 144 + .../development-bundle/docs/slider.html | 860 ++ .../development-bundle/docs/sortable.html | 1952 +++ .../development-bundle/docs/switchClass.html | 129 + .../development-bundle/docs/tabs.html | 1549 +++ .../development-bundle/docs/toggle.html | 144 + .../development-bundle/docs/toggleClass.html | 111 + .../external/jquery.bgiframe-2.1.2.js | 39 + .../external/jquery.cookie.js | 89 + .../external/jquery.metadata.js | 122 + .../development-bundle/external/qunit.css | 153 + .../development-bundle/external/qunit.js | 1261 ++ .../development-bundle/jquery-1.5.1.js | 8316 +++++++++++ .../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 .../base/images/ui-icons_222222_256x240.png | Bin 0 -> 4369 bytes .../base/images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4369 bytes .../base/images/ui-icons_454545_256x240.png | Bin 0 -> 4369 bytes .../base/images/ui-icons_888888_256x240.png | Bin 0 -> 4369 bytes .../base/images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../themes/base/jquery.ui.accordion.css | 19 + .../themes/base/jquery.ui.all.css | 11 + .../themes/base/jquery.ui.autocomplete.css | 53 + .../themes/base/jquery.ui.base.css | 11 + .../themes/base/jquery.ui.button.css | 38 + .../themes/base/jquery.ui.core.css | 41 + .../themes/base/jquery.ui.datepicker.css | 68 + .../themes/base/jquery.ui.dialog.css | 21 + .../themes/base/jquery.ui.progressbar.css | 11 + .../themes/base/jquery.ui.resizable.css | 20 + .../themes/base/jquery.ui.selectable.css | 10 + .../themes/base/jquery.ui.slider.css | 24 + .../themes/base/jquery.ui.tabs.css | 18 + .../themes/base/jquery.ui.theme.css | 252 + .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_75_ffffff_40x100.png | Bin 0 -> 178 bytes .../ui-bg_highlight-hard_75_dadada_1x100.png | Bin 0 -> 97 bytes .../ui-bg_highlight-hard_75_e6e6e6_1x100.png | Bin 0 -> 94 bytes .../ui-bg_highlight-hard_95_ffffff_1x100.png | Bin 0 -> 98 bytes .../ui-bg_highlight-soft_80_e0e0e0_1x100.png | Bin 0 -> 100 bytes .../ui-bg_inset-hard_65_ffffff_1x100.png | Bin 0 -> 93 bytes .../ui-bg_inset-soft_95_fef1ec_1x100.png | Bin 0 -> 123 bytes .../images/ui-icons_8f8f8f_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_97baed_256x240.png | Bin 0 -> 4369 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4369 bytes .../custom-theme/jquery-ui-1.8.11.custom.css | 573 + .../custom-theme/jquery.ui.accordion.css | 19 + .../themes/custom-theme/jquery.ui.all.css | 11 + .../custom-theme/jquery.ui.autocomplete.css | 53 + .../themes/custom-theme/jquery.ui.base.css | 11 + .../themes/custom-theme/jquery.ui.button.css | 38 + .../themes/custom-theme/jquery.ui.core.css | 41 + .../custom-theme/jquery.ui.datepicker.css | 68 + .../themes/custom-theme/jquery.ui.dialog.css | 21 + .../custom-theme/jquery.ui.progressbar.css | 11 + .../custom-theme/jquery.ui.resizable.css | 20 + .../custom-theme/jquery.ui.selectable.css | 10 + .../themes/custom-theme/jquery.ui.slider.css | 24 + .../themes/custom-theme/jquery.ui.tabs.css | 18 + .../themes/custom-theme/jquery.ui.theme.css | 254 + .../ui/i18n/jquery-ui-i18n.js | 1379 ++ .../ui/i18n/jquery.ui.datepicker-af.js | 23 + .../ui/i18n/jquery.ui.datepicker-ar-DZ.js | 23 + .../ui/i18n/jquery.ui.datepicker-ar.js | 23 + .../ui/i18n/jquery.ui.datepicker-az.js | 23 + .../ui/i18n/jquery.ui.datepicker-bg.js | 24 + .../ui/i18n/jquery.ui.datepicker-bs.js | 23 + .../ui/i18n/jquery.ui.datepicker-ca.js | 23 + .../ui/i18n/jquery.ui.datepicker-cs.js | 23 + .../ui/i18n/jquery.ui.datepicker-da.js | 23 + .../ui/i18n/jquery.ui.datepicker-de.js | 23 + .../ui/i18n/jquery.ui.datepicker-el.js | 23 + .../ui/i18n/jquery.ui.datepicker-en-AU.js | 23 + .../ui/i18n/jquery.ui.datepicker-en-GB.js | 23 + .../ui/i18n/jquery.ui.datepicker-en-NZ.js | 23 + .../ui/i18n/jquery.ui.datepicker-eo.js | 23 + .../ui/i18n/jquery.ui.datepicker-es.js | 23 + .../ui/i18n/jquery.ui.datepicker-et.js | 23 + .../ui/i18n/jquery.ui.datepicker-eu.js | 23 + .../ui/i18n/jquery.ui.datepicker-fa.js | 23 + .../ui/i18n/jquery.ui.datepicker-fi.js | 23 + .../ui/i18n/jquery.ui.datepicker-fo.js | 23 + .../ui/i18n/jquery.ui.datepicker-fr-CH.js | 23 + .../ui/i18n/jquery.ui.datepicker-fr.js | 25 + .../ui/i18n/jquery.ui.datepicker-gl.js | 23 + .../ui/i18n/jquery.ui.datepicker-he.js | 23 + .../ui/i18n/jquery.ui.datepicker-hr.js | 23 + .../ui/i18n/jquery.ui.datepicker-hu.js | 23 + .../ui/i18n/jquery.ui.datepicker-hy.js | 23 + .../ui/i18n/jquery.ui.datepicker-id.js | 23 + .../ui/i18n/jquery.ui.datepicker-is.js | 23 + .../ui/i18n/jquery.ui.datepicker-it.js | 23 + .../ui/i18n/jquery.ui.datepicker-ja.js | 23 + .../ui/i18n/jquery.ui.datepicker-ko.js | 23 + .../ui/i18n/jquery.ui.datepicker-kz.js | 23 + .../ui/i18n/jquery.ui.datepicker-lt.js | 23 + .../ui/i18n/jquery.ui.datepicker-lv.js | 23 + .../ui/i18n/jquery.ui.datepicker-ml.js | 23 + .../ui/i18n/jquery.ui.datepicker-ms.js | 23 + .../ui/i18n/jquery.ui.datepicker-nl.js | 23 + .../ui/i18n/jquery.ui.datepicker-no.js | 23 + .../ui/i18n/jquery.ui.datepicker-pl.js | 23 + .../ui/i18n/jquery.ui.datepicker-pt-BR.js | 23 + .../ui/i18n/jquery.ui.datepicker-pt.js | 22 + .../ui/i18n/jquery.ui.datepicker-rm.js | 21 + .../ui/i18n/jquery.ui.datepicker-ro.js | 26 + .../ui/i18n/jquery.ui.datepicker-ru.js | 23 + .../ui/i18n/jquery.ui.datepicker-sk.js | 23 + .../ui/i18n/jquery.ui.datepicker-sl.js | 24 + .../ui/i18n/jquery.ui.datepicker-sq.js | 23 + .../ui/i18n/jquery.ui.datepicker-sr-SR.js | 23 + .../ui/i18n/jquery.ui.datepicker-sr.js | 23 + .../ui/i18n/jquery.ui.datepicker-sv.js | 23 + .../ui/i18n/jquery.ui.datepicker-ta.js | 23 + .../ui/i18n/jquery.ui.datepicker-th.js | 23 + .../ui/i18n/jquery.ui.datepicker-tj.js | 23 + .../ui/i18n/jquery.ui.datepicker-tr.js | 23 + .../ui/i18n/jquery.ui.datepicker-uk.js | 23 + .../ui/i18n/jquery.ui.datepicker-vi.js | 23 + .../ui/i18n/jquery.ui.datepicker-zh-CN.js | 23 + .../ui/i18n/jquery.ui.datepicker-zh-HK.js | 23 + .../ui/i18n/jquery.ui.datepicker-zh-TW.js | 23 + .../ui/jquery-ui-1.8.11.custom.js | 11577 ++++++++++++++++ .../ui/jquery.effects.blind.js | 49 + .../ui/jquery.effects.bounce.js | 78 + .../ui/jquery.effects.clip.js | 54 + .../ui/jquery.effects.core.js | 747 + .../ui/jquery.effects.drop.js | 50 + .../ui/jquery.effects.explode.js | 79 + .../ui/jquery.effects.fade.js | 32 + .../ui/jquery.effects.fold.js | 56 + .../ui/jquery.effects.highlight.js | 50 + .../ui/jquery.effects.pulsate.js | 51 + .../ui/jquery.effects.scale.js | 178 + .../ui/jquery.effects.shake.js | 57 + .../ui/jquery.effects.slide.js | 50 + .../ui/jquery.effects.transfer.js | 45 + .../ui/jquery.ui.accordion.js | 611 + .../ui/jquery.ui.autocomplete.js | 612 + .../development-bundle/ui/jquery.ui.button.js | 387 + .../development-bundle/ui/jquery.ui.core.js | 308 + .../ui/jquery.ui.datepicker.js | 1773 +++ .../development-bundle/ui/jquery.ui.dialog.js | 857 ++ .../ui/jquery.ui.draggable.js | 799 ++ .../ui/jquery.ui.droppable.js | 285 + .../development-bundle/ui/jquery.ui.mouse.js | 156 + .../ui/jquery.ui.position.js | 252 + .../ui/jquery.ui.progressbar.js | 108 + .../ui/jquery.ui.resizable.js | 812 ++ .../ui/jquery.ui.selectable.js | 266 + .../development-bundle/ui/jquery.ui.slider.js | 682 + .../ui/jquery.ui.sortable.js | 1073 ++ .../development-bundle/ui/jquery.ui.tabs.js | 758 + .../development-bundle/ui/jquery.ui.widget.js | 262 + .../ui/minified/jquery.effects.blind.min.js | 14 + .../ui/minified/jquery.effects.bounce.min.js | 15 + .../ui/minified/jquery.effects.clip.min.js | 14 + .../ui/minified/jquery.effects.core.min.js | 30 + .../ui/minified/jquery.effects.drop.min.js | 14 + .../ui/minified/jquery.effects.explode.min.js | 15 + .../ui/minified/jquery.effects.fade.min.js | 13 + .../ui/minified/jquery.effects.fold.min.js | 14 + .../minified/jquery.effects.highlight.min.js | 14 + .../ui/minified/jquery.effects.pulsate.min.js | 14 + .../ui/minified/jquery.effects.scale.min.js | 20 + .../ui/minified/jquery.effects.shake.min.js | 14 + .../ui/minified/jquery.effects.slide.min.js | 14 + .../minified/jquery.effects.transfer.min.js | 14 + .../ui/minified/jquery.ui.accordion.min.js | 30 + .../ui/minified/jquery.ui.autocomplete.min.js | 32 + .../ui/minified/jquery.ui.button.min.js | 25 + .../ui/minified/jquery.ui.core.min.js | 17 + .../ui/minified/jquery.ui.datepicker.min.js | 82 + .../ui/minified/jquery.ui.dialog.min.js | 40 + .../ui/minified/jquery.ui.draggable.min.js | 50 + .../ui/minified/jquery.ui.droppable.min.js | 26 + .../ui/minified/jquery.ui.mouse.min.js | 17 + .../ui/minified/jquery.ui.position.min.js | 16 + .../ui/minified/jquery.ui.progressbar.min.js | 16 + .../ui/minified/jquery.ui.resizable.min.js | 47 + .../ui/minified/jquery.ui.selectable.min.js | 22 + .../ui/minified/jquery.ui.slider.min.js | 33 + .../ui/minified/jquery.ui.sortable.min.js | 60 + .../ui/minified/jquery.ui.tabs.min.js | 35 + .../ui/minified/jquery.ui.widget.min.js | 15 + .../development-bundle/version.txt | 1 + .../js/jquery-1.5.1.min.js | 16 + .../js/jquery-ui-1.8.11.custom.min.js | 783 ++ public/javascripts/jquery-ujs/rails.js | 291 + public/javascripts/jquery.ajaxfileupload.js | 205 + public/javascripts/jquery.ba-bbq.js | 1137 ++ public/javascripts/jquery.ba-resize.js | 246 + public/javascripts/jquery.cookie.js | 92 + public/javascripts/jquery.fancyqueries.js | 91 + public/javascripts/jquery.flash.js | 288 + public/javascripts/jquery.form.js | 815 ++ public/javascripts/jquery.hoverIntent.js | 106 + .../jquery.jeditable.ajaxupload.js | 62 + public/javascripts/jquery.jeditable.js | 547 + public/javascripts/jquery.jnotify.js | 209 + public/javascripts/jquery.linkHover.js | 89 + public/javascripts/jquery.loadmask.min.js | 10 + public/javascripts/jquery.pack.js | 11 + .../javascripts/jquery.periodicalupdater.js | 175 + public/javascripts/jquery.simplePassMeter.js | 592 + public/javascripts/jquery.sortElements.js | 75 + public/javascripts/jquery.timepickr.js | 214 + public/javascripts/jquery.timers.js | 142 + public/javascripts/jquery.treeTable.js | 221 + public/javascripts/jquery.ui.multiselect.js | 338 + public/javascripts/jquery.ui.totop.js | 58 + public/javascripts/katello.js | 154 + public/javascripts/katello_client.js | 249 + public/javascripts/login.js | 37 + public/javascripts/notices.js | 121 + public/javascripts/notices_list.js | 43 + public/javascripts/one_panel.js | 68 + public/javascripts/organization.js | 75 + public/javascripts/organization_edit.js | 35 + public/javascripts/panel.js | 384 + public/javascripts/plan.js | 90 + public/javascripts/plan_edit.js | 153 + public/javascripts/products_repos.js | 47 + public/javascripts/promotion.js | 311 + public/javascripts/provider.js | 136 + public/javascripts/provider_create.js | 21 + public/javascripts/provider_edit.js | 118 + public/javascripts/rails.js | 188 + public/javascripts/role.js | 157 + public/javascripts/role_edit.js | 42 + public/javascripts/search.js | 32 + public/javascripts/sync_schedule.js | 25 + public/javascripts/system_edit.js | 48 + public/javascripts/system_subscriptions.js | 23 + public/javascripts/systems.js | 34 + public/javascripts/user.js | 121 + public/javascripts/user_edit.js | 48 + public/robots.txt | 5 + public/stylesheets/.gitkeep | 0 public/stylesheets/facebox.css | 101 + public/stylesheets/images/add2.png | Bin 0 -> 48768 bytes public/stylesheets/images/addhost.png | Bin 0 -> 789 bytes public/stylesheets/images/addhost2.png | Bin 0 -> 47684 bytes public/stylesheets/images/bg_header.jpg | Bin 0 -> 13178 bytes public/stylesheets/images/bg_menu_big.jpg | Bin 0 -> 13136 bytes .../stylesheets/images/bg_toolbarheader.jpg | Bin 0 -> 13253 bytes public/stylesheets/images/close.png | Bin 0 -> 1219 bytes public/stylesheets/images/delete.png | Bin 0 -> 50803 bytes public/stylesheets/images/delete_white.gif | Bin 0 -> 13236 bytes public/stylesheets/images/file.gif | Bin 0 -> 110 bytes public/stylesheets/images/folder-closed.gif | Bin 0 -> 105 bytes public/stylesheets/images/folder.gif | Bin 0 -> 106 bytes public/stylesheets/images/folderClosed.gif | Bin 0 -> 13657 bytes .../images/icon_add_hardwarePool.png | Bin 0 -> 1223 bytes public/stylesheets/images/icon_add_vmpool.png | Bin 0 -> 838 bytes public/stylesheets/images/icon_addhost.gif | Bin 0 -> 13484 bytes public/stylesheets/images/icon_addstorage.gif | Bin 0 -> 14161 bytes public/stylesheets/images/icon_addstorage.png | Bin 0 -> 946 bytes public/stylesheets/images/icon_dashboard.gif | Bin 0 -> 14152 bytes public/stylesheets/images/icon_delete.gif | Bin 0 -> 13735 bytes public/stylesheets/images/icon_hdwarepool.png | Bin 0 -> 1179 bytes public/stylesheets/images/icon_help.png | Bin 0 -> 57228 bytes public/stylesheets/images/icon_menu_arrow.gif | Bin 0 -> 13133 bytes public/stylesheets/images/icon_newgroup.gif | Bin 0 -> 13501 bytes public/stylesheets/images/icon_search.png | Bin 0 -> 848 bytes .../stylesheets/images/icon_toolbar_arrow.gif | Bin 0 -> 13122 bytes .../images/icon_unassignedhost.gif | Bin 0 -> 13337 bytes public/stylesheets/images/icon_vmpool.png | Bin 0 -> 689 bytes public/stylesheets/images/image_ovirt.png | Bin 0 -> 773 bytes public/stylesheets/images/minus.gif | Bin 0 -> 905 bytes public/stylesheets/images/move.png | Bin 0 -> 351 bytes public/stylesheets/images/plus.gif | Bin 0 -> 907 bytes public/stylesheets/jquery.jnotify.css | 97 + public/stylesheets/jquery.loadmask.css | 40 + public/stylesheets/jquery.timepickr.css | 40 + public/stylesheets/jquery.treeTable.css | 43 + script/rails | 77 + script/reset-oauth | 29 + script/run_spec | 15 + .../api/distributions_controller_spec.rb | 45 + .../api/environments_controller_spec.rb | 70 + .../controllers/api/errata_controller_spec.rb | 45 + .../api/organizations_controller_spec.rb | 60 + .../api/packages_controller_spec.rb | 36 + .../api/products_controller_spec.rb | 141 + .../api/providers_controller_spec.rb | 116 + .../api/puppetclasses_controller_spec.rb | 33 + .../api/repositories_controller_spec.rb | 36 + .../application_controller_spec.rb | 128 + spec/controllers/changeset_controller_spec.rb | 82 + spec/controllers/content_controller_spec.rb | 31 + spec/controllers/dashboard_controller_spec.rb | 31 + .../environments_controller_spec.rb | 160 + spec/controllers/errata_controller_spec.rb | 17 + spec/controllers/export.zip | Bin 0 -> 200 bytes .../controllers/operations_controller_spec.rb | 31 + .../organizations_controller_spec.rb | 186 + spec/controllers/packages_controller_spec.rb | 17 + .../controllers/promotions_controller_spec.rb | 68 + spec/controllers/providers_controller_spec.rb | 58 + spec/controllers/roles_controller_spec.rb | 16 + .../sync_management_controller_spec.rb | 36 + .../controllers/sync_plans_controller_spec.rb | 145 + .../sync_schedules_controller.spec.rb | 39 + spec/controllers/systems_controller_spec.rb | 31 + spec/controllers/users_controller_spec.rb | 140 + spec/helpers/content_helper_spec.rb | 27 + spec/helpers/dashboard_helper_spec.rb | 27 + spec/helpers/environments_helper_spec.rb | 27 + spec/helpers/errata_helper_spec.rb | 27 + spec/helpers/hash_util_spec.rb | 36 + spec/helpers/locale_helper_methods.rb | 17 + spec/helpers/login_helper_methods.rb | 40 + spec/helpers/nodes_helper_spec.rb | 27 + spec/helpers/operations_helper_spec.rb | 27 + spec/helpers/organization_helper_methods.rb | 8 + spec/helpers/packages_helper_spec.rb | 27 + spec/helpers/product_helper_methods.rb | 20 + spec/helpers/product_test_data.rb | 293 + spec/helpers/puppetclasses_helper_spec.rb | 27 + spec/helpers/sync_management_helper_spec.rb | 27 + spec/helpers/sync_plans_helper_spec.rb | 15 + spec/helpers/sync_schedules_helper_spec.rb | 15 + spec/helpers/systems_helper_spec.rb | 27 + spec/helpers/users_helper_spec.rb | 27 + spec/lib/url_matcher_spec.rb | 53 + spec/models/distribution_spec.rb | 40 + spec/models/environment_spec.rb | 177 + spec/models/errata_spec.rb | 40 + spec/models/help_tip_spec.rb | 17 + spec/models/lazy_accessor_spec.rb | 92 + spec/models/model_spec_helper.rb | 35 + spec/models/orchestration_spec.rb | 137 + spec/models/organization_spec.rb | 106 + spec/models/permission_spec.rb | 97 + spec/models/product_spec.rb | 184 + spec/models/provider_spec.rb | 212 + spec/models/resource_perm_spec.rb | 61 + spec/models/sync_plan_spec.rb | 57 + spec/models/system_spec.rb | 175 + spec/models/user_spec.rb | 47 + spec/routing/consumers_routing_spec.rb | 36 + spec/routing/environments_routing_spec.rb | 47 + spec/routing/user_session_routes_spec.rb | 29 + spec/spec_helper.rb | 53 + spec/views/content/index.html.haml_spec.rb | 17 + spec/views/dashboard/index.html.haml_spec.rb | 17 + spec/views/dashboard/show.html.haml_spec.rb | 17 + spec/views/operations/index.html.haml_spec.rb | 17 + .../sync_management/index.html.haml_spec.rb | 17 + spec/views/systems/index.html.haml_spec.rb | 17 + vendor/plugins/.gitkeep | 0 989 files changed, 124777 insertions(+) create mode 100644 .gitignore create mode 100644 .rspec create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 LICENSE create mode 100644 README create mode 100644 Rakefile create mode 100644 app/controllers/accounts_controller.rb create mode 100644 app/controllers/api/api_controller.rb create mode 100644 app/controllers/api/distributions_controller.rb create mode 100644 app/controllers/api/environments_controller.rb create mode 100644 app/controllers/api/errata_controller.rb create mode 100644 app/controllers/api/organizations_controller.rb create mode 100644 app/controllers/api/packages_controller.rb create mode 100644 app/controllers/api/ping_controller.rb create mode 100644 app/controllers/api/products_controller.rb create mode 100644 app/controllers/api/providers_controller.rb create mode 100644 app/controllers/api/proxies_controller.rb create mode 100644 app/controllers/api/puppetclasses_controller.rb create mode 100644 app/controllers/api/repositories_controller.rb create mode 100644 app/controllers/api/status_controller.rb create mode 100644 app/controllers/api/sync_controller.rb create mode 100644 app/controllers/api/systems_controller.rb create mode 100644 app/controllers/api/templates_controller.rb create mode 100644 app/controllers/application_controller.rb create mode 100644 app/controllers/auto_complete_search.rb create mode 100644 app/controllers/certificates_controller.rb create mode 100644 app/controllers/changesets_controller.rb create mode 100644 app/controllers/consumers_controller.rb create mode 100644 app/controllers/content_controller.rb create mode 100644 app/controllers/dashboard_controller.rb create mode 100644 app/controllers/entitlements_controller.rb create mode 100644 app/controllers/environments_controller.rb create mode 100644 app/controllers/errata_controller.rb create mode 100644 app/controllers/failed_authentication_controller.rb create mode 100644 app/controllers/nodes_controller.rb create mode 100644 app/controllers/notices_controller.rb create mode 100644 app/controllers/operations_controller.rb create mode 100644 app/controllers/organizations_controller.rb create mode 100644 app/controllers/packages_controller.rb create mode 100644 app/controllers/pools_controller.rb create mode 100644 app/controllers/products_controller.rb create mode 100644 app/controllers/promotions_controller.rb create mode 100644 app/controllers/providers_controller.rb create mode 100644 app/controllers/puppetclasses_controller.rb create mode 100644 app/controllers/repositories_controller.rb create mode 100644 app/controllers/roles_controller.rb create mode 100644 app/controllers/search_controller.rb create mode 100644 app/controllers/sync_management_controller.rb create mode 100644 app/controllers/sync_plans_controller.rb create mode 100644 app/controllers/sync_schedules_controller.rb create mode 100644 app/controllers/system_settings_controller.rb create mode 100644 app/controllers/systems_controller.rb create mode 100644 app/controllers/user_sessions_controller.rb create mode 100644 app/controllers/users_controller.rb create mode 100644 app/helpers/api/puppetclasses_helper.rb create mode 100644 app/helpers/application_helper.rb create mode 100644 app/helpers/content_helper.rb create mode 100644 app/helpers/dashboard_helper.rb create mode 100644 app/helpers/environments_helper.rb create mode 100644 app/helpers/errata_helper.rb create mode 100644 app/helpers/nodes_helper.rb create mode 100644 app/helpers/notices_helper.rb create mode 100644 app/helpers/operations_helper.rb create mode 100644 app/helpers/packages_helper.rb create mode 100644 app/helpers/promotions_helper.rb create mode 100644 app/helpers/puppetclasses_helper.rb create mode 100644 app/helpers/repositories_helper.rb create mode 100644 app/helpers/roles_helper.rb create mode 100644 app/helpers/search_helper.rb create mode 100644 app/helpers/sync_management_helper.rb create mode 100644 app/helpers/sync_plans_helper.rb create mode 100644 app/helpers/sync_schedules_helper.rb create mode 100644 app/helpers/systems_helper.rb create mode 100644 app/helpers/translation_helper.rb create mode 100644 app/helpers/users_helper.rb create mode 100644 app/models/authorization.rb create mode 100644 app/models/changeset.rb create mode 100644 app/models/changeset_erratum.rb create mode 100644 app/models/changeset_package.rb create mode 100644 app/models/changeset_repo.rb create mode 100644 app/models/cp_consumer_user.rb create mode 100644 app/models/errors.rb create mode 100644 app/models/glue.rb create mode 100644 app/models/glue/candlepin/consumer.rb create mode 100644 app/models/glue/candlepin/owner.rb create mode 100644 app/models/glue/candlepin/product.rb create mode 100644 app/models/glue/candlepin/product_content.rb create mode 100644 app/models/glue/provider.rb create mode 100644 app/models/glue/pulp/distribution.rb create mode 100644 app/models/glue/pulp/errata.rb create mode 100644 app/models/glue/pulp/package.rb create mode 100644 app/models/glue/pulp/repo.rb create mode 100644 app/models/glue/pulp/repos.rb create mode 100644 app/models/glue/pulp/sync.rb create mode 100644 app/models/glue/pulp/sync_status.rb create mode 100644 app/models/hash_util.rb create mode 100644 app/models/help_tip.rb create mode 100644 app/models/katello_description_format_validator.rb create mode 100644 app/models/katello_name_format_validator.rb create mode 100644 app/models/kp_environment.rb create mode 100644 app/models/lazy_accessor.rb create mode 100644 app/models/login_credential.rb create mode 100644 app/models/no_trailing_space_validator.rb create mode 100644 app/models/notice.rb create mode 100644 app/models/organization.rb create mode 100644 app/models/permission.rb create mode 100644 app/models/ping.rb create mode 100644 app/models/pool.rb create mode 100644 app/models/product.rb create mode 100644 app/models/provider.rb create mode 100644 app/models/puppetclasses.rb create mode 100644 app/models/resource_type.rb create mode 100644 app/models/role.rb create mode 100644 app/models/search_favorite.rb create mode 100644 app/models/search_history.rb create mode 100644 app/models/support.rb create mode 100644 app/models/sync_plan.rb create mode 100644 app/models/system.rb create mode 100644 app/models/system_template.rb create mode 100644 app/models/tag.rb create mode 100644 app/models/user.rb create mode 100644 app/models/user_notice.rb create mode 100644 app/models/username_validator.rb create mode 100644 app/models/verb.rb create mode 100644 app/stylesheets/_base.scss create mode 100644 app/stylesheets/_liberation.scss create mode 100755 app/stylesheets/_overpass.scss create mode 100644 app/stylesheets/_text.scss create mode 100644 app/stylesheets/fancyqueries.scss create mode 100644 app/stylesheets/grid.scss create mode 100644 app/stylesheets/ie.scss create mode 100644 app/stylesheets/katello.scss create mode 100644 app/stylesheets/print.scss create mode 100644 app/stylesheets/screen.scss create mode 100644 app/views/accounts/show.html.haml create mode 100644 app/views/changesets/_changeset.html.haml create mode 100644 app/views/changesets/_dependency_list.html.haml create mode 100644 app/views/changesets/_edit.html.haml create mode 100644 app/views/changesets/_list.html.haml create mode 100644 app/views/changesets/_name.html.haml create mode 100644 app/views/changesets/index.html.haml create mode 100644 app/views/common/403.html.haml create mode 100644 app/views/common/_common_i18n.html.haml create mode 100644 app/views/common/_edit_i18n.html.haml create mode 100644 app/views/common/_env_select.html.haml create mode 100644 app/views/common/_helptip.html.haml create mode 100644 app/views/common/_helptip_button.html.haml create mode 100644 app/views/common/_list_item.html.haml create mode 100644 app/views/common/_list_items.html.haml create mode 100644 app/views/common/_list_remove.js.haml create mode 100644 app/views/common/_list_update.html.haml create mode 100644 app/views/common/_one_panel.html.haml create mode 100644 app/views/common/_one_panel_list_item.haml create mode 100644 app/views/common/_panel.html.haml create mode 100644 app/views/common/_search.html.haml create mode 100644 app/views/consumers/export_status.html.haml create mode 100644 app/views/content/index.html.haml create mode 100644 app/views/dashboard/index.html.haml create mode 100644 app/views/environments/_edit.html.haml create mode 100644 app/views/environments/_new.html.haml create mode 100644 app/views/errata/_packages.html.haml create mode 100644 app/views/errata/_show.html.haml create mode 100644 app/views/layouts/_ajax_notices.haml create mode 100644 app/views/layouts/_footer.haml create mode 100644 app/views/layouts/_header.haml create mode 100644 app/views/layouts/_notification.haml create mode 100644 app/views/layouts/_org.haml create mode 100644 app/views/layouts/katello.haml create mode 100644 app/views/nodes/_list.html.haml create mode 100644 app/views/nodes/index.html.haml create mode 100644 app/views/nodes/show.html.haml create mode 100644 app/views/notices/show.html.haml create mode 100644 app/views/operations/index.html.haml create mode 100644 app/views/organizations/_edit.html.haml create mode 100644 app/views/organizations/_new.html.haml create mode 100644 app/views/organizations/index.html.haml create mode 100644 app/views/owners/import_status.html.haml create mode 100644 app/views/packages/_changelog.html.haml create mode 100644 app/views/packages/_dependencies.html.haml create mode 100644 app/views/packages/_filelist.html.haml create mode 100644 app/views/packages/_show.html.haml create mode 100644 app/views/products/_edit.html.haml create mode 100644 app/views/products/_new.html.haml create mode 100644 app/views/promotions/_detail.html.haml create mode 100644 app/views/promotions/_errata.html.haml create mode 100644 app/views/promotions/_packages.html.haml create mode 100644 app/views/promotions/_products.html.haml create mode 100644 app/views/promotions/_repos.html.haml create mode 100644 app/views/promotions/show.html.haml create mode 100644 app/views/providers/_edit.html.haml create mode 100644 app/views/providers/_form.html.haml create mode 100644 app/views/providers/_new.html.haml create mode 100644 app/views/providers/_products_repos.html.haml create mode 100644 app/views/providers/_subscriptions.html.haml create mode 100644 app/views/providers/index.html.haml create mode 100644 app/views/providers/schedule.html.haml create mode 100644 app/views/puppetclasses/index.html.haml create mode 100644 app/views/repositories/_edit.html.haml create mode 100644 app/views/repositories/_new.html.haml create mode 100644 app/views/roles/_closed_permission.html.haml create mode 100644 app/views/roles/_edit.html.haml create mode 100644 app/views/roles/_new.html.haml create mode 100644 app/views/roles/_permission.html.haml create mode 100644 app/views/roles/index.html.haml create mode 100644 app/views/sync_management/_products.html.haml create mode 100644 app/views/sync_management/index.html.haml create mode 100644 app/views/sync_plans/_edit.html.haml create mode 100644 app/views/sync_plans/_form.html.haml create mode 100644 app/views/sync_plans/_new.html.haml create mode 100644 app/views/sync_plans/index.html.haml create mode 100644 app/views/sync_schedules/index.html.haml create mode 100644 app/views/systems/_edit.html.haml create mode 100644 app/views/systems/_facts.html.haml create mode 100644 app/views/systems/_packages.html.haml create mode 100644 app/views/systems/_subscriptions.html.haml create mode 100644 app/views/systems/index.html.haml create mode 100644 app/views/user_sessions/new.html.haml create mode 100644 app/views/users/_edit.html.haml create mode 100644 app/views/users/_new.html.haml create mode 100644 app/views/users/index.html.haml create mode 100644 app/views/users/show.html.haml create mode 100644 app/views/welcome/show.html.haml create mode 100644 autotest/discover.rb create mode 100644 config.ru create mode 100644 config/application.rb create mode 100644 config/assets.yml create mode 100644 config/boot.rb create mode 100644 config/candlepin-ca.crt create mode 100644 config/compass.rb create mode 100644 config/database.yml create mode 100644 config/environment.rb create mode 100644 config/environments/development.rb create mode 100644 config/environments/production.rb create mode 100644 config/environments/test.rb create mode 100644 config/initializers/active_record.rb create mode 100644 config/initializers/active_resource.rb create mode 100644 config/initializers/app_config.rb create mode 100644 config/initializers/backtrace_silencers.rb create mode 100644 config/initializers/compass.rb create mode 100644 config/initializers/inflections.rb create mode 100644 config/initializers/mime_types.rb create mode 100644 config/initializers/secret_token.rb create mode 100644 config/initializers/session_store.rb create mode 100644 config/initializers/simple_navigation.rb create mode 100644 config/initializers/warden.rb create mode 100644 config/locales/en.yml create mode 100644 config/locales/fr.yml create mode 100644 config/locales/ja.yml create mode 100644 config/locales/ko.yml create mode 100644 config/locales/pt-BR.yml create mode 100644 config/locales/pt-PT.yml create mode 100644 config/locales/zh-CN.yml create mode 100644 config/locales/zh-TW.yml create mode 100644 config/navigation.rb create mode 100644 config/routes.rb create mode 100644 config/subsystems.yml create mode 100644 db/migrate/20110216102335_create_organizations.rb create mode 100644 db/migrate/20110216105056_create_environments.rb create mode 100644 db/migrate/20110216171120_add_environment_priors.rb create mode 100644 db/migrate/20110303031905_create_products.rb create mode 100644 db/migrate/20110303032320_environments_products.rb create mode 100644 db/migrate/20110303154949_create_providers.rb create mode 100644 db/migrate/20110303161104_create_changesets.rb create mode 100644 db/migrate/20110304121337_create_users.rb create mode 100644 db/migrate/20110304121603_create_roles.rb create mode 100644 db/migrate/20110304121750_create_verbs.rb create mode 100644 db/migrate/20110304121831_create_resource_types.rb create mode 100644 db/migrate/20110304122059_create_tags.rb create mode 100644 db/migrate/20110304123436_create_permissions.rb create mode 100644 db/migrate/20110307082628_create_permission_verb.rb create mode 100644 db/migrate/20110307082853_create_permission_tag.rb create mode 100644 db/migrate/20110307090341_create_role_user.rb create mode 100644 db/migrate/20110308164810_changesets_products.rb create mode 100644 db/migrate/20110325212617_create_help_tips.rb create mode 100644 db/migrate/20110331084953_add_owner_to_role.rb create mode 100644 db/migrate/20110405175601_create_notices.rb create mode 100644 db/migrate/20110414142344_create_systems.rb create mode 100644 db/migrate/20110427180336_changeset_packages.rb create mode 100644 db/migrate/20110429140623_changeset_errata.rb create mode 100644 db/migrate/20110506182638_create_sync_plans.rb create mode 100644 db/migrate/20110517193547_add_changeset_promotion_date.rb create mode 100644 db/migrate/20110525133106_changeset_repos.rb create mode 100644 db/migrate/20110527155402_create_search_histories.rb create mode 100644 db/migrate/20110527155434_create_search_favorites.rb create mode 100644 db/migrate/20110602143210_add_changeset_status.rb create mode 100644 db/migrate/20110607191922_add_plan_to_product.rb create mode 100644 db/migrate/20110609101438_create_templates.rb create mode 100644 db/migrate/20110609190603_add_user_page_size.rb create mode 100644 db/products.json create mode 100644 db/seeds.rb create mode 100644 doc/README_FOR_APP create mode 100644 extras/bundle-config create mode 100644 extras/fedora/katello.completion.sh create mode 100755 extras/fedora/katello.init create mode 100644 extras/fedora/katello.logrotate create mode 100644 extras/fedora/katello.sysconfig create mode 100644 katello.spec create mode 100644 lib/http_resource.rb create mode 100644 lib/ldap.rb create mode 100644 lib/queue.rb create mode 100644 lib/resource_permissions.rb create mode 100644 lib/resources/candlepin.rb create mode 100644 lib/resources/foreman.rb create mode 100644 lib/resources/pulp.rb create mode 100644 lib/task.rb create mode 100644 lib/tasks/.gitkeep create mode 100644 lib/tasks/configuration.rake create mode 100644 lib/tasks/hudson.rake create mode 100644 lib/tasks/pretty_routes.rake create mode 100644 lib/tasks/rcov.rake create mode 100644 lib/tasks/sass.rake create mode 100644 lib/tasks/setup-check.rake create mode 100644 lib/tasks/setup.rake create mode 100644 lib/tasks/yard.rake create mode 100644 lib/util/model_util.rb create mode 100644 lib/util/threadsession.rb create mode 100644 lib/util/url_matcher.rb create mode 100644 locale/app.pot create mode 100644 locale/en/app.po create mode 100644 locale/flies.xml create mode 100644 locale/fr/app.po create mode 100644 locale/ja/app.po create mode 100644 locale/ko/app.po create mode 100644 locale/pom.xml create mode 100644 locale/pt-BR/app.po create mode 100644 locale/pt-PT/app.po create mode 100644 locale/zh-CN/app.po create mode 100644 locale/zh-TW/app.po create mode 100644 public/404.html create mode 100644 public/422.html create mode 100644 public/500.html create mode 100644 public/fakedata.html create mode 100644 public/favicon.ico create mode 100755 public/fonts/LiberationSans-Bold-webfont.eot create mode 100755 public/fonts/LiberationSans-Bold-webfont.svg create mode 100755 public/fonts/LiberationSans-Bold-webfont.ttf create mode 100755 public/fonts/LiberationSans-Bold-webfont.woff create mode 100755 public/fonts/LiberationSans-BoldItalic-webfont.eot create mode 100755 public/fonts/LiberationSans-BoldItalic-webfont.svg create mode 100755 public/fonts/LiberationSans-BoldItalic-webfont.ttf create mode 100755 public/fonts/LiberationSans-BoldItalic-webfont.woff create mode 100755 public/fonts/LiberationSans-Italic-webfont.eot create mode 100755 public/fonts/LiberationSans-Italic-webfont.svg create mode 100755 public/fonts/LiberationSans-Italic-webfont.ttf create mode 100755 public/fonts/LiberationSans-Italic-webfont.woff create mode 100755 public/fonts/LiberationSans-Regular-webfont.eot create mode 100755 public/fonts/LiberationSans-Regular-webfont.svg create mode 100755 public/fonts/LiberationSans-Regular-webfont.ttf create mode 100755 public/fonts/LiberationSans-Regular-webfont.woff create mode 100755 public/fonts/Red Hat Liberation License.txt create mode 100755 public/fonts/demo.html create mode 100755 public/fonts/overpass_bold-web.eot create mode 100755 public/fonts/overpass_bold-web.svg create mode 100755 public/fonts/overpass_bold-web.ttf create mode 100755 public/fonts/overpass_bold-web.woff create mode 100755 public/fonts/overpass_regular-web.eot create mode 100755 public/fonts/overpass_regular-web.svg create mode 100755 public/fonts/overpass_regular-web.ttf create mode 100755 public/fonts/overpass_regular-web.woff create mode 100755 public/fonts/stylesheet.css create mode 100644 public/images/3rd-level-bg.png create mode 100644 public/images/960.png create mode 100644 public/images/center-background.png create mode 100644 public/images/footer-shade.png create mode 100644 public/images/icons/action-icons.png create mode 100644 public/images/icons/close.png create mode 100644 public/images/icons/edit-hover.png create mode 100644 public/images/icons/edit.png create mode 100644 public/images/icons/expander-collapsed-left.png create mode 100644 public/images/icons/expander-collapsed.png create mode 100644 public/images/icons/expander-expanded.png create mode 100644 public/images/icons/favorite.png create mode 100644 public/images/icons/grabber.png create mode 100644 public/images/icons/icon_menu_arrow.gif create mode 100644 public/images/icons/icon_search.png create mode 100644 public/images/icons/info-hover.png create mode 100644 public/images/icons/info.png create mode 100644 public/images/icons/objects.png create mode 100644 public/images/icons/recent.png create mode 100644 public/images/icons/right-arrow.png create mode 100644 public/images/icons/status.png create mode 100644 public/images/icons/statusicons.png create mode 100644 public/images/input-bg.png create mode 100644 public/images/katello_32x32_icon.png create mode 100644 public/images/nav_pipe.png create mode 100644 public/images/navtab_off.png create mode 100644 public/images/navtab_on.png create mode 100644 public/images/order-asc.png create mode 100644 public/images/order-desc.png create mode 100644 public/images/outer-background.png create mode 100644 public/images/simplePassMeterSprite.png create mode 100644 public/images/spinner.gif create mode 100644 public/images/spinner_head.gif create mode 100644 public/images/subnav-shadow.png create mode 100644 public/images/ui.totop.png create mode 100644 public/javascripts/application.js create mode 100644 public/javascripts/changeset.js create mode 100644 public/javascripts/changeset_edit.js create mode 100644 public/javascripts/content.js create mode 100644 public/javascripts/env_select.js create mode 100644 public/javascripts/environment_edit.js create mode 100644 public/javascripts/facebox.js create mode 100644 public/javascripts/html5.js create mode 100644 public/javascripts/jeditable_helpers.js create mode 100644 public/javascripts/jquery-1.5.2.js create mode 100644 public/javascripts/jquery-1.5.2.min.js create mode 100644 public/javascripts/jquery-svg/blank.svg create mode 100644 public/javascripts/jquery-svg/custom_test.js create mode 100644 public/javascripts/jquery-svg/jquery.svg.css create mode 100644 public/javascripts/jquery-svg/jquery.svg.js create mode 100644 public/javascripts/jquery-svg/jquery.svg.min.js create mode 100644 public/javascripts/jquery-svg/jquery.svg.pack.js create mode 100644 public/javascripts/jquery-svg/jquery.svgfilter.js create mode 100644 public/javascripts/jquery-svg/jquery.svgfilter.min.js create mode 100644 public/javascripts/jquery-svg/jquery.svgfilter.pack.js create mode 100644 public/javascripts/jquery-svg/jquery.svggraph.js create mode 100644 public/javascripts/jquery-svg/jquery.svggraph.min.js create mode 100644 public/javascripts/jquery-svg/jquery.svggraph.pack.js create mode 100644 public/javascripts/jquery-svg/lion.svg create mode 100644 public/javascripts/jquery-svg/test.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-hard_75_dadada_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-hard_75_e6e6e6_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-hard_95_ffffff_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-soft_80_e0e0e0_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_inset-hard_65_ffffff_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_inset-soft_95_fef1ec_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-icons_8f8f8f_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-icons_97baed_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-icons_cd0a0a_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/jquery-ui-1.8.11.custom.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/AUTHORS.txt create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/GPL-LICENSE.txt create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/MIT-LICENSE.txt create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/collapsible.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/custom-icons.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/fillspace.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/hoverintent.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/mouseover.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/no-auto-height.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/sortable.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/addClass/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/addClass/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/animate/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/animate/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/categories.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/combobox.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/custom-data.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/folding.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/jquery_32x32.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/jqueryui_32x32.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/sizzlejs_32x32.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/transparent_1x1.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/ui-anim_basic_16x16.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/london.xml create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/maxheight.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/multiple-remote.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/multiple.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote-jsonp.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote-with-cache.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/search.php create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/xml.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/checkbox.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/icons.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/radio.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/splitbutton.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/toolbar.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/alt-field.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/animation.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/buttonbar.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/date-formats.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/date-range.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/dropdown-month-year.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/icon-trigger.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/images/calendar.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/inline.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/localization.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/min-max.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/multiple-calendars.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/other-months.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/show-week.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/demos.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/animated.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-confirmation.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-form.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-message.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/constrain-movement.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/cursor-style.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/delay-start.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/events.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/handle.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/revert.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/scroll.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/snap-to.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/sortable.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/visual-feedback.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/accepted-elements.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras2.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras2_min.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras3.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras3_min.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras4.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras4_min.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras_min.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/photo-manager.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/propagation.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/revert.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/shopping-cart.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/visual-feedback.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/easing.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/hide/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/hide/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/calendar.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-config-on-tile.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-config-on.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-spindown-closed.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-spindown-open.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/icon-docs-info.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/pbar-ani.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/cycler.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/images/earth.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/images/flight.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/images/rocket.jpg create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/animated.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/images/pbar-ani.gif create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/resize.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/removeClass/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/removeClass/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/animate.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/aspect-ratio.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/constrain-area.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/delay-start.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/helper.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/max-min.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/snap-to-grid.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/synchronous-resize.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/textarea.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/visual-feedback.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/display-grid.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/serialize.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/show/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/show/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/colorpicker.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/hotelrooms.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/multiple-vertical.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/range-vertical.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/range.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/rangemax.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/rangemin.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/side-scroll.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/slider-vertical.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/steps.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/tabs.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/connect-lists-through-tabs.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/connect-lists.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/delay-start.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/display-grid.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/empty-lists.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/items.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/placeholder.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/portlets.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/switchClass/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/switchClass/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content1.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content2.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content3-slow.php create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content4-broken.php create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/bottom.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/collapsible.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/cookie.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/manipulation.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/mouseover.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/sortable.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/vertical.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggle/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggle/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggleClass/default.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggleClass/index.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/accordion.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/addClass.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/animate.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/autocomplete.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/button.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/datepicker.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/dialog.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/draggable.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/droppable.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/effect.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/hide.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/position.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/progressbar.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/removeClass.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/resizable.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/selectable.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/show.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/slider.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/sortable.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/switchClass.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/tabs.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/toggle.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/toggleClass.html create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/external/jquery.bgiframe-2.1.2.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/external/jquery.cookie.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/external/jquery.metadata.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/external/qunit.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/external/qunit.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/jquery-1.5.1.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-icons_222222_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-icons_2e83ff_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-icons_454545_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-icons_888888_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/images/ui-icons_cd0a0a_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.accordion.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.all.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.autocomplete.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.base.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.button.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.core.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.datepicker.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.dialog.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.progressbar.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.resizable.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.selectable.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.slider.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.tabs.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/base/jquery.ui.theme.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-bg_flat_75_ffffff_40x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-bg_highlight-hard_75_dadada_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-bg_highlight-hard_75_e6e6e6_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-bg_highlight-hard_95_ffffff_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-bg_highlight-soft_80_e0e0e0_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-bg_inset-hard_65_ffffff_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-bg_inset-soft_95_fef1ec_1x100.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-icons_8f8f8f_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-icons_97baed_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/images/ui-icons_cd0a0a_256x240.png create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery-ui-1.8.11.custom.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.accordion.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.all.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.autocomplete.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.base.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.button.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.core.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.datepicker.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.dialog.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.progressbar.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.resizable.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.selectable.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.slider.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.tabs.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/themes/custom-theme/jquery.ui.theme.css create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery-ui-i18n.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-af.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar-DZ.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ar.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-az.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bg.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-bs.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ca.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-cs.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-da.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-de.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-el.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-AU.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-GB.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-en-NZ.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eo.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-es.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-et.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-eu.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fa.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fi.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fo.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr-CH.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-fr.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-gl.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-he.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hr.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hu.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-hy.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-id.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-is.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-it.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ja.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ko.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-kz.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lt.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-lv.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ml.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ms.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-nl.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-no.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pl.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt-BR.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-pt.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-rm.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ro.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ru.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sk.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sl.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sq.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr-SR.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sr.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-sv.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-ta.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-th.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tj.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-uk.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-vi.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-CN.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-HK.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/i18n/jquery.ui.datepicker-zh-TW.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery-ui-1.8.11.custom.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.blind.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.bounce.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.clip.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.core.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.drop.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.explode.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.fade.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.fold.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.highlight.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.pulsate.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.scale.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.shake.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.slide.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.transfer.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.accordion.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.autocomplete.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.button.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.core.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.datepicker.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.dialog.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.draggable.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.droppable.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.mouse.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.position.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.progressbar.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.resizable.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.selectable.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.slider.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.sortable.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.tabs.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.widget.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.blind.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.bounce.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.clip.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.core.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.drop.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.explode.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.fade.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.fold.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.highlight.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.pulsate.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.scale.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.shake.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.slide.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.transfer.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.accordion.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.autocomplete.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.button.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.core.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.datepicker.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.dialog.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.draggable.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.droppable.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.mouse.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.position.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.progressbar.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.resizable.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.selectable.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.slider.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.sortable.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.tabs.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.widget.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/development-bundle/version.txt create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/js/jquery-1.5.1.min.js create mode 100644 public/javascripts/jquery-ui-1.8.11.custom/js/jquery-ui-1.8.11.custom.min.js create mode 100644 public/javascripts/jquery-ujs/rails.js create mode 100644 public/javascripts/jquery.ajaxfileupload.js create mode 100644 public/javascripts/jquery.ba-bbq.js create mode 100644 public/javascripts/jquery.ba-resize.js create mode 100644 public/javascripts/jquery.cookie.js create mode 100644 public/javascripts/jquery.fancyqueries.js create mode 100644 public/javascripts/jquery.flash.js create mode 100644 public/javascripts/jquery.form.js create mode 100644 public/javascripts/jquery.hoverIntent.js create mode 100644 public/javascripts/jquery.jeditable.ajaxupload.js create mode 100644 public/javascripts/jquery.jeditable.js create mode 100644 public/javascripts/jquery.jnotify.js create mode 100644 public/javascripts/jquery.linkHover.js create mode 100644 public/javascripts/jquery.loadmask.min.js create mode 100644 public/javascripts/jquery.pack.js create mode 100644 public/javascripts/jquery.periodicalupdater.js create mode 100644 public/javascripts/jquery.simplePassMeter.js create mode 100644 public/javascripts/jquery.sortElements.js create mode 100644 public/javascripts/jquery.timepickr.js create mode 100644 public/javascripts/jquery.timers.js create mode 100644 public/javascripts/jquery.treeTable.js create mode 100644 public/javascripts/jquery.ui.multiselect.js create mode 100644 public/javascripts/jquery.ui.totop.js create mode 100644 public/javascripts/katello.js create mode 100644 public/javascripts/katello_client.js create mode 100644 public/javascripts/login.js create mode 100644 public/javascripts/notices.js create mode 100644 public/javascripts/notices_list.js create mode 100644 public/javascripts/one_panel.js create mode 100644 public/javascripts/organization.js create mode 100644 public/javascripts/organization_edit.js create mode 100644 public/javascripts/panel.js create mode 100644 public/javascripts/plan.js create mode 100644 public/javascripts/plan_edit.js create mode 100644 public/javascripts/products_repos.js create mode 100644 public/javascripts/promotion.js create mode 100644 public/javascripts/provider.js create mode 100644 public/javascripts/provider_create.js create mode 100644 public/javascripts/provider_edit.js create mode 100644 public/javascripts/rails.js create mode 100644 public/javascripts/role.js create mode 100644 public/javascripts/role_edit.js create mode 100644 public/javascripts/search.js create mode 100644 public/javascripts/sync_schedule.js create mode 100644 public/javascripts/system_edit.js create mode 100644 public/javascripts/system_subscriptions.js create mode 100644 public/javascripts/systems.js create mode 100644 public/javascripts/user.js create mode 100644 public/javascripts/user_edit.js create mode 100644 public/robots.txt create mode 100644 public/stylesheets/.gitkeep create mode 100644 public/stylesheets/facebox.css create mode 100644 public/stylesheets/images/add2.png create mode 100644 public/stylesheets/images/addhost.png create mode 100644 public/stylesheets/images/addhost2.png create mode 100644 public/stylesheets/images/bg_header.jpg create mode 100644 public/stylesheets/images/bg_menu_big.jpg create mode 100644 public/stylesheets/images/bg_toolbarheader.jpg create mode 100644 public/stylesheets/images/close.png create mode 100644 public/stylesheets/images/delete.png create mode 100644 public/stylesheets/images/delete_white.gif create mode 100644 public/stylesheets/images/file.gif create mode 100644 public/stylesheets/images/folder-closed.gif create mode 100644 public/stylesheets/images/folder.gif create mode 100644 public/stylesheets/images/folderClosed.gif create mode 100644 public/stylesheets/images/icon_add_hardwarePool.png create mode 100644 public/stylesheets/images/icon_add_vmpool.png create mode 100644 public/stylesheets/images/icon_addhost.gif create mode 100644 public/stylesheets/images/icon_addstorage.gif create mode 100644 public/stylesheets/images/icon_addstorage.png create mode 100644 public/stylesheets/images/icon_dashboard.gif create mode 100644 public/stylesheets/images/icon_delete.gif create mode 100644 public/stylesheets/images/icon_hdwarepool.png create mode 100644 public/stylesheets/images/icon_help.png create mode 100644 public/stylesheets/images/icon_menu_arrow.gif create mode 100644 public/stylesheets/images/icon_newgroup.gif create mode 100644 public/stylesheets/images/icon_search.png create mode 100644 public/stylesheets/images/icon_toolbar_arrow.gif create mode 100644 public/stylesheets/images/icon_unassignedhost.gif create mode 100644 public/stylesheets/images/icon_vmpool.png create mode 100644 public/stylesheets/images/image_ovirt.png create mode 100644 public/stylesheets/images/minus.gif create mode 100644 public/stylesheets/images/move.png create mode 100644 public/stylesheets/images/plus.gif create mode 100644 public/stylesheets/jquery.jnotify.css create mode 100644 public/stylesheets/jquery.loadmask.css create mode 100644 public/stylesheets/jquery.timepickr.css create mode 100644 public/stylesheets/jquery.treeTable.css create mode 100755 script/rails create mode 100755 script/reset-oauth create mode 100755 script/run_spec create mode 100644 spec/controllers/api/distributions_controller_spec.rb create mode 100644 spec/controllers/api/environments_controller_spec.rb create mode 100644 spec/controllers/api/errata_controller_spec.rb create mode 100644 spec/controllers/api/organizations_controller_spec.rb create mode 100644 spec/controllers/api/packages_controller_spec.rb create mode 100644 spec/controllers/api/products_controller_spec.rb create mode 100644 spec/controllers/api/providers_controller_spec.rb create mode 100644 spec/controllers/api/puppetclasses_controller_spec.rb create mode 100644 spec/controllers/api/repositories_controller_spec.rb create mode 100644 spec/controllers/application_controller_spec.rb create mode 100644 spec/controllers/changeset_controller_spec.rb create mode 100644 spec/controllers/content_controller_spec.rb create mode 100644 spec/controllers/dashboard_controller_spec.rb create mode 100644 spec/controllers/environments_controller_spec.rb create mode 100644 spec/controllers/errata_controller_spec.rb create mode 100644 spec/controllers/export.zip create mode 100644 spec/controllers/operations_controller_spec.rb create mode 100644 spec/controllers/organizations_controller_spec.rb create mode 100644 spec/controllers/packages_controller_spec.rb create mode 100644 spec/controllers/promotions_controller_spec.rb create mode 100644 spec/controllers/providers_controller_spec.rb create mode 100644 spec/controllers/roles_controller_spec.rb create mode 100644 spec/controllers/sync_management_controller_spec.rb create mode 100644 spec/controllers/sync_plans_controller_spec.rb create mode 100644 spec/controllers/sync_schedules_controller.spec.rb create mode 100644 spec/controllers/systems_controller_spec.rb create mode 100644 spec/controllers/users_controller_spec.rb create mode 100644 spec/helpers/content_helper_spec.rb create mode 100644 spec/helpers/dashboard_helper_spec.rb create mode 100644 spec/helpers/environments_helper_spec.rb create mode 100644 spec/helpers/errata_helper_spec.rb create mode 100644 spec/helpers/hash_util_spec.rb create mode 100644 spec/helpers/locale_helper_methods.rb create mode 100644 spec/helpers/login_helper_methods.rb create mode 100644 spec/helpers/nodes_helper_spec.rb create mode 100644 spec/helpers/operations_helper_spec.rb create mode 100644 spec/helpers/organization_helper_methods.rb create mode 100644 spec/helpers/packages_helper_spec.rb create mode 100644 spec/helpers/product_helper_methods.rb create mode 100644 spec/helpers/product_test_data.rb create mode 100644 spec/helpers/puppetclasses_helper_spec.rb create mode 100644 spec/helpers/sync_management_helper_spec.rb create mode 100644 spec/helpers/sync_plans_helper_spec.rb create mode 100644 spec/helpers/sync_schedules_helper_spec.rb create mode 100644 spec/helpers/systems_helper_spec.rb create mode 100644 spec/helpers/users_helper_spec.rb create mode 100644 spec/lib/url_matcher_spec.rb create mode 100644 spec/models/distribution_spec.rb create mode 100644 spec/models/environment_spec.rb create mode 100644 spec/models/errata_spec.rb create mode 100644 spec/models/help_tip_spec.rb create mode 100644 spec/models/lazy_accessor_spec.rb create mode 100644 spec/models/model_spec_helper.rb create mode 100644 spec/models/orchestration_spec.rb create mode 100644 spec/models/organization_spec.rb create mode 100644 spec/models/permission_spec.rb create mode 100644 spec/models/product_spec.rb create mode 100644 spec/models/provider_spec.rb create mode 100644 spec/models/resource_perm_spec.rb create mode 100644 spec/models/sync_plan_spec.rb create mode 100644 spec/models/system_spec.rb create mode 100644 spec/models/user_spec.rb create mode 100644 spec/routing/consumers_routing_spec.rb create mode 100644 spec/routing/environments_routing_spec.rb create mode 100644 spec/routing/user_session_routes_spec.rb create mode 100644 spec/spec_helper.rb create mode 100644 spec/views/content/index.html.haml_spec.rb create mode 100644 spec/views/dashboard/index.html.haml_spec.rb create mode 100644 spec/views/dashboard/show.html.haml_spec.rb create mode 100644 spec/views/operations/index.html.haml_spec.rb create mode 100644 spec/views/sync_management/index.html.haml_spec.rb create mode 100644 spec/views/systems/index.html.haml_spec.rb create mode 100644 vendor/plugins/.gitkeep diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..3f3c63f1ffa --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +.bundle +db/*.sqlite3 +db/*.sqlite3-journal +log/*.log +hudson +yard +tmp +*~ +*.swp +public/stylesheets/compiled/* +config/katello.yml +.idea* +*.iml +locale/*/LC_MESSAGES +tags +.yardoc +project.vim +routes.html +routes.txt diff --git a/.rspec b/.rspec new file mode 100644 index 00000000000..53607ea52b7 --- /dev/null +++ b/.rspec @@ -0,0 +1 @@ +--colour diff --git a/Gemfile b/Gemfile new file mode 100644 index 00000000000..ee4a5de6f1f --- /dev/null +++ b/Gemfile @@ -0,0 +1,66 @@ +source 'http://repos.fedorapeople.org/repos/katello/gems/' + +gem 'rails', '3.0.5' + +gem 'json' +gem 'rest-client', :require => 'rest_client' +gem 'jammit' +gem 'sqlite3', :require => 'sqlite3' +gem 'pg' +# gem 'bson_ext', '>= 1.0.4' +gem 'rails_warden' +gem 'net-ldap' +gem 'oauth' + +# Stuff for view/display/frontend +gem 'haml', '>= 3.0.16' +gem 'haml-rails' +gem 'compass', '>= 0.10.5' +gem 'compass-960-plugin', '>= 0.10.0' +gem 'simple-navigation', '3.1.0' +gem 'scoped_search', '>= 2.3.0' +# Stuff for i18n +gem 'gettext_i18n_rails' +gem 'i18n_data', '>= 0.2.6', :require => 'i18n_data' + +# Bundle edge Rails instead: +# gem 'rails', :git => 'git://github.com/rails/rails.git' + +# Use unicorn as the web server +# gem 'unicorn' + +# Deploy with Capistrano +gem 'capistrano' + + +# Bundle the extra gems: +# gem 'bj' +# gem 'nokogiri', '>=1.4.1' +# gem 'aws-s3', :require => 'aws/s3' + +# Bundle gems for the local environment. Make sure to +# put test-only gems in this group so their generators +# and rake tasks are available in development mode: +# group :development, :test do +# gem 'webrat' +# end + +group :test, :development do + # To use debugger + gem 'ruby-debug' + gem 'ZenTest', '>= 4.4.0' + gem 'rspec-rails', '>= 2.0.0' + gem 'autotest-rails', '>= 4.1.0' + gem 'rcov', '>= 0.9.9' + + #needed for documentation + gem 'yard', '>= 0.5.3' + + #needed by hudson + gem 'ci_reporter','>= 1.6.3' + gem 'gettext', '>= 1.9.3', :require => false + gem 'ruby_parser' + gem 'jasmine' + + #needed for unit tests +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 00000000000..fae0a932f83 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,196 @@ +GEM + remote: http://repos.fedorapeople.org/repos/katello/gems/ + specs: + ZenTest (4.5.0) + abstract (1.0.0) + actionmailer (3.0.5) + actionpack (= 3.0.5) + mail (~> 2.2.15) + actionpack (3.0.5) + activemodel (= 3.0.5) + activesupport (= 3.0.5) + builder (~> 2.1.2) + erubis (~> 2.6.6) + i18n (~> 0.4) + multimap (>= 1.1.2) + rack (>= 1.1.0) + rack-mount (>= 0.6.13) + rack-test (>= 0.5.4) + regin (>= 0.3.7) + tzinfo (~> 0.3.23) + activemodel (3.0.5) + activesupport (= 3.0.5) + builder (~> 2.1.2) + i18n (~> 0.4) + activerecord (3.0.5) + activemodel (= 3.0.5) + activesupport (= 3.0.5) + arel (~> 2.0.2) + tzinfo (~> 0.3.23) + activeresource (3.0.5) + activemodel (= 3.0.5) + activesupport (= 3.0.5) + activesupport (3.0.5) + arel (2.0.10) + autotest-rails (4.1.0) + ZenTest + builder (2.1.2) + capistrano (2.5.19) + highline + net-scp (>= 1.0.0) + net-sftp (>= 2.0.0) + net-ssh (>= 2.0.14) + net-ssh-gateway (>= 1.0.0) + ci_reporter (1.6.4) + builder (>= 2.1.2) + closure-compiler (0.3.3) + columnize (0.3.2) + compass (0.10.6) + haml (>= 3.0.4) + compass-960-plugin (0.10.0) + compass (>= 0.10.0) + diff-lcs (1.1.2) + erubis (2.6.6) + abstract (>= 1.0.0) + fast_gettext (0.5.10) + gettext (2.1.0) + locale (>= 2.0.5) + gettext_i18n_rails (0.2.13) + fast_gettext + haml (3.0.25) + haml-rails (0.3.4) + actionpack (~> 3.0) + activesupport (~> 3.0) + haml (~> 3.0) + railties (~> 3.0) + highline (1.6.1) + i18n (0.6.0) + i18n_data (0.2.7) + activesupport + jammit (0.5.4) + closure-compiler (>= 0.1.0) + yui-compressor (>= 0.9.1) + jasmine (1.0.1.1) + json_pure (>= 1.4.3) + rack (>= 1.0.0) + rake (>= 0.8.7) + rspec (>= 1.1.5) + selenium-client (>= 1.2.17) + selenium-rc (>= 2.1.0) + json (1.4.6) + json_pure (1.4.3) + linecache (0.43) + locale (2.0.5) + mail (2.2.19) + activesupport (>= 2.3.6) + i18n (>= 0.4.0) + mime-types (~> 1.16) + treetop (~> 1.4.8) + mime-types (1.16) + multimap (1.1.2) + net-ldap (0.1.1) + net-scp (1.0.4) + net-ssh (>= 1.99.1) + net-sftp (2.0.5) + net-ssh (>= 2.0.9) + net-ssh (2.0.23) + net-ssh-gateway (1.0.1) + net-ssh (>= 1.99.1) + oauth (0.4.4) + pg (0.10.1) + polyglot (0.3.1) + rack (1.3.0) + rack-mount (0.8.1) + rack (>= 1.0.0) + rack-test (0.6.0) + rack (>= 1.0) + rails (3.0.5) + actionmailer (= 3.0.5) + actionpack (= 3.0.5) + activerecord (= 3.0.5) + activeresource (= 3.0.5) + activesupport (= 3.0.5) + bundler (~> 1.0) + railties (= 3.0.5) + rails_warden (0.5.2) + warden + railties (3.0.5) + actionpack (= 3.0.5) + activesupport (= 3.0.5) + rake (>= 0.8.7) + thor (~> 0.14.4) + rake (0.9.2) + rcov (0.9.9) + regin (0.3.8) + rest-client (1.6.1) + mime-types (>= 1.16) + rspec (2.5.0) + rspec-core (~> 2.5.0) + rspec-expectations (~> 2.5.0) + rspec-mocks (~> 2.5.0) + rspec-core (2.5.1) + rspec-expectations (2.5.0) + diff-lcs (~> 1.1.2) + rspec-mocks (2.5.0) + rspec-rails (2.5.0) + actionpack (~> 3.0) + activesupport (~> 3.0) + railties (~> 3.0) + rspec (~> 2.5.0) + ruby-debug (0.10.4) + columnize (>= 0.1) + ruby-debug-base (~> 0.10.4.0) + ruby-debug-base (0.10.4) + linecache (>= 0.3) + ruby_parser (2.0.6) + sexp_processor (~> 3.0) + scoped_search (2.3.0) + activerecord (>= 2.1.0) + selenium-client (1.2.18) + selenium-rc (2.3.2) + selenium-client (>= 1.2.18) + sexp_processor (3.0.5) + simple-navigation (3.1.0) + activesupport (>= 2.3.2) + sqlite3 (1.3.3) + thor (0.14.6) + treetop (1.4.9) + polyglot (>= 0.2.5) + tzinfo (0.3.27) + warden (1.0.3) + rack (>= 1.0.0) + yard (0.6.4) + yui-compressor (0.9.1) + +PLATFORMS + ruby + +DEPENDENCIES + ZenTest (>= 4.4.0) + autotest-rails (>= 4.1.0) + capistrano + ci_reporter (>= 1.6.3) + compass (>= 0.10.5) + compass-960-plugin (>= 0.10.0) + gettext (>= 1.9.3) + gettext_i18n_rails + haml (>= 3.0.16) + haml-rails + i18n_data (>= 0.2.6) + jammit + jasmine + json + net-ldap + oauth + pg + rails (= 3.0.5) + rails_warden + rcov (>= 0.9.9) + rest-client + rspec-rails (>= 2.0.0) + ruby-debug + ruby_parser + scoped_search (>= 2.3.0) + simple-navigation (= 3.1.0) + sqlite3 + yard (>= 0.5.3) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000000..d159169d105 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/README b/README new file mode 100644 index 00000000000..6966fe987e9 --- /dev/null +++ b/README @@ -0,0 +1,256 @@ +== Welcome to Rails + +Rails is a web-application framework that includes everything needed to create +database-backed web applications according to the Model-View-Control pattern. + +This pattern splits the view (also called the presentation) into "dumb" +templates that are primarily responsible for inserting pre-built data in between +HTML tags. The model contains the "smart" domain objects (such as Account, +Product, Person, Post) that holds all the business logic and knows how to +persist themselves to a database. The controller handles the incoming requests +(such as Save New Account, Update Product, Show Post) by manipulating the model +and directing data to the view. + +In Rails, the model is handled by what's called an object-relational mapping +layer entitled Active Record. This layer allows you to present the data from +database rows as objects and embellish these data objects with business logic +methods. You can read more about Active Record in +link:files/vendor/rails/activerecord/README.html. + +The controller and view are handled by the Action Pack, which handles both +layers by its two parts: Action View and Action Controller. These two layers +are bundled in a single package due to their heavy interdependence. This is +unlike the relationship between the Active Record and Action Pack that is much +more separate. Each of these packages can be used independently outside of +Rails. You can read more about Action Pack in +link:files/vendor/rails/actionpack/README.html. + + +== Getting Started + +1. At the command prompt, create a new Rails application: + rails new myapp (where myapp is the application name) + +2. Change directory to myapp and start the web server: + cd myapp; rails server (run with --help for options) + +3. Go to http://localhost:3000/ and you'll see: + "Welcome aboard: You're riding Ruby on Rails!" + +4. Follow the guidelines to start developing your application. You can find +the following resources handy: + +* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html +* Ruby on Rails Tutorial Book: http://www.railstutorial.org/ + + +== Debugging Rails + +Sometimes your application goes wrong. Fortunately there are a lot of tools that +will help you debug it and get it back on the rails. + +First area to check is the application log files. Have "tail -f" commands +running on the server.log and development.log. Rails will automatically display +debugging and runtime information to these files. Debugging info will also be +shown in the browser on requests from 127.0.0.1. + +You can also log your own messages directly into the log file from your code +using the Ruby logger class from inside your controllers. Example: + + class WeblogController < ActionController::Base + def destroy + @weblog = Weblog.find(params[:id]) + @weblog.destroy + logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") + end + end + +The result will be a message in your log file along the lines of: + + Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1! + +More information on how to use the logger is at http://www.ruby-doc.org/core/ + +Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are +several books available online as well: + +* Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe) +* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide) + +These two books will bring you up to speed on the Ruby language and also on +programming in general. + + +== Debugger + +Debugger support is available through the debugger command when you start your +Mongrel or WEBrick server with --debugger. This means that you can break out of +execution at any point in the code, investigate and change the model, and then, +resume execution! You need to install ruby-debug to run the server in debugging +mode. With gems, use sudo gem install ruby-debug. Example: + + class WeblogController < ActionController::Base + def index + @posts = Post.find(:all) + debugger + end + end + +So the controller will accept the action, run the first line, then present you +with a IRB prompt in the server window. Here you can do things like: + + >> @posts.inspect + => "[#nil, "body"=>nil, "id"=>"1"}>, + #"Rails", "body"=>"Only ten..", "id"=>"2"}>]" + >> @posts.first.title = "hello from a debugger" + => "hello from a debugger" + +...and even better, you can examine how your runtime objects actually work: + + >> f = @posts.first + => #nil, "body"=>nil, "id"=>"1"}> + >> f. + Display all 152 possibilities? (y or n) + +Finally, when you're ready to resume execution, you can enter "cont". + + +== Console + +The console is a Ruby shell, which allows you to interact with your +application's domain model. Here you'll have all parts of the application +configured, just like it is when the application is running. You can inspect +domain models, change values, and save to the database. Starting the script +without arguments will launch it in the development environment. + +To start the console, run rails console from the application +directory. + +Options: + +* Passing the -s, --sandbox argument will rollback any modifications + made to the database. +* Passing an environment name as an argument will load the corresponding + environment. Example: rails console production. + +To reload your controllers and models after launching the console run +reload! + +More information about irb can be found at: +link:http://www.rubycentral.com/pickaxe/irb.html + + +== dbconsole + +You can go to the command line of your database directly through rails +dbconsole. You would be connected to the database with the credentials +defined in database.yml. Starting the script without arguments will connect you +to the development database. Passing an argument will connect you to a different +database, like rails dbconsole production. Currently works for MySQL, +PostgreSQL and SQLite 3. + +== Description of Contents + +The default directory structure of a generated Ruby on Rails application: + + |-- app + | |-- controllers + | |-- helpers + | |-- models + | `-- views + | `-- layouts + |-- config + | |-- environments + | |-- initializers + | `-- locales + |-- db + |-- doc + |-- lib + | `-- tasks + |-- log + |-- public + | |-- images + | |-- javascripts + | `-- stylesheets + |-- script + | `-- performance + |-- test + | |-- fixtures + | |-- functional + | |-- integration + | |-- performance + | `-- unit + |-- tmp + | |-- cache + | |-- pids + | |-- sessions + | `-- sockets + `-- vendor + `-- plugins + +app + Holds all the code that's specific to this particular application. + +app/controllers + Holds controllers that should be named like weblogs_controller.rb for + automated URL mapping. All controllers should descend from + ApplicationController which itself descends from ActionController::Base. + +app/models + Holds models that should be named like post.rb. Models descend from + ActiveRecord::Base by default. + +app/views + Holds the template files for the view that should be named like + weblogs/index.html.erb for the WeblogsController#index action. All views use + eRuby syntax by default. + +app/views/layouts + Holds the template files for layouts to be used with views. This models the + common header/footer method of wrapping views. In your views, define a layout + using the layout :default and create a file named default.html.erb. + Inside default.html.erb, call <% yield %> to render the view using this + layout. + +app/helpers + Holds view helpers that should be named like weblogs_helper.rb. These are + generated for you automatically when using generators for controllers. + Helpers can be used to wrap functionality for your views into methods. + +config + Configuration files for the Rails environment, the routing map, the database, + and other dependencies. + +db + Contains the database schema in schema.rb. db/migrate contains all the + sequence of Migrations for your schema. + +doc + This directory is where your application documentation will be stored when + generated using rake doc:app + +lib + Application specific libraries. Basically, any kind of custom code that + doesn't belong under controllers, models, or helpers. This directory is in + the load path. + +public + The directory available for the web server. Contains subdirectories for + images, stylesheets, and javascripts. Also contains the dispatchers and the + default HTML files. This should be set as the DOCUMENT_ROOT of your web + server. + +script + Helper scripts for automation and generation. + +test + Unit and functional tests along with fixtures. When using the rails generate + command, template test files will be generated for you and placed in this + directory. + +vendor + External libraries that the application depends on. Also includes the plugins + subdirectory. If the app has frozen rails, those gems also go here, under + vendor/rails/. This directory is in the load path. diff --git a/Rakefile b/Rakefile new file mode 100644 index 00000000000..bc0602017bd --- /dev/null +++ b/Rakefile @@ -0,0 +1,7 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. + +require File.expand_path('../config/application', __FILE__) +require 'rake' + +Src::Application.load_tasks diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb new file mode 100644 index 00000000000..0f337d60c94 --- /dev/null +++ b/app/controllers/accounts_controller.rb @@ -0,0 +1,19 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class AccountsController < ApplicationController + before_filter :require_user + + def show + end + +end \ No newline at end of file diff --git a/app/controllers/api/api_controller.rb b/app/controllers/api/api_controller.rb new file mode 100644 index 00000000000..7843d0358f1 --- /dev/null +++ b/app/controllers/api/api_controller.rb @@ -0,0 +1,114 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'util/threadsession' + +class Api::ApiController < ActionController::Base + include ActionController::HttpAuthentication::Basic + + respond_to :json + before_filter :set_locale + before_filter :require_user + + rescue_from RestClient::ExceptionWithResponse, :with => :exception_with_response + rescue_from Errors::NotFound, :with => :model_not_found + rescue_from Exception, :with => :catch_all + rescue_from ActiveRecord::RecordInvalid, :with => :invalid_record + + # support for session (thread-local) variables must be the last filter in this class + include Katello::ThreadSession::Controller + + def set_locale + hal = request.env['HTTP_ACCEPT_LANGUAGE'] + I18n.locale = hal.nil? ? 'en' : hal.scan(/^[a-z]{2}/).first + logger.debug "Setting locale: #{I18n.locale}" + end + + # override warden current_user (returns nil because there is no user in that scope) + def current_user + # get the logged user from the correct scope + user(:api) + end + + def query_params + return @query_params if @query_params + + @query_params = params.clone + @query_params.delete('controller') + @query_params.delete('action') + @query_params.delete('username') + @query_params.delete('password') + + @query_params.each_pair do |k,v| + + if v.is_a?(String) + if v.downcase == 'true' + @query_params[k] = true + elsif v.downcase == 'false' + @query_params[k] = false + end + end + end + + return @query_params + end + + def exception_with_response(exception) + logger.error "exception when talking to a remote client:" << pp_exception(exception) + render :text => pp_exception(exception) , :status => exception.http_code + end + + def model_not_found(exception) + logger.error "could not find a resource: " << pp_exception(exception) + render :text => pp_exception(exception) , :status => 404 + end + + def validation_failure(exception) + logger.error "validation failed: " << pp_exception(exception) + render :text => pp_exception(exception) , :status => 400 + end + + def invalid_record(exception) + logger.error exception.class + exception.record.errors.each_pair do |c,e| + logger.error "#{c}: #{e}" + end + render :text => pp_exception(exception), :status => 500 + end + + def catch_all(exception) + logger.error pp_exception(exception) + render :text => pp_exception(exception), :status => 500 + end + + def render_to_json(object) + if object + render :json => object.to_json and return + else + render :json => { :error => "Operation failed"}, :status => 500 + end + end + + private + + def require_user + params[:username], params[:password] = user_name_and_password(request) unless request.authorization.blank? + authenticate! :scope => :api + rescue => e + logger.error "failed to authenticate API request: " << pp_exception(e) + head :status => 500 and return false + end + + def pp_exception(exception) + "#{exception.class}: #{exception.message}\n" << exception.backtrace.join("\n") + end +end diff --git a/app/controllers/api/distributions_controller.rb b/app/controllers/api/distributions_controller.rb new file mode 100644 index 00000000000..077e6237865 --- /dev/null +++ b/app/controllers/api/distributions_controller.rb @@ -0,0 +1,28 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/pulp' + +class Api::DistributionsController < Api::ApiController + respond_to :json + + def index + repo = Glue::Pulp::Repo.find(params[:repository_id]) + render :json => repo.distributions + end + + def show + dist = Glue::Pulp::Distribution.find(params[:id]) + render :json => dist + end + +end diff --git a/app/controllers/api/environments_controller.rb b/app/controllers/api/environments_controller.rb new file mode 100644 index 00000000000..002b59f5a65 --- /dev/null +++ b/app/controllers/api/environments_controller.rb @@ -0,0 +1,71 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Api::EnvironmentsController < Api::ApiController + respond_to :json + before_filter :find_organization, :only => [:index, :show, :create, :update, :destroy, :repositories] + before_filter :find_environment, :only => [:show, :update, :destroy, :repositories] + + + def index + query_params[:organization_id] = @organization.id + + render :json => (KPEnvironment.where query_params).to_json + end + + def show + render :json => @environment + end + + def create + environment = KPEnvironment.new(params[:environment]) + @organization.environments << environment + @organization.save! + render :json => environment + end + + def update + if @environment.locker? + render :text => _("Can't update locker environment"), :status => 404 + else + @environment.update_attributes!(params[:environment]) + render :json => @environment + end + end + + def destroy + #if @environment.locker? + # render :text => _("Can't delete locker environment"), :status => 404 + #else + @environment.destroy + render :text => _("Deleted environment '#{params[:id]}'"), :status => 200 + #end + end + + def repositories + render :json => @environment.products.collect { |p| p.repos(@environment) }.flatten + end + + + def find_organization + @organization = Organization.first(:conditions => {:cp_key => params[:organization_id]}) + render :text => _("Couldn't find organization '#{params[:organization_id]}'"), :status => 404 and return if @organization.nil? + @organization + end + + def find_environment + @environment = KPEnvironment.find(params[:id]) + render :text => _("Couldn't find environment '#{params[:id]}'"), :status => 404 and return if @environment.nil? + @environment + end + +end diff --git a/app/controllers/api/errata_controller.rb b/app/controllers/api/errata_controller.rb new file mode 100644 index 00000000000..237c2264a0c --- /dev/null +++ b/app/controllers/api/errata_controller.rb @@ -0,0 +1,29 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/pulp' + +class Api::ErrataController < Api::ApiController + + respond_to :json + + def index + repo = Glue::Pulp::Repo.find(params[:repository_id]) + render :json => repo.errata + end + + def show + eratum = Glue::Pulp::Errata.find(params[:id]) + render :json => eratum + end + +end diff --git a/app/controllers/api/organizations_controller.rb b/app/controllers/api/organizations_controller.rb new file mode 100644 index 00000000000..dc1a46314f6 --- /dev/null +++ b/app/controllers/api/organizations_controller.rb @@ -0,0 +1,55 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Api::OrganizationsController < Api::ApiController + + before_filter :find_organization, :only => [:show, :update, :destroy, :products, :providers] + respond_to :json + + def index + render :json => (Organization.where query_params).to_json + end + + def show + render :json => @organization + end + + def create + render :json => Organization.create!(:name => params[:name], :description => params[:description], :cp_key => params[:name].tr(' ', '_')).to_json + end + + def update + render :json => @organization.update_attributes!(params[:organization]).to_json + end + + def products + render :json => @organization.products() and return + end + + def providers + query_params.delete(:id) + + render :json => (@organization.providers.where query_params).to_json + end + + def destroy + @organization.destroy + render :text => _("Deleted organization '#{params[:id]}'"), :status => 200 + end + + def find_organization + @organization = Organization.first(:conditions => {:cp_key => params[:id]}) + render :text => _("Couldn't find organization '#{params[:id]}'"), :status => 404 and return if @organization.nil? + @organization + end + +end diff --git a/app/controllers/api/packages_controller.rb b/app/controllers/api/packages_controller.rb new file mode 100644 index 00000000000..ef346bc2ba6 --- /dev/null +++ b/app/controllers/api/packages_controller.rb @@ -0,0 +1,29 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/pulp' + +class Api::PackagesController < Api::ApiController + + respond_to :json + + def index + packages = Pulp::Repository.packages(params[:repository_id]) + render :json => packages + end + + def show + package = Pulp::Package.find(params[:id]) + render :json => package + end + +end diff --git a/app/controllers/api/ping_controller.rb b/app/controllers/api/ping_controller.rb new file mode 100644 index 00000000000..780784006d9 --- /dev/null +++ b/app/controllers/api/ping_controller.rb @@ -0,0 +1,24 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Api::PingController < Api::ApiController + + skip_before_filter :require_user + + def index + # status backend engine calls must be done as the admin user + User.as :admin do + render :json => Ping.ping().to_json and return + end + end + +end diff --git a/app/controllers/api/products_controller.rb b/app/controllers/api/products_controller.rb new file mode 100644 index 00000000000..f4b48b97b2d --- /dev/null +++ b/app/controllers/api/products_controller.rb @@ -0,0 +1,47 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Api::ProductsController < Api::ApiController + respond_to :json + before_filter :find_organization, :only => [:index, :repositories] + before_filter :find_environment, :only => [:index, :repositories] + before_filter :find_product, :only => [:repositories] + + def index + query_params.delete(:organization_id) + query_params.delete(:environment_id) + + render :json => (@environment.products.where query_params).to_json + end + + def repositories + render :json => @product.repos(@environment) + end + + private + + def find_product + @product = Product.find_by_cp_id(params[:id]) + render(:text => _("Couldn't find product with id '#{params[:id]}'"), :status => 404) and return if @product.nil? + end + + def find_organization + @organization = Organization.first(:conditions => {:name => params[:organization_id]}) + render :text => _("Couldn't find organization '#{params[:organization_id]}'"), :status => 404 and return if @organization.nil? + @organization + end + + def find_environment + (@environment = @organization.locker) and return if params[:environment_id].nil? + @environment = KPEnvironment.find(params[:environment_id]) + end +end diff --git a/app/controllers/api/providers_controller.rb b/app/controllers/api/providers_controller.rb new file mode 100644 index 00000000000..6e17d7cba47 --- /dev/null +++ b/app/controllers/api/providers_controller.rb @@ -0,0 +1,106 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/candlepin' +require 'rest_client' + +class Api::ProvidersController < Api::ApiController + + before_filter :find_organization, :only => [:create] + before_filter :find_provider, :only => [:show, :update, :destroy, :products, :import_products, :import_manifest, :sync, :product_create] + + def index + render :json => (Provider.where query_params).to_json + end + + def show + render :json => @provider.to_json + end + + def create + provider = Provider.create!(params[:provider]) do |p| + p.organization = @organization + end + render :json => provider.to_json and return + end + + def update + @provider.update_attributes!(params[:provider]) + render :json => @provider.to_json and return + end + + def destroy + @provider.destroy + if @provider.destroyed? + render :text => _("Deleted provider '#{params[:id]}'"), :status => 200 + else + render :text => _("Error while deleting provider '#{params[:id]}'"), :status => 500 + end + end + + def products + render :json => @provider.products.to_json + end + + def import_manifest + + begin + temp_file = File.new(File.join("#{Rails.root}/tmp", "import_#{SecureRandom.hex(10)}.zip"), 'w+', 0600) + temp_file.write params[:import].read + ensure + temp_file.close + end + + @provider.import_manifest File.expand_path(temp_file.path) + render :text => "Manifest imported", :status => 200 + rescue => e + render :text => _("Manifest import for provider '#{params[:id]}' failed"), :status => 500 + end + + + def import_products + results = params[:products].collect do |p| + to_create = Product.new(p) do |product| + product.provider = @provider + product.organization = @provider.organization + end + to_create.save! + end + render :json => results.to_json + rescue => e + render :json => { :error => e.backtrace.join("\n").to_s }, :status => 500 + end + + def product_create + product_params = params[:product] + prod = @provider.add_custom_product(product_params[:name], product_params[:description], product_params[:url]) + render_to_json(prod) + end + + def sync + @provider.sync + render :text => "syncing provider: #{@provider.id}", :status => 200 + end + + private + + def find_provider + @provider = Provider.find(params[:id]) + render(:text => _("Couldn't find provider '#{params[:id]}'"), :status => 404) and return if @provider.nil? + end + + def find_organization + @organization = Organization.first(:conditions => {:cp_key => params[:organization_id]}) + render(:text => _("Couldn't find organization '#{params[:organization_id]}'"), :status => 404) and return if @organization.nil? + end + +end diff --git a/app/controllers/api/proxies_controller.rb b/app/controllers/api/proxies_controller.rb new file mode 100644 index 00000000000..74eb4c454c4 --- /dev/null +++ b/app/controllers/api/proxies_controller.rb @@ -0,0 +1,48 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/candlepin' + +class Api::ProxiesController < Api::ApiController + before_filter :proxy_request_path, :proxy_request_body + + rescue_from RestClient::Exception do |e| + Rails.logger.error e.to_s + render :text => e.http_body, :status => e.http_code, :content_type => :json + end + + def get + r = ::Candlepin::Proxy.get(@request_path) + render :text => r, :content_type => :json + end + + def delete + head ::Candlepin::Proxy.delete(@request_path).code.to_i + end + + def post + render :text => ::Candlepin::Proxy.post(@request_path, @request_body), :content_type => :json + end + + def proxy_request_path + @request_path = drop_api_namespace(@_request.fullpath) + end + + def proxy_request_body + @request_body = @_request.body + end + + def drop_api_namespace(original_request_path) + original_request_path.gsub('/api', '') + end + +end diff --git a/app/controllers/api/puppetclasses_controller.rb b/app/controllers/api/puppetclasses_controller.rb new file mode 100644 index 00000000000..96f09cecdc3 --- /dev/null +++ b/app/controllers/api/puppetclasses_controller.rb @@ -0,0 +1,23 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Api::PuppetclassesController < Api::ApiController + + def index + @klasses = Puppetclasses.all + respond_to do |format| + format.json { render :json => @klasses and return } + format.html { redirect_to puppetclasses_path and return } + end + end + +end diff --git a/app/controllers/api/repositories_controller.rb b/app/controllers/api/repositories_controller.rb new file mode 100644 index 00000000000..ab0e8b1686e --- /dev/null +++ b/app/controllers/api/repositories_controller.rb @@ -0,0 +1,48 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/pulp' + +class Api::RepositoriesController < Api::ApiController + respond_to :json + before_filter :find_repository, :only => [:show] + before_filter :find_product, :only => [:create] + + def create + # create product content in Candlepin + productContent = @product.add_new_content(params[:name], params[:url], 'yum') + # let glue layer to create repo in Pulp + @product.save + + render_to_json(productContent) + end + + def index + repos = Pulp::Repository.all + render :json => repos + end + + def show + render :json => @repository + end + + def find_repository + @repository = Pulp::Repository.find params[:id] + render :text => _("Couldn't find repository '#{params[:id]}'"), :status => 404 and return if @repository.nil? + @repository + end + + def find_product + @product = Product.find_by_cp_id params[:product_id] + render(:text => _("Couldn't find product with id '#{params[:product_id]}'"), :status => 404) and return if @product.nil? + end +end diff --git a/app/controllers/api/status_controller.rb b/app/controllers/api/status_controller.rb new file mode 100644 index 00000000000..b5686cfd195 --- /dev/null +++ b/app/controllers/api/status_controller.rb @@ -0,0 +1,28 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Api::StatusController < Api::ApiController + + skip_before_filter :require_user + + def memory + User.as :admin do + objs = Hash.new(0) + ObjectSpace.each_object do |o| + objs[o.class] += 1 + end + output = objs.sort_by{ |c,n| n }.last(30) + render :text => PP.pp(output, "") + end + end + +end diff --git a/app/controllers/api/sync_controller.rb b/app/controllers/api/sync_controller.rb new file mode 100644 index 00000000000..8861033952e --- /dev/null +++ b/app/controllers/api/sync_controller.rb @@ -0,0 +1,82 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/pulp' + +class Api::SyncController < Api::ApiController + + before_filter :find_object, :only => [:index, :show, :create, :cancel] + respond_to :json + + def index + # GET /repositories//sync/ + # list all synces + render :text => N_("list of syncs"), :status => 200 + end + + def show + # GET /repositories//sync/ + # get sync status + render :text => N_("get sync status"), :status => 200 + end + + def create + # POST /repositories//sync/ + # start syncing + @obj.sync + render :text => "synchronizing #{@sync_of}: #{@obj.id}", :status => 200 + end + + def cancel + # DELETE /repositories//sync/ + # cancel the sync action + @obj.cancel_sync + render :text => "cancelled synchronization of #{@sync_of}: #{@obj.id}", :status => 200 + end + + + + def find_provider + @provider = Provider.find(params[:provider_id]) + render(:text => N_("Couldn't find provider '#{params[:provider_id]}'"), :status => 404) and return if @provider.nil? + @provider + end + + def find_product + @product = Product.find_by_cp_id(params[:product_id]) + render(:text => _("Couldn't find product with id '#{params[:product_id]}'"), :status => 404) and return if @product.nil? + @product + end + + def find_repository + @repository = Glue::Pulp::Repo.find(params[:repository_id]) + render :text => _("Couldn't find repository '#{params[:repository_id]}'"), :status => 404 and return if @repository.nil? + @repository + end + + def find_object + if params.key?(:provider_id) + @obj = find_provider + @sync_of = 'provider' + elsif params.key?(:product_id) + @obj = find_product + @sync_of = 'product' + elsif params.key?(:repository_id) + @obj = find_repository + @sync_of = 'repository' + else + render(:text => N_("Couldn't find subject of synchronization"), :status => 404) and return if @obj.nil? + end + @obj + end + +end diff --git a/app/controllers/api/systems_controller.rb b/app/controllers/api/systems_controller.rb new file mode 100644 index 00000000000..e2ae995c510 --- /dev/null +++ b/app/controllers/api/systems_controller.rb @@ -0,0 +1,62 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Api::SystemsController < Api::ApiController + respond_to :json + + before_filter :find_organization, :only => [:index] + before_filter :find_system, :only => [:destroy, :show, :update, :regenerate_identity_certificates] + + def create + render :json => System.create!(params).to_json + end + + def regenerate_identity_certificates + @system.regenerate_identity_certificates + render :json => @system.to_json + end + + def update + # only facts can be updated atm + if params.has_key?(:facts) + @system.facts = params[:facts] + @system.save! + end + render :json => @system.to_json + end + + def index + render :json => @organization.systems.to_json + end + + def show + render :json => @system.to_json + end + + def destroy + @system.destroy + render :text => _("Deleted system '#{params[:id]}'"), :status => 204 + end + + def find_organization + @organization = Organization.first(:conditions => {:cp_key => params[:organization_id]}) + render :text => _("Couldn't find organization '#{params[:organization_id]}'"), :status => 404 and return if @organization.nil? + @organization + end + + def find_system + @system = System.first(:conditions => {:uuid => params[:id]}) + render :text => _("Couldn't find system '#{params[:id]}'"), :status => 404 and return if @system.nil? + @system + end + +end diff --git a/app/controllers/api/templates_controller.rb b/app/controllers/api/templates_controller.rb new file mode 100644 index 00000000000..64b2d45245d --- /dev/null +++ b/app/controllers/api/templates_controller.rb @@ -0,0 +1,94 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'rest_client' + +class Api::TemplatesController < Api::ApiController + + before_filter :find_environment, :only => [:create] + before_filter :find_template, :only => [:show, :promote] + + def index + templates = SystemTemplate.where query_params + render :json => templates.to_json + end + + def show + render :json => @template.to_json + end + + def create + begin + temp_file = File.new(File.join("#{Rails.root}/tmp", "template_#{SecureRandom.hex(10)}.json"), 'w+', 0600) + temp_file.write params[:template_file].read + ensure + temp_file.close + end + + @template = SystemTemplate.new(params[:template]) + @template.environment = @environment + @template.import File.expand_path(temp_file.path) + @template.save! + + render :text => _("Template imported"), :status => 200 + end + + def update + render :json => "update" + end + + def destroy + render :json => "destroy" + end + + def export + render :json => "export" + end + + def promote + @changeset = Changeset.create!(:environment => @template.environment) + + @changeset.products << @template.products + @changeset.errata << changeset_errata(@template.errata) + @changeset.packages << changeset_packages(@template.packages) + @changeset.promote + + + + render :json => "promote" + end + + def find_environment + @environment = KPEnvironment.find(params[:environment_id]) + render :text => _("Couldn't find environment '#{params[:environment_id]}'"), :status => 404 and return if @environment.nil? + @environment + end + + def find_template + @template = SystemTemplate.find(params[:id]) + render :text => _("Couldn't find template '#{params[:id]}'"), :status => 404 and return if @template.nil? + @template + end + + def changeset_errata(errata) + errata.collect do |e| + ChangesetErratum.new(:errata_id=>e.id, :display_name=>e.title, :changeset => @changeset) + end + end + + def changeset_packages(packages) + packages.collect do |p| + ChangesetPackage.new(:package_id=>p.id, :display_name=>p.name, :changeset => @changeset) + end + end + +end diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb new file mode 100644 index 00000000000..21f2a39da3f --- /dev/null +++ b/app/controllers/application_controller.rb @@ -0,0 +1,327 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'api/api_controller' +require 'util/threadsession' +require 'cgi' +require 'base64' + +class ApplicationController < ActionController::Base + layout 'katello' + helper :all + helper_method :current_organization + before_filter :set_locale + before_filter :require_user,:require_org + protect_from_forgery # See ActionController::RequestForgeryProtection for details + before_filter :authorize + after_filter :flash_to_headers + + # support for session (thread-local) variables must be the last filter in this class + include Katello::ThreadSession::Controller + + def section_id + 'generic' + end + + # Generate a notice: + # + # notice: The text to include + # options: Optional hash containing various optional parameters. This includes: + # level: The type of notice to be generated. Supported values include: + # :message, :success (Default), :warning, :error + # synchronous_request: true. if this notice is associated with an event where + # the user would expect to receive a response immediately + # as part of a response. This typically applies for events + # involving things such as create, update and delete. + # persist: true, if this notice should be stored via ActiveRecord. + # Note: this option only applies when synchronous_request is true. + # list_items: Array of items to include with the generated notice (text). If included, + # the array will be converted to a string (separated by newlines) and + # concatenated with the notice text. This is useful in scenarios where + # there are several validation errors occur from a single form submit. + # details: String containing additional details. This would typically be to store + # information such as a stack trace that is in addition to the notice text. + def notice notice, options = {} + + notice = "" if notice.nil? + + # set the defaults + level = :success + synchronous_request = true + + persist = true + global = false + details = nil + + unless options.nil? + level = options[:level] unless options[:level].nil? + synchronous_request = options[:synchronous_request] unless options[:synchronous_request].nil? + persist = options[:persist] unless options[:persist].nil? + global = options[:global] unless options[:global].nil? + details = options[:details] unless options[:details].nil? + end + + notice_dialog = build_notice notice, options[:list_items] + + notice_string = notice_dialog["notices"].join("
") + if notice_dialog.has_key?("validation_errors") + notice_string = notice_string + notice_dialog["validation_errors"].join("
") + end + + if synchronous_request + # On a sync request, the client should expect to receive a notification + # immediately without polling. In order to support this, we will send a flash + # notice. + if !details.nil? + notice_dialog["notices"].push( _("#{self.class.helpers.link_to('Click here', notices_path)} for more details.")) + end + + flash[level] = notice_dialog.to_json + + if persist + # create & store notice... but mark as 'viewed' + new_notice = Notice.create(:text => notice_string, :details => details, :level => level, :global => global, :user_notices => [UserNotice.new(:user => current_user)]) + + unless new_notice.nil? + user_notice = current_user.user_notices.where(:notice_id => new_notice.id).first + unless user_notice.nil? + user_notice.viewed = true + user_notice.save! + end + end + end + else + # On an async request, the client shouldn't expect to receive a notification + # immediately. As a result, we'll store the notification and it will be + # retrieved by the client on it's next polling interval. + # + # create & store notice... and mark as 'not viewed' + Notice.create!(:text => notice_string, :details => details, :level => level, :global => global, :user_notices => [UserNotice.new(:user => current_user)]) + end + end + + # Generate an error notice: + # + # summary: the text to include + # options: Hash containing various optional parameters. This includes: + # level: The type of notice to be generated. Supported values include: + # :message, :success (Default), :warning, :error + # synchronous_request: true. if this notice is associated with an event where + # the user would expect to receive a response immediately + # as part of a response. This typically applies for events + # involving things such as create, update and delete. + # persist: true, if this notice should be stored via ActiveRecord. + # Note: this option only applies when synchronous_request is true. + # list_items: Array of items to include with the generated notice. If included, + # the array will be converted to a string (separated by newlines) and + # concatenated with the notice text. This is useful in scenarios where + # there are several validation errors occur from a single form submit. + # details: String containing additional details. This would typically be to store + # information such as a stack trace that is in addition to the notice text. + def errors summary, options = {} + options[:level] = :error + notice summary, options + end + + def flash_to_headers + return if @_response.nil? or @_response.response_code == 302 + return unless request.xhr? + return if flash.blank? + [:error, :warning, :success, :message].each do |type| + unless flash[type].nil? or flash[type].blank? + @enc = CGI::escape(flash[type].gsub("\n","
")) + response.headers['X-Message'] = @enc + response.headers['X-Message-Type'] = type.to_s + flash.delete(type) # clear the flash + return + end + end + end + + def set_locale + I18n.locale = extract_locale_from_accept_language_header + logger.debug "Setting locale: #{I18n.locale}" + end + + def current_organization + return false unless session[:current_organization_id] + @current_org ||= Organization.find(session[:current_organization_id]) + end + + def current_organization=(org) + session[:current_organization_id] = org.try(:id) + end + + rescue_from 'Errors::SecurityViolation' do |exception| + logger.warn exception.message + #logger.debug pp_exception exception + if current_user + render_403 + else + errors _("You must be logged in to access that page."), {:persist => false} + redirect_to new_user_session_url and return false + end + end + + def escape_html input + CGI::escapeHTML(input) + end + + private + # TODO: default organization will be stored within the logged user - this method will be removed + def require_org + unless session && current_organization + logout + errors _("You must have at least one organization in your database to access that page. Might need to run 'rake db:seed'"), {:persist => false} + redirect_to new_user_session_url and return false + end + end + + + def require_user + if current_user + #user logged in + + #redirect to originally requested page + if session[:original_uri] != nil + redirect_to session[:original_uri] + session[:original_uri] = nil + end + + return true + else + #user not logged + errors _("You must be logged in to access that page."), {:persist => false} + + #save original uri and redirect to login page + session[:original_uri] = request.fullpath + redirect_to new_user_session_url and return false + end + end + + def require_no_user + if current_user + notice _("Welcome Back!") + ", " + current_user.username + redirect_to dashboard_index_url + return false + end + end + + def current_user + user + end + + # temp code to setup i18n, might want to consider looking at a rails plugin that is more robust + def extract_locale_from_accept_language_header + hal = request.env['HTTP_ACCEPT_LANGUAGE'] + hal.nil? ? 'en' : hal.scan(/^[a-z]{2}/).first + end + + # authorize the user for the requested action + def authorize(ctrl = params[:controller], action = params[:action]) + user = current_user + user = User.anonymous unless user + logger.debug "Authorizing #{current_user.username} for #{ctrl}/#{action}" + allowed = user.allowed_to?({:controller => ctrl, :action => action}) + if allowed + return true + else + raise Errors::SecurityViolation, "User #{current_user.username} is not allowed to access #{params[:controller]}/#{params[:action]}" + end + end + + # render 403 page + def render_403 + respond_to do |format| + format.html { render :template => "common/403", :layout => !request.xhr?, :status => 403 } + format.atom { head 403 } + format.xml { head 403 } + format.json { head 403 } + end + return false + end + + def retain_search_history + begin + # save the request in the user's search history + unless params[:search].nil? or params[:search].blank? + path = @_request.env['PATH_INFO'] + histories = current_user.search_histories.where(:path => path, :params => params[:search]) + if histories.nil? or histories.empty? + # user doesn't have this search stored, so save it + histories = current_user.search_histories.create!(:path => path, :params => params[:search]) + else + # user already has this search in their history, so just update the timestamp, so that it shows as most recent + histories.first.update_attribute(:updated_at, Time.now) + end + end + rescue Exception => error + Rails.logger.error error.to_s + end + end + + private + def build_notice notice, list_items + items = { "notices" => [] } + + if notice.kind_of? Array + notice.each do |item| + handle_notice_type item, items + end + elsif notice.kind_of? String + unless list_items.nil? or list_items.length == 0 + notice = notice + list_items.join("
") + end + items["notices"].push(notice) + else + handle_notice_type notice, items + end + return items + end + + private + def handle_notice_type notice, items + if notice.kind_of? ActiveRecord::RecordInvalid + items["validation_errors"] = notice.record.errors.full_messages.to_a + return items + elsif notice.kind_of? RestClient::InternalServerError + items["notices"].push(notice.response) + return items + elsif notice.kind_of? RuntimeError + items["notices"].push(notice.message) + else + items["notices"].push(notice) + end + end + + def setup_environment_selector org + @paths = [] + @paths = org.promotion_paths.collect{|tmp_path| [org.locker] + tmp_path} + @paths = [[org.locker]] if @paths.empty? + @path = @paths.first if @path.nil? + @environment = @path.first if @environment.nil? + end + + def pp_exception(exception) + "#{exception.class}: #{exception.message}\n" << exception.backtrace.join("\n") + end + + def render_panel_items(items, options) + options[:accessor] ||= "id" + options[:collection] = items + options[:columns] = options[:col] + render :partial=>"common/list_items", :locals=>options + end + + +end + diff --git a/app/controllers/auto_complete_search.rb b/app/controllers/auto_complete_search.rb new file mode 100644 index 00000000000..db4b1bf719d --- /dev/null +++ b/app/controllers/auto_complete_search.rb @@ -0,0 +1,30 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module AutoCompleteSearch + include SearchHelper + + def auto_complete_search + begin + query = "#{params[:search]}" + @items = eval(controller_name.singularize.camelize).complete_for(params[:search]) + @items = @items.map do |item| + category = (['and','or','not','has'].include?(item.to_s.sub(/^.*\s+/,''))) ? 'Operators' : '' + {:label => item, :category => category} + end + @items = [query] if @items.blank? + rescue ScopedSearch::QueryNotSupported => e + @items = [{:error =>e.to_s}] + end + render :json => @items + end +end diff --git a/app/controllers/certificates_controller.rb b/app/controllers/certificates_controller.rb new file mode 100644 index 00000000000..f7c36207629 --- /dev/null +++ b/app/controllers/certificates_controller.rb @@ -0,0 +1,26 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class CertificatesController < ApplicationController + + def index + render :text => Candlepin::Proxy.get(@_request), :content_type => :json + end + + def destroy + head Candlepin::Proxy.delete(@_request).code.to_i + end + + def serials + render :text => Candlepin::Proxy.get(@_request), :content_type => :json + end +end \ No newline at end of file diff --git a/app/controllers/changesets_controller.rb b/app/controllers/changesets_controller.rb new file mode 100644 index 00000000000..d8b2d68d64d --- /dev/null +++ b/app/controllers/changesets_controller.rb @@ -0,0 +1,194 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class ChangesetsController < ApplicationController + + before_filter :find_changeset, :except => [:index, :list, :items] + before_filter :find_environment, :except => [:index, :list, :items] + + skip_before_filter :authorize, :only => [:dependency_size, :dependency_list, :show_content] + before_filter :changeset_auth, :only=> [:dependency_size, :dependency_list, :show_content] + + skip_before_filter :authorize, :only => [:list, :edit, :show] + before_filter :index_auth, :only=>[:list, :edit, :show] + + before_filter :setup_options, :only => [:index, :items] + + + def index + setup_environment_selector(current_organization) + @changesets = @environment.changeset_history.limit(current_user.page_size) + + end + + def items + setup_environment_selector(current_organization) + start = params[:offset] + @changesets = @environment.changeset_history.limit(current_user.page_size).offset(start) + render_panel_items @changesets, @panel_options + end + + def setup_options + @panel_options = { :title => _('Changesets'), + :col => ['name'], + :enable_create => false, + :name => _('changeset'), + :accessor => :id, + :ajax_scroll => items_changesets_path()} + end + + #similar to index, but only renders the actual list of the 2 pane + def list + @environment = KPEnvironment.find(params['env_id']) + @changesets = @environment.changeset_history + @columns = ['name'] #from index + render :partial=>"list" + end + + def section_id + 'contents' + end + + + def edit + render :partial=>"edit" + end + + #list item + def show + render :partial=>"common/list_update", :locals=>{:item=>@changeset, :accessor=>"id", :columns=>['name']} + end + + def show_content + render(:partial => "changesets/changeset", :content_type => 'text/html') + end + + + def dependency_size + render :text=>@changeset.dependencies.size + end + + def dependency_list + @packages = @changeset.dependencies + render :partial=>"dependency_list" + end + + + def update + + send_changeset = params[:timestamp] && params[:timestamp] != @changeset.updated_at.to_i.to_s + + #if you are just updating the name, set it and return the new name + if params[:name] + @changeset.name = params[:name] + @changeset.save! + render :text=>params[:name] and return + end + + if params.has_key? :data + params[:data].each do |item| + adding = item["adding"] + type = item["type"] + id = item["mod_id"] #id of item being added/removed + name = item["mod_name"] #display of item being added/removed + case type + when "product" + @changeset.products << Product.where(:id => id) if adding + @changeset.products.delete Product.find(id) if !adding + when "errata" + @changeset.errata << ChangesetErratum.new(:errata_id=>id, :display_name=>name, :changeset => @changeset) if adding + ChangesetErrata.destroy_all(:errata_id =>id, :changeset_id => @changeset.id) if !adding + when "package" + @changeset.packages << ChangesetPackage.new(:package_id=>id, :display_name=>name, :changeset => @changeset) if adding + ChangesetPackage.destroy_all(:package_id =>id, :changeset_id => @changeset.id) if !adding + + when "repo" + @changeset.repos << ChangesetRepo.new(:repo_id=>id, :display_name=>name, :changeset => @changeset) if adding + ChangesetRepo.destroy_all(:repo_id =>id, :changeset_id => @changeset.id) if !adding + end + end + @changeset.updated_at = Time.now + @changeset.save! + + end + to_ret = {:timestamp=>@changeset.updated_at.to_i.to_s} + to_ret[:changeset] = changeset_simplify(@changeset) if send_changeset + render :json=>to_ret + end + + def promote + + + begin + @changeset.promote + @environment.create_changeset + + notice "promoted changeset to #{@environment.name} environment" + rescue Exception => e + errors "Failed to promote: #{e.to_s}" + logger.error $!, $!.backtrace.join("\n\t") + end + + + if @environment.successor + redirect_to(:controller=>"promotions", :action => "show", + :env_id => @environment.successor.name, :org_id => @environment.organization.cp_key) + else + redirect_to(:controller=>"promotions", :action => "show", + :env_id => @environment.name, :org_id => @environment.organization.cp_key) + end + end + + + private + + def changeset_simplify cs + to_ret = {} + [:product, :repo, :errata, :package].each{ |type| + to_ret[type] = [] + } + cs.packages.each{|pkg| + to_ret[:package] << {:id=>pkg.package_id, :name=>pkg.display_name} + } + cs.errata.each{|err| + to_ret[:errata] << {:id=>err.errata_id, :name=>err.display_name} + } + cs.products.each{|product| + to_ret[:product] << {:id=>product.id, :name=>product.name} + } + cs.repos.each{|repo| + to_ret[:repo] << {:id=>repo.repo_id, :name=>repo.display_name} + } + to_ret + end + + def find_environment + @environment = @changeset.environment + if @environment.nil? + errors _("Couldn't find environment '#{params[:environment_id]}'") + end + end + + def find_changeset + @changeset = Changeset.find(params[:id]) + end + + def changeset_auth + authorize params[:controller], :changeset + end + + def index_auth + authorize params[:controller], :index + end + + +end diff --git a/app/controllers/consumers_controller.rb b/app/controllers/consumers_controller.rb new file mode 100644 index 00000000000..48b597b867e --- /dev/null +++ b/app/controllers/consumers_controller.rb @@ -0,0 +1,31 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class ConsumersController < ApplicationController + respond_to :html, :json + + def show + render :text => Candlepin::Proxy.get(@_request), :content_type => :json + end + + def re_register + render :text => Candlepin::Proxy.post(@_request), :content_type => :json + end + + def destroy + head Candlepin::Proxy.delete(@_request).code.to_i + end + + def create + render :text => Candlepin::Proxy.post(@_request), :content_type => :json + end +end diff --git a/app/controllers/content_controller.rb b/app/controllers/content_controller.rb new file mode 100644 index 00000000000..1f044e6e0ee --- /dev/null +++ b/app/controllers/content_controller.rb @@ -0,0 +1,19 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class ContentController < ApplicationController + def index + end + def section_id + 'contents' + end +end diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb new file mode 100644 index 00000000000..08ef742b614 --- /dev/null +++ b/app/controllers/dashboard_controller.rb @@ -0,0 +1,21 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class DashboardController < ApplicationController + + def index + end + + def section_id + 'dashboard' + end +end diff --git a/app/controllers/entitlements_controller.rb b/app/controllers/entitlements_controller.rb new file mode 100644 index 00000000000..4efa8a04364 --- /dev/null +++ b/app/controllers/entitlements_controller.rb @@ -0,0 +1,26 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class EntitlementsController < ApplicationController + + def create + render :text => Candlepin::Proxy.post(@_request), :content_type => :json + end + + def index + render :text => Candlepin::Proxy.get(@_request), :content_type => :json + end + + def show + render :text => Candlepin::Proxy.get(@_request), :content_type => :json + end +end \ No newline at end of file diff --git a/app/controllers/environments_controller.rb b/app/controllers/environments_controller.rb new file mode 100644 index 00000000000..3c36d9ae3dd --- /dev/null +++ b/app/controllers/environments_controller.rb @@ -0,0 +1,120 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class EnvironmentsController < ApplicationController + respond_to :html, :js + require 'rubygems' + require 'active_support/json' + + before_filter :find_organization, :only => [:show, :edit, :update, :destroy, :index, :new, :create] + before_filter :find_environment, :only => [:show, :edit, :update, :destroy] + around_filter :catch_exceptions + + def section_id + 'orgs' + end + + # GET /environments/new + def new + @environment = KPEnvironment.new(:organization => @organization) + setup_new_edit_screen + render :partial=>"new" + end + + # GET /environments/1/edit + def edit + # Create a hash of the available environments and convert to json to be included + # the edit view + prior_envs = envs_no_successors - [@environment] - @environment.path + env_labels = Hash[ *prior_envs.collect { |p| [ p.id, p.name ] }.flatten] + env_labels[''] = _("Locker") + @env_labels_json = ActiveSupport::JSON.encode(env_labels) + + @selected = @environment.prior.nil? ? env_labels[""] : env_labels[@environment.prior.id] + render :partial=>"edit" + end + + + # POST /environments + def create + env_params = {:name => params[:name], + :description => params[:description], + :prior => params[:prior], + :organization_id => @organization.id} + @environment = KPEnvironment.new env_params + + @environment.save! + notice _("Environment '#{@environment.name}' was created.") + render :json=>"" + + end + + # PUT /environments/1 + def update + priorUpdated = !params[:kp_environment][:prior].nil? + + unless params[:kp_environment][:description].nil? + params[:kp_environment][:description] = params[:kp_environment][:description].gsub("\n",'') + end + + @environment.update_attributes(params[:kp_environment]) + @environment.save! + + if priorUpdated + result = @environment.prior.nil? ? _("Locker") : @environment.prior.name + else + result = params[:kp_environment].values.first; + end + + notice _("Environment '#{@environment.name}' was updated.") + + render :text =>escape_html(result) + end + + # DELETE /environments/1 + def destroy + @environment.destroy + notice _("Environment '#{@environment.name}' was deleted.") + render :text=>"" + end + + protected + + def find_organization + org_id = params[:organization_id] || params[:org_id] + @organization = Organization.first(:conditions => {:cp_key => org_id}) + errors _("Couldn't find organization '#{org_id}'") if @organization.nil? + end + + def find_environment + env_id = (params[:id].blank? ? nil : params[:id]) || params[:env_id] + @environment = KPEnvironment.find env_id + notice _("Couldn't find environment '#{env_id}'") if @environment.nil? + redirect_to :action => :index and return if @environment.nil? + end + + def setup_new_edit_screen + envs_no_successors = @organization.environments.reject {|item| !item.successor.nil?} + @env_labels = (envs_no_successors - [@environment]).collect {|p| [ p.name, p.id ]} + @selected = @environment.prior.nil? ? "" : @environment.prior.id + end + def envs_no_successors + @organization.environments.reject {|item| !item.successor.nil?} + end + + def catch_exceptions + yield + rescue Exception => error + errors error + render :text => error, :status => :bad_request + end +end diff --git a/app/controllers/errata_controller.rb b/app/controllers/errata_controller.rb new file mode 100644 index 00000000000..714cc1aab75 --- /dev/null +++ b/app/controllers/errata_controller.rb @@ -0,0 +1,38 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class ErrataController < ApplicationController + + skip_before_filter :authorize, :only => [:packages] + before_filter :details_auth, :only=> [:packages] + + before_filter :lookup_errata + def show + render :partial=>"show" + end + + + def packages + render :partial=>"packages" + end + + private + + def details_auth + authorize params[:controller], :show + end + + def lookup_errata + @errata = Glue::Pulp::Errata.find(params[:id]) + end + +end diff --git a/app/controllers/failed_authentication_controller.rb b/app/controllers/failed_authentication_controller.rb new file mode 100644 index 00000000000..768dd029f37 --- /dev/null +++ b/app/controllers/failed_authentication_controller.rb @@ -0,0 +1,29 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class FailedAuthenticationController < ActionController::Base + + # This method is called when warden stack cannot authenticate UI request + def unauthenticated_ui + Rails.logger.warn "Request is unauthenticated_ui for #{request.remote_ip}" + errors _("You've entered an incorrect username or password combination, please try again."), {:persist => false} + redirect_to new_user_session_url + return false + end + + # This method is called when warden stack cannot authenticate API request + def unauthenticated_api + Rails.logger.warn "Request is unauthenticated_api for #{request.remote_ip}" + head :status => 401 and return false + end + +end diff --git a/app/controllers/nodes_controller.rb b/app/controllers/nodes_controller.rb new file mode 100644 index 00000000000..38ca57aeb30 --- /dev/null +++ b/app/controllers/nodes_controller.rb @@ -0,0 +1,28 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/foreman' +class NodesController < ApplicationController + respond_to :html, :json + layout 'katello' + + def index + @nodes = Foreman::Host.new.list + respond_with(@nodes) + end + + def show + @facts = Foreman::Facts.new({:uuid => params[:id]}).values + respond_with(@facts) + end + +end diff --git a/app/controllers/notices_controller.rb b/app/controllers/notices_controller.rb new file mode 100644 index 00000000000..4cd6e6cd72d --- /dev/null +++ b/app/controllers/notices_controller.rb @@ -0,0 +1,102 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +# To change this template, choose Tools | Templates +# and open the template in the editor. + +class NoticesController < ApplicationController + skip_before_filter :authorize, :only => :destroy + include AutoCompleteSearch + helper_method :sort_column, :sort_direction + + def show + begin + @notices = current_user.notices.search_for(params[:search]).order(sort_column + " " + sort_direction) + retain_search_history + rescue Exception => error + errors error.to_s, {:level => :message, :persist => false} + @notices = current_user.notices.search_for '' + end + end + + def get_new + # obtain the list of notices that user has not yet seen. + new_notices = Notice.select("notices.id, text, level").where("user_notices.user_id = ? AND user_notices.viewed = ?", current_user, false).joins(:user_notices) + + # flag these notices as viewed for the user. this will ensure the user is only notified once. + new_notices.each do |notice| + user_notice = current_user.user_notices.where(:notice_id => notice.id).first + user_notice.viewed = true + user_notice.save! + end + + respond_to do |format| + format.json { render :json => {:new_notices => new_notices, :unread_count => current_user.user_notices.length} } + end + end + + def details + begin + # retrieve the details for the requested notice + notice = Notice.find(params[:id]) + + respond_to do |format| + format.html { render :text => escape_html(notice.details)} + end + + rescue Exception => e + errors e.to_s + + respond_to do |format| + format.html { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + format.js { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + end + end + end + + def dismiss + notice = Notice.find(params[:id]) + + notice.users.delete(current_user) + notice.destroy unless notice.users.any? + + respond_to do |format| + format.json { render :json => "ok" } + end + end + + def destroy_all + begin + # destroy all notices for the user + for notice in current_user.notices + notice.users.delete(current_user) + notice.destroy unless notice.users.any? + end + + rescue Exception => error + errors error.to_s + end + + redirect_to :action => "show" + end + + private + + def sort_column + Notice.column_names.include?(params[:sort]) ? params[:sort] : "created_at" + end + + def sort_direction + %w[asc desc].include?(params[:direction]) ? params[:direction] : "desc" + end + +end diff --git a/app/controllers/operations_controller.rb b/app/controllers/operations_controller.rb new file mode 100644 index 00000000000..99757c85493 --- /dev/null +++ b/app/controllers/operations_controller.rb @@ -0,0 +1,19 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class OperationsController < ApplicationController + def index + end + def section_id + 'operations' + end +end diff --git a/app/controllers/organizations_controller.rb b/app/controllers/organizations_controller.rb new file mode 100644 index 00000000000..34c9028b26c --- /dev/null +++ b/app/controllers/organizations_controller.rb @@ -0,0 +1,129 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'pp' + +class OrganizationsController < ApplicationController + navigation :organizations + include AutoCompleteSearch + respond_to :html, :js + + before_filter :find_organization, :only => [:show, :edit, :update, :destroy] + before_filter :setup_options, :only=>[:index, :items] + + def section_id + 'orgs' + end + + def index + begin + @organizations = Organization.search_for(params[:search]).limit(current_user.page_size) + retain_search_history + rescue Exception => error + errors error.to_s, {:level => :message, :persist => false} + @organizations = Organization.search_for '' + render :index, :status => :bad_request and return + end + end + + def items + start = params[:offset] + @organizations = Organization.search_for(params[:search]).limit(current_user.page_size).offset(start) + render_panel_items @organizations, @panel_options + end + + + def new + render :partial=>"new" + end + + def create + begin + @organization = Organization.new(:name => params[:name], :description => params[:description], :cp_key => params[:name].tr(' ', '_')) + @organization.save! + notice [_("Organization '#{@organization["name"]}' was created."), _("Click on 'Add Environment' to create the first environment")] + # TODO: example - create permission for the organization + #current_user.role.first.allow 'show', 'organization', "org_name:#{@organization.name}" + rescue Exception => error + errors error + print "\n\n\n\n", error.to_s + Rails.logger.info error.backtrace.join("\n") + render :text=> error.to_s, :status=>:bad_request and return + end + render :partial=>"common/list_item", :locals=>{:item=>@organization, :accessor=>"cp_key", :columns=>['name']} + end + + def edit + @env_choices = @organization.environments.collect {|p| [ p.name, p.name ]} + render :partial=>"edit" + end + + def update + result = "" + begin + unless params[:organization][:description].nil? + result = params[:organization][:description] = params[:organization][:description].gsub("\n",'') + end + + @organization.update_attributes!(params[:organization]) + notice _("Organization '#{@organization["name"]}' was updated.") + + respond_to do |format| + format.html { render :text => escape_html(result) } + format.js + end + rescue Exception => error + errors error + + respond_to do |format| + format.js { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + end + end + end + + def destroy + if Organization.count > 1 + @id = @organization.id + begin + @organization.destroy + notice _("Organization '#{params[:id]}' was deleted.") + rescue Exception => error + errors error.to_s + render :text=> error.to_s, :status=>:bad_request and return + end + render :partial => "common/list_remove", :locals => {:id => @id} + else + errors [_("Could not delete organization '#{params[:id]}'."), _("At least one organization must exist.")] + + render :text => "At least one organization must exist.", :status=>:bad_request and return + end + end + + protected + + def find_organization + @organization = Organization.first(:conditions => {:cp_key => params[:id]}) + errors _("Couldn't find organization '#{params[:organization_id]}'") if @organization.nil? + redirect_to(:controller => :organizations, :action => :index) and return if @organization.nil? + end + + def setup_options + @panel_options = { :title => _('Organizations'), + :col => ['name'], + :create => _('Organization'), + :name => _('organization'), + :accessor => :cp_key, + :ajax_scroll => items_organizations_path()} + end + + +end diff --git a/app/controllers/packages_controller.rb b/app/controllers/packages_controller.rb new file mode 100644 index 00000000000..df064bcbc81 --- /dev/null +++ b/app/controllers/packages_controller.rb @@ -0,0 +1,47 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class PackagesController < ApplicationController + + skip_before_filter :authorize, :only => [:filelist, :changelog, :dependencies] + before_filter :package_details_auth, :only=> [:filelist, :changelog, :dependencies] + + before_filter :lookup_package + + def show + render :partial=>"show" + end + + def filelist + render :partial=>"filelist" + end + + def changelog + render :partial=>"changelog" + end + + def dependencies + render :partial=>"dependencies" + end + + private + + def package_details_auth + authorize params[:controller], :show + end + + def lookup_package + @package_id = params[:id] + @package = Glue::Pulp::Package.find @package_id + end + +end diff --git a/app/controllers/pools_controller.rb b/app/controllers/pools_controller.rb new file mode 100644 index 00000000000..7d625c1deae --- /dev/null +++ b/app/controllers/pools_controller.rb @@ -0,0 +1,22 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class PoolsController < ApplicationController + + def show + render :text => Candlepin::Proxy.get(@_request), :content_type => :json + end + + def index + render :text => Candlepin::Proxy.get(@_request), :content_type => :json + end +end \ No newline at end of file diff --git a/app/controllers/products_controller.rb b/app/controllers/products_controller.rb new file mode 100644 index 00000000000..bbb4601bf57 --- /dev/null +++ b/app/controllers/products_controller.rb @@ -0,0 +1,93 @@ +# +# Copyright © 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public License, +# version 2 (GPLv2). There is NO WARRANTY for this software, express or +# implied, including the implied warranties of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 +# along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +# +# Red Hat trademarks are not licensed under GPLv2. No permission is +# granted to use or replicate Red Hat trademarks that are incorporated +# in this software or its documentation. + +class ProductsController < ApplicationController + respond_to :html, :js + + before_filter :find_provider, :only => [:new, :create, :edit, :update] + before_filter :find_product, :only => [:edit, :update, :destroy] + + def section_id + 'contents' + end + + def new + render :partial => "new" + end + + def edit + render :partial => "edit" + end + + def create + begin + product_params = params[:product] + @provider.add_custom_product(product_params[:name], product_params[:description], product_params[:url]) + notice _("Product '#{product_params[:name]}' created.") + rescue Exception => error + Rails.logger.error error.to_s + errors error + end + render :json => "" + end + + def update + begin + result = params[:product].values.first + + @product.name = params[:product][:name] unless params[:product][:name].nil? + @product.description = params[:product][:description] unless params[:product][:description].nil? + + @product.save! + notice _("Product '#{@product.name}' was updated.") + + respond_to do |format| + format.html { render :text => escape_html(result) } + end + + rescue Exception => e + errors e.to_s + + respond_to do |format| + format.html { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + format.js { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + end + end + end + + def destroy + begin + @product.destroy + notice _("Product '#{@product[:name]}' removed.") + rescue Exception => error + Rails.logger.error error.to_s + errors error.to_s + end + render :json => "" + end + + protected + + def find_provider + @provider = Provider.find(params[:provider_id]) + errors _("Couldn't find provider '#{params[:provider_id]}'") if @provider.nil? + redirect_to(:controller => :providers, :action => :index, :organization_id => current_organization.cp_key) and return if @provider.nil? + end + + def find_product + @product = Product.find(params[:id]) + errors _("Couldn't find product '#{params[:id]}'") if @product.nil? + redirect_to(:controller => :providers, :action => :index, :organization_id => current_organization.cp_key) and return if @product.nil? + end +end diff --git a/app/controllers/promotions_controller.rb b/app/controllers/promotions_controller.rb new file mode 100644 index 00000000000..7bd6454f207 --- /dev/null +++ b/app/controllers/promotions_controller.rb @@ -0,0 +1,159 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class PromotionsController < ApplicationController + + before_filter :find_environment + + skip_before_filter :authorize, :only => [:detail, :repos] + before_filter :promote_auth, :only=> [:detail, :repos] + + + def section_id + 'contents' + end + + def show + setup_environment_selector(current_organization) + @products = @environment.products.reject{|p| p.repos(@environment).empty?}.sort{|a,b| a.name <=> b.name} + + @changeset_product_ids = @changeset.products.collect { |p| p.cp_id } if @changeset + @changeset_product_ids ||= [] + + end + + def detail + if params[:product_id] + @product = Product.find(params[:product_id]) + end + render :partial => "detail", :locals =>{:product=>@product} + end + + + # AJAX Calls + def products + @products = @environment.products + + render :partial=>"products", :locals=>{:product => @product, :products => @products, :changeset_product_ids => changeset_product_ids, :changset=>:changeset} + end + + def packages + package_hash = {} + @product.repos(@environment).each{|repo| + repo.packages.each{|pkg| + package_hash[pkg.id] = pkg if package_hash[pkg.id].nil? + } + } + + @next_env_pkgs = [] + if @next_environment + @product.repos(@next_environment).each{|repo| + repo.packages.each{|pkg| + @next_env_pkgs << pkg.id + } + } + end + + @packages = package_hash.values + @packages.sort! {|a,b| a.nvrea <=> b.nvrea} + offset = params[:offset] + offset = offset.to_i if offset + if offset + @packages = @packages[offset..offset+current_user.page_size] + render :text=>"" and return if @packages.empty? + else + @packages = @packages[0..current_user.page_size] + end + + render :partial=>"packages" + end + + + def repos + @repos = @product.repos(@environment) + offset = params[:offset] + if offset + @repos = @repos[offset..offset+current_user.page_size] + render :text=>"" and return if @repos.empty? + else + @repos = @repos[0..current_user.page_size] + end + + @next_env_repos = [] + if @next_environment + @product.repos(@next_environment).each{|repo| + @next_env_repos << repo.id + } + end + render :partial=>"repos" + end + + + def errata + errata_hash = {} + + if (@product) + products = [@product] + else + products = @environment.products + end + + products.each{|product| + product.repos(@environment).each{|repo| + repo.errata.each {|erratum| + errata_hash[erratum.id] = erratum if errata_hash[erratum.id].nil? + } + } + } + + @errata = errata_hash.values + @errata.sort! {|a,b| a.title <=> b.title} + offset = params[:offset] + if offset + @errata = @errata[offset..offset+current_user.page_size] + render :text=>"" and return if @errata.empty? + else + @errata = @errata[0..current_user.page_size] + end + render :partial=>"errata" + end + + + private + + def find_environment + @organization = Organization.first(:conditions => {:cp_key => params[:org_id]}) + @environment = KPEnvironment.first(:conditions => {:name=>params[:env_id]}) + @next_environment = KPEnvironment.find(params[:next_env_id]) if params[:next_env_id] + @next_environment ||= @environment.successor + + @path = @next_environment.full_path if @next_environment + @path ||= @environment.full_path + @path = [current_organization.locker] + @path if !@path.first.locker? + + if params[:changeset_id] + @changeset = Changeset.find(params[:changeset_id]) + elsif @next_environment + @changeset = @next_environment.working_changesets.first + end + + @product = Product.find(params[:product_id]) if params[:product_id] + end + + private + + def promote_auth + authorize params[:controller], :show + end + + +end diff --git a/app/controllers/providers_controller.rb b/app/controllers/providers_controller.rb new file mode 100644 index 00000000000..4f9cc51d250 --- /dev/null +++ b/app/controllers/providers_controller.rb @@ -0,0 +1,188 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class ProvidersController < ApplicationController + include AutoCompleteSearch + before_filter :find_provider, :only => [:subscriptions, :edit, :update, :destroy, :product_create] + before_filter :require_user + before_filter :panel_options, :only => [:index, :items] + respond_to :html, :js + + def section_id + 'contents' + end + + def schedule + @provider = Provider.find(params[:id]) + end + + def products_repos + @providers = current_organization.providers + @provider = Provider.find(params[:id]) + @products = @provider.products + render :partial => "products_repos", :locals => {:provider => @provider, :providers => @providers, :products => @products} + end + + def subscriptions + if !params[:provider].blank? and params[:provider].has_key? :contents + temp_file = nil + begin + temp_file = File.new(File.join("#{Rails.root}/tmp", "import_#{SecureRandom.hex(10)}.zip"), 'w+', 0600) + temp_file.write params[:provider][:contents].read + temp_file.close + @provider.import_manifest File.expand_path(temp_file.path) + notice _("Subscription uploaded successfully"), {:synchronous_request => false} + + rescue Exception => error + errors _("There was a format error with your Subscription Manifest"), {:synchronous_request => false} + + Rails.logger.error "error uploading subscriptions." + Rails.logger.error error + end + end + + @providers = current_organization.providers + @provider = Provider.find(params[:id]) + # We default to none imported until we can properly poll Candlepin for status of the import + @subscriptions = [{'productName' => _("None Imported"), "consumed" => "0", "available" => "0"}] + begin + all_subs = Candlepin::Owner.pools @provider.organization.cp_key + @subscriptions = [] + all_subs.each do |sub| + sub['providedProducts'].each do |cp_product| + product = Product.where(:cp_id =>cp_product["productId"]).first + if product and product.provider == @provider + @subscriptions << sub if !@subscriptions.include? sub + end + end + end + + rescue Exception => error + Rails.logger.error "Error fetching subscriptions from Candlepin" + Rails.logger.error error + Rails.logger.error error.backtrace.join("\n") + end + render :partial => "subscriptions", :locals => {:provider => @provider} + end + + def index + begin + @providers = Provider.search_for(params[:search]).order('provider_type desc').limit(current_user.page_size) + retain_search_history + rescue Exception => error + errors error.to_s, {:level => :message, :persist => false} + @providers = Provider.search_for '' + end + + end + + def items + start = params[:offset] + @providers = Provider.search_for(params[:search]).limit(current_user.page_size).offset(start) + render_panel_items @providers, @panel_options + end + + + def show + provider = Provider.find(params[:id]) + render :partial=>"common/list_update", :locals=>{:item=>provider, :accessor=>"id", :columns=>['name', 'provider_type']} + end + + def edit + render :partial => "edit", :locals => {:provider => @provider} + end + + def new + @provider = Provider.new + render :partial => "new", :locals => {:provider => @provider} + end + + def create + begin + @provider = Provider.create! params[:provider].merge({:organization => current_organization}) + notice _("Provider '#{@provider['name']}' was created.") + #render :nothing => true + render :partial=>"common/list_item", :locals=>{:item=>@provider, :accessor=>"id", :columns=>['name', 'provider_type']} + + rescue Exception => error + Rails.logger.error error.to_s + errors error + render :text => error, :status => :bad_request + end + end + + def destroy + @id = @provider.id + begin + @provider.destroy + if @provider.destroyed? + notice _("Provider '#{@provider[:name]}' was deleted.") + #render and do the removal in one swoop! + render :partial => "common/list_remove", :locals => {:id => @id} + else + raise + end + rescue Exception => e + errors e.to_s + end + end + + def update + + begin + updated_provider = Provider.find(params[:id]) + result = params[:provider].values.first + + updated_provider.name = params[:provider][:name] unless params[:provider][:name].nil? + + unless params[:provider][:description].nil? + result = updated_provider.description = params[:provider][:description].gsub("\n",'') + end + + updated_provider.repository_url = params[:provider][:repository_url] unless params[:provider][:repository_url].nil? + updated_provider.provider_type = params[:provider][:provider_type] unless params[:provider][:provider_type].nil? + + updated_provider.save! + notice _("Provider '#{updated_provider.name}' was updated.") + + respond_to do |format| + format.html { render :text => escape_html(result) } + end + + rescue Exception => e + errors e.to_s + + respond_to do |format| + format.html { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + format.js { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + end + end + end + + protected + + def find_provider + @provider = Provider.find(params[:id]) + errors _("Couldn't find provider '#{params[:id]}'") if @provider.nil? + redirect_to(:controller => :providers, :action => :index, :organization_id => current_organization.cp_key) and return if @provider.nil? + end + + def panel_options + @panel_options = { :title => _('Providers'), + :col => ['name', 'provider_type'], + :create => _('Provider'), + :name => _('provider'), + :ajax_scroll=>items_providers_path()} + end + + +end diff --git a/app/controllers/puppetclasses_controller.rb b/app/controllers/puppetclasses_controller.rb new file mode 100644 index 00000000000..4bc70c17525 --- /dev/null +++ b/app/controllers/puppetclasses_controller.rb @@ -0,0 +1,21 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class PuppetclassesController < ApplicationController + respond_to :html, :json + + def index + @klasses = Katello::Puppetclasses.all + respond_with(@klasses) + end + +end diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb new file mode 100644 index 00000000000..373fad6cb76 --- /dev/null +++ b/app/controllers/repositories_controller.rb @@ -0,0 +1,79 @@ +# +# Copyright © 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public License, +# version 2 (GPLv2). There is NO WARRANTY for this software, express or +# implied, including the implied warranties of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 +# along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +# +# Red Hat trademarks are not licensed under GPLv2. No permission is +# granted to use or replicate Red Hat trademarks that are incorporated +# in this software or its documentation. + +class RepositoriesController < ApplicationController + respond_to :html, :js + + before_filter :find_provider, :only => [:show, :edit, :update, :destroy, :index, :new, :create] + before_filter :find_product, :only => [:show, :edit, :update, :destroy, :index, :new, :create] + before_filter :find_repository, :only => [:edit, :update, :destroy] + + def section_id + 'contents' + end + + def new + render :partial => "new" + end + + def edit + render :partial => "edit" + end + + def create + begin + repo_params = params[:repo] + # Bundle these into one call, perhaps move to Provider + # Also fix the hard coded yum + @product.add_new_content(repo_params[:name], repo_params[:feed], 'yum') + @product.save + + rescue Exception => error + Rails.logger.error error.to_s + errors error + render :text=> error.to_s, :status=>:bad_request and return + end + notice _("Repository '#{repo_params[:name]}' created.") + render :json => "" + end + + def update + end + + def destroy + @product.delete_repo(params[:id]) + notice _("Repository '#{params[:id]}' removed.") + render :json => "" + end + + protected + + def find_provider + @provider = Provider.find(params[:provider_id]) + errors _("Couldn't find provider '#{params[:provider_id]}'") if @provider.nil? + redirect_to(:controller => :providers, :action => :index, :organization_id => current_organization.cp_key) and return if @provider.nil? + end + + def find_product + @product = Product.find(params[:product_id]) + errors _("Couldn't find product '#{params[:product_id]}'") if @product.nil? + redirect_to(:controller => :providers, :action => :index, :organization_id => current_organization.cp_key) and return if @product.nil? + end + + def find_repository + @repository = Pulp::Repository.find @product.repo_id(params[:id]) + errors _("Couldn't find repository '#{params[:id]}'") if @repository.nil? + redirect_to(:controller => :providers, :action => :index, :organization_id => current_organization.cp_key) and return if @repository.nil? + end +end diff --git a/app/controllers/roles_controller.rb b/app/controllers/roles_controller.rb new file mode 100644 index 00000000000..e23a95550f4 --- /dev/null +++ b/app/controllers/roles_controller.rb @@ -0,0 +1,161 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class RolesController < ApplicationController + skip_before_filter :authorize, :only => [:verbs_and_scopes, :create_permission, :update_permission, :show_permission, :items] + before_filter :create_update_auth, :only=> [:verbs_and_scopes, :create_permission, :update_permission, :show_permission] + before_filter :setup_options, :only => [:index, :items] + + include AutoCompleteSearch + + def section_id + 'operations' + end + + def index + begin + @roles = Role.search_for(params[:search]).where("roles.name != 'admin'").limit(current_user.page_size) + retain_search_history + rescue Exception => error + errors error.to_s, {:level => :message, :persist => false} + @roles = Role.search_for '' + end + end + + def items + start = params[:offset] + @roles = Role.search_for(params[:search]).limit(current_user.page_size).offset(start) + render_panel_items @roles, @panel_options + end + + def setup_options + @panel_options = { :title => _('Roles'), + :col => ['name'], + :create => _('Role'), + :name => _('role'), + :ajax_scroll => items_roles_path()} + end + + def new + @role = Role.new + render :partial=>"new", :locals=>{:role=>@role} + end + + def edit + setup_resource_types + @role = Role.find(params[:id]) + render :partial=>"edit", :locals=>{:role=>@role} + end + + def create + @role = Role.new(params[:role]) + if @role.save + notice @role.name + " " + _("Role created.") + #render :json=>@role + render :partial=>"common/list_item", :locals=>{:item=>@role, :accessor=>"id", :columns=>["name"]} + else + errors "", {:list_items => @role.errors.to_a} + render :json=>@role.errors, :status=>:bad_request + end + end + + def update + setup_resource_types + @role = Role.find(params[:id]) + return if @role.name == "admin" + if @role.update_attributes(params[:role]) + notice _("Role updated.") + render :text=>params[:role].first[1] + else + errors "", {:list_items => @role.errors.to_a} + respond_to do |format| + format.html { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + format.js { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + end + end + end + + def destroy + @id = params[:id] + @role = Role.find(@id) + begin + #remove the user + @role.destroy + if @role.destroyed? + notice _("Role '#{@role[:name]}' was deleted.") + #render and do the removal in one swoop! + render :partial => "common/list_remove", :locals => {:id => @id} + else + raise + end + rescue Exception => e + errors e.to_s + end + end + + def verbs_and_scopes + verbs = Verb.verbs_for(params[:resource_type]).collect {|v| v.verb} + scopes = Tag.tags_for(params[:resource_type]).collect { |t| VirtualTag.new(t.name, t.display_name) } + + render :json=> {:verbs => verbs, :scopes => scopes} + end + + def update_permission + setup_resource_types + @role = Role.find(params[:role_id]) + @permission = Permission.find(params[:permission_id]) + @permission.update_attributes(params[:permission]) + notice _("Permission updated.") + render :partial => "permission", :locals =>{:perm => @permission, :role=>@role, :data_new=> false} + end + + def create_permission + setup_resource_types + @role = Role.find(params[:role_id]) + new_params = {:role => @role} + new_params.merge! params[:permission] + @perm = Permission.create! new_params + notice _("Permission created.") + render :partial => "permission", :locals =>{:perm => @perm, :role=>@role, :data_new=> false} + end + + def show_permission + setup_resource_types + role = Role.find(params[:role_id]) + if params[:perm_id].nil? + permission = Permission.new(:role=> role, :resource_type => ResourceType.new) + else + permission = Permission.find(params[:perm_id]) + end + render :partial=>"permission", :locals=>{:perm=>permission, :role=>role, :data_new=>permission.new_record?} + + end + + + private + + #for edit/create ajax calls, allow if user can update or create + def create_update_auth + begin + authorize params[:controller], :update + rescue + authorize params[:controller], :create + end + end + + + def setup_resource_types + @resource_type_names = ResourceType.select("name").collect {|item| item.name}.uniq + @resource_type_names.delete("_rails") + end + +end diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb new file mode 100644 index 00000000000..37aa3860f12 --- /dev/null +++ b/app/controllers/search_controller.rb @@ -0,0 +1,77 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +# +class SearchController < ApplicationController + include SearchHelper + + def show + # retrieve the search history and favorites for the user... + # only return histories that are associated with the page the request is received on... + path = retrieve_path + + @search_histories = current_user.search_histories.where(:path => path).order("updated_at desc") + @search_favorites = current_user.search_favorites.where(:path => path).order("params asc") + + render :partial => "common/search" + + # clean up the histories... we will only store the last N entries in the + # search history, so delete any past N + if @search_histories.length > max_search_history + for i in (max_search_history..@search_histories.length-1) + @search_histories[i].delete unless @search_histories[i].nil? + end + end + end + + def create_favorite + begin + # save in the user's search favorites + unless params[:favorite].nil? or params[:favorite].blank? + path = retrieve_path + favorites = current_user.search_favorites.where(:path => path, :params => params[:favorite]) + if favorites.nil? or favorites.empty? + # user doesn't have this favorite stored, so save it + favorite = current_user.search_favorites.create!(:path => path, :params => params[:favorite]) + end + end + rescue Exception => error + Rails.logger.error error.to_s + errors error.to_s + end + + # return the search details after adding a new favorite + show + end + + def destroy_favorite + begin + current_user.search_favorites.destroy(params[:id]) + rescue Exception => error + Rails.logger.error error.to_s + errors error.to_s + end + + # return the search details after removing the favorite + show + end + + private + + def retrieve_path + host = request.env['HTTP_HOST'] + # remove host details from the path + path = request.env['HTTP_REFERER'].split(host).last + # remove request parameters from the path + path = path.split("?").first + end + +end diff --git a/app/controllers/sync_management_controller.rb b/app/controllers/sync_management_controller.rb new file mode 100644 index 00000000000..577796aa8b2 --- /dev/null +++ b/app/controllers/sync_management_controller.rb @@ -0,0 +1,164 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/pulp' + +class SyncManagementController < ApplicationController + include TranslationHelper + include ActionView::Helpers::DateHelper + include ActionView::Helpers::NumberHelper + + before_filter :require_user + respond_to :html, :json + + @@status_values = { Glue::Pulp::Repo::SYNC_STATE_WAITING => _("Queued."), + Glue::Pulp::Repo::SYNC_STATE_FINISHED => _("Sync complete."), + Glue::Pulp::Repo::SYNC_STATE_ERROR => _("Error syncing!"), + Glue::Pulp::Repo::SYNC_STATE_RUNNING => _("Running."), + Glue::Pulp::Repo::SYNC_STATE_NOT_SYNCED => _("Not synced.")} + + def section_id + 'contents' + end + + def index + # TODO: We need to switch to using an Org's ID vs the display name. See BZ 701406 + @organization = current_organization + rproducts = @organization.locker.products.reject { |p| p.repos(p.organization.locker).empty? } + @products = rproducts.sort { |p1,p2| p1.name <=> p2.name } + @product_status = Hash.new + @product_size = Hash.new + @repo_status = Hash.new + for p in @products + pstatus = p.sync_status + @product_status[p.id] = format_sync_progress(pstatus) + @product_size[p.id] = number_to_human_size(p.sync_size) + for r in p.repos(p.organization.locker) + repo_status = r.sync_status + @repo_status[r.id] = format_sync_progress(repo_status) + end + end + end + + def sync + ids = sync_repos(params[:repo]) || {} + respond_with (ids) do |format| + format.js { render :json => ids.to_json, :status => :ok } + end + end + + def status + sync_status = Glue::Pulp::Repo.new(:id => params[:repo_id]).sync_status + progress = format_sync_progress(sync_status) + progress[:repo_id] = params['repo_id'] + + respond_with (progress) do |format| + format.js { render :json => progress.to_json, :status => :ok } + end + end + + def product_status + product = Product.first(:conditions => {:id => params['product_id']}) + repo_stat = Glue::Pulp::Repo.new(:id => params[:repo_id]).sync_status + status = product.sync_status + send_notification(product, repo_stat) if status.state == Glue::Pulp::Repo::SYNC_STATE_FINISHED + report_error(product) if status.state == Glue::Pulp::Repo::SYNC_STATE_ERROR + + progress = format_sync_progress(status) + progress[:product_id] = params['product_id'] + progress[:size] = number_to_human_size(product.sync_size) + + respond_with (progress) do |format| + format.js { render :json => progress.to_json, :status => :ok } + end + end + + def destroy + retval = Pulp::Repository.cancel(params['repo_id'], params[:id]) + cancel = {:sync_id => retval[:id], :state => retval[:state] } + respond_with (cancel) do |format| + format.js { render :json => cancel.to_json, :status => :ok } + end + end + +private + + def format_sync_progress(sync_status) + progress = {:progress => calc_progress(sync_status)} + progress[:sync_id] = sync_status.sync_id + progress[:state] = format_state(sync_status.state) + progress[:start_time] = format_date(sync_status.start_time) + progress[:finish_time] = format_date(sync_status.finish_time) + progress[:packages] = sync_status.total_count + progress[:size] = number_to_human_size(sync_status.total_size) + progress + end + + def format_state(state) + @@status_values[state] + end + + def format_date(check_date) + retval = nil + if !check_date.nil? + retval = relative_time_in_words(check_date) + end + retval + end + + # loop through checkbox list of products and sync + def sync_repos(repos) + + data = {} # sync throttle data + data[:limit] = AppConfig.pulp.sync_KBlimit if AppConfig.pulp.sync_KBlimit # set bandwidth limit + data[:threads] = AppConfig.pulp.sync_threads if AppConfig.pulp.sync_threads # set threads per sync + repos.keys.inject([]) do |collected,id| + product_id = repos[id] + begin + resp = Pulp::Repository.sync(id, data) + rescue RestClient::Conflict => e + errors N_("There is already an active sync process for the '#{id}' repository. Please try again later") + next + end + collected.push({:repo_id => id, :sync_id => resp[:id], :state => resp[:state], :product_id => product_id}) + end + end + + # calculate the % complete of ongoing sync from pulp + def calc_progress(val) + completed = val.total_size - val.size_left + progress = if val.state =~ /error/i then -1 + elsif val.total_size == 0 then 0 + else completed.to_f / val.total_size.to_f * 100 + end + retval = {:count => val.total_count, + :left => val.items_left, + :progress => progress + } + end + + def send_notification(product, status) + if status.error_details.size > 0 then + notice product.name + ' ' + _("product was synced successfully with errors. See log for details"), + {:details => status.error_details.join("\n"),:synchronous_request => false} + status.error_details.each { |d| Rails.logger.error("Sync error:" + d[:error]) } + else + notice product.name + ' ' + _("product was synced successfully") + end + end + + def report_error(product) + errors product.name + ' ' + _("sync did not complete successfully"), {:synchronous_request => false} + Rails.logger.error product.name + " sync did not complete successfully" + end + +end diff --git a/app/controllers/sync_plans_controller.rb b/app/controllers/sync_plans_controller.rb new file mode 100644 index 00000000000..0409802fd20 --- /dev/null +++ b/app/controllers/sync_plans_controller.rb @@ -0,0 +1,128 @@ +class SyncPlansController < ApplicationController + include AutoCompleteSearch + + before_filter :get_plan, :only => [:destroy, :edit, :show] + before_filter :setup_options, :only => [:index, :items] + + def section_id + 'contents' + end + + def index + begin + @plans = SyncPlan.search_for(params[:search]).where(:organization_id => current_organization.id).limit(current_user.page_size) + retain_search_history + rescue Exception => e + errors e.to_s, {:level => :message, :persist => false} + @plans = SyncPlan.search_for '' + end + end + + def items + start = params[:offset] + @sync_plans = SyncPlan.search_for(params[:search]).where(:organization_id => current_organization.id).limit(current_user.page_size).offset(start) + render_panel_items @sync_plans, @panel_options + end + + def setup_options + columns = ['name', 'interval'] + @panel_options = { :title => _('Sync Plans'), + :col => columns, + :create => _('Plan'), + :name => _('plan'), + :ajax_scroll => items_sync_plans_path()} + end + + def edit + render :partial => "edit", :locals => {:plan => @plan} + end + + def update + begin + updated_plan = SyncPlan.find(params[:id]) + result = params[:plan].values.first + + updated_plan.name = params[:plan][:name] unless params[:plan][:name].nil? + updated_plan.interval = params[:plan][:interval] unless params[:plan][:interval].nil? + + unless params[:plan][:description].nil? + result = updated_plan.description = params[:plan][:description].gsub("\n",'') + end + + unless params[:plan][:time].nil? + ttime = updated_plan.plan_date + ' ' + params[:plan][:time].strip + updated_plan.sync_date = DateTime.strptime(ttime, '%m/%d/%Y %I:%M %p') + end + + unless params[:plan][:date].nil? + ddate = params[:plan][:date].strip + ' ' + updated_plan.plan_time + updated_plan.sync_date = DateTime.strptime(ddate, '%m/%d/%Y %I:%M %p') + end + + updated_plan.save! + notice N_("Sync Plan '#{updated_plan.name}' was updated.") + + respond_to do |format| + format.html { render :text => escape_html(result) } + end + + rescue Exception => e + errors e.to_s + + respond_to do |format| + format.html { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + format.js { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + end + end + + end + + def destroy + @id = @plan.id + begin + @plan.destroy + notice N_("Sync plan '#{@plan[:name]}' was deleted.") + rescue Exception => e + errors e.to_s + end + render :partial => "common/list_remove", :locals => {:id => @id} + end + + def show + render :partial => "common/list_update", :locals=>{:item=>@plan, :accessor=>"id", :columns=>['name', 'interval']} + end + + def new + @plan = SyncPlan.new + render :partial => "new", :locals => {:plan => @plan} + end + + def create + begin + sdate = params[:sync_plan].delete :plan_date + stime = params[:sync_plan].delete :plan_time + sync_event = sdate + ' ' + stime + begin + params[:sync_plan][:sync_date] = DateTime.strptime(sync_event, "%m/%d/%Y %I:%M %P") + rescue Exception => error + params[:sync_plan][:sync_date] = nil + end + @plan = SyncPlan.create! params[:sync_plan].merge({:organization => current_organization}) + notice N_("Sync Plan '#{@plan['name']}' was created.") + render :partial=>"common/list_item", :locals=>{:item=>@plan, :accessor=>"id", :columns=>['name', 'interval']} + rescue Exception => error + Rails.logger.error error.to_s + errors error + render :text => error, :status => :bad_request + end + end + + protected + # pre filter for grabbing plan object + def get_plan + @plan = SyncPlan.find(params[:id]) + errors N_("Couldn't find sync plan '#{params[:id]}'") if @plan.nil? + redirect_to(:controller => :sync_plans, :action => :index, :organization_id => current_organization.cp_key) and return if @plan.nil? + end + +end diff --git a/app/controllers/sync_schedules_controller.rb b/app/controllers/sync_schedules_controller.rb new file mode 100644 index 00000000000..f4556b68148 --- /dev/null +++ b/app/controllers/sync_schedules_controller.rb @@ -0,0 +1,60 @@ +class SyncSchedulesController < ApplicationController + + def section_id + 'contents' + end + + def index + + @organization = current_organization + rproducts = @organization.locker.products.reject { |p| p.productContent.empty? } + @products = rproducts.sort { |p1,p2| p1.name <=> p2.name } + + @plans = SyncPlan.where(:organization_id => current_organization.id) + + for p in @products + + end + + @products_options = { :title => _('Select Products to schedule'), + :col => ['name', 'plan_name'], + :create => _('Plan'), + :name => _('product'), + :enable_create => false} + + @plans_options = { :title => _('Select Plans to apply to selected Products'), + :col => ['name', 'interval'], + :create => _('Plan'), + :name => _('plan'), + :hover_text_cb => :hover_format, + :enable_create => false, + :single_select => true} + + + respond_to do |format| + format.html # index.html.erb + end + end + + def apply + data = JSON.parse(params[:data]).with_indifferent_access + selected_plans = data[:plans].collect{ |i| i.to_i} + selected_products = data[:products].collect{ |i| i.to_i} + plans = SyncPlan.where(:id => selected_plans) + products = Product.where(:id => selected_products) + + products.each do |prod| + unless plans.empty? + plans.each do |plan| + prod.sync_plan = plan + end + else + prod.sync_plan = nil + end + prod.save! + end + notice N_("Sync Plans applied successfully.") + redirect_to(:controller => :sync_schedules, :action =>:index) + end + +end diff --git a/app/controllers/system_settings_controller.rb b/app/controllers/system_settings_controller.rb new file mode 100644 index 00000000000..17019b0aa86 --- /dev/null +++ b/app/controllers/system_settings_controller.rb @@ -0,0 +1,16 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class SystemSettingsController < ApplicationController + before_filter :require_user + +end \ No newline at end of file diff --git a/app/controllers/systems_controller.rb b/app/controllers/systems_controller.rb new file mode 100644 index 00000000000..6d65db44700 --- /dev/null +++ b/app/controllers/systems_controller.rb @@ -0,0 +1,110 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class SystemsController < ApplicationController + include AutoCompleteSearch + before_filter :find_system, :except =>[:index, :auto_complete_search, :items] + before_filter :setup_options, :only => [:index, :items] + + def index + begin + @systems = System.search_for(params[:search]).where(:organization_id => current_organization.id).limit(current_user.page_size) + retain_search_history + rescue Exception => error + errors error.to_s, {:level => :message, :persist => false} + @systems = System.search_for '' + render :index, :status=>:bad_request + end + end + + def items + start = params[:offset] + @systems = System.search_for(params[:search]).limit(current_user.page_size).offset(start) + render_panel_items @systems, @panel_options + end + + def setup_options + @panel_options = { :title => _('Systems'), + :col => ['name',"ip","kernel"], + :enable_create => false, + :name => _('system'), + :ajax_scroll => items_systems_path()} + end + + def subscriptions + all = @system.pools + @system.available_pools + consumed = @system.consumed_pool_ids + all_pools = all.collect {|pool| OpenStruct.new(:poolId => pool["id"], :poolName => pool["productName"])} + all_pools.sort! {|a,b| a.poolName <=> b.poolName} + render :partial=>"subscriptions", :locals=>{:system=>@system, :all_subs => all_pools, :consumed => consumed} + end + + def update_subscriptions + params[:system] = {"consumed_pool_ids"=>[]} unless params.has_key? :system + if @system.update_attributes(params[:system]) + notice _("System subscriptions updated.") + render :nothing =>true + else + errors "Unable to update subscriptions." + render :nothing =>true + end + end + + def packages + packages = (0..25).collect do |p| + OpenStruct.new(:name => "package-#{p}", :arch => ["noarch", "i686", "x86_64"].choice) + end + render :partial=>"packages", :locals=>{:system=>@system, :packages => packages} + end + + def edit + render :partial=>"edit", :locals=>{:system=>@system} + end + + def update + if @system.update_attributes(params[:system]) + notice _("System updated.") + + respond_to do |format| + format.html { render :text=>params[:system].first[1] } + format.js + end + + else + errors @system.errors + respond_to do |format| + format.html { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + format.js { render :partial => "layouts/notification", :status => :bad_request, :content_type => 'text/html' and return} + end + end + end + + def show + system = System.find(params[:id]) + render :partial=>"common/list_update", :locals=>{:item=>system, :accessor=>"id", :columns=>['name', 'ip', 'kernel']} + end + + def section_id + 'systems' + end + + def facts + render :partial => 'facts' + end + + private + + def find_system + @system = System.find(params[:id]) + end + +end diff --git a/app/controllers/user_sessions_controller.rb b/app/controllers/user_sessions_controller.rb new file mode 100644 index 00000000000..aabfd18b91b --- /dev/null +++ b/app/controllers/user_sessions_controller.rb @@ -0,0 +1,60 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class UserSessionsController < ApplicationController + before_filter :require_no_user, :only => [:new, :create] + before_filter :require_user, :only => :destroy + before_filter :require_org, :only => :destroy + + # we need to skip create, destroy and all unauthenticated* methods + skip_before_filter :authorize + + def new + end + + def section_id + "loginpage" + end + + def create + authenticate! :scope => :user + self.current_organization = Organization.first + if logged_in? + + #save the hash anchor if it exsts + if params[:hash_anchor] and session[:original_uri] and !session[:original_uri].index("#") + session[:original_uri] += params[:hash_anchor] + end + + # set the current user in the thread-local variable (before notification) + User.current = current_user + # notice the user + notice _("Login Successful") + #redirect_to account_url + redirect_to dashboard_index_url + end + end + + def destroy + logout + self.current_organization = nil + notice _("Logout Successful"), {:persist => false} + redirect_to root_url + end + + private + + # return simple 401 page (for API authentication errors) + def return_401 + head :status => 401 and return false + end +end diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb new file mode 100644 index 00000000000..d3a0339e4f3 --- /dev/null +++ b/app/controllers/users_controller.rb @@ -0,0 +1,134 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class UsersController < ApplicationController + include AutoCompleteSearch + + def section_id + 'operations' + end + + # We don't want authorization on helptips, as they are a function of a user + skip_before_filter :authorize, :only => [:enable_helptip, :disable_helptip, :clear_helptips] + before_filter :authorize_update, :only => [:clear_helptips] + before_filter :setup_options, :only => [:items, :index] + + + def index + begin + @users = User.search_for(params[:search]).limit(current_user.page_size) + retain_search_history + rescue Exception => error + errors error.to_s, {:level => :message, :persist => false} + @users = User.search_for '' + end + end + + def items + start = params[:offset] + @users = User.search_for(params[:search]).limit(current_user.page_size).offset(start) + render_panel_items @users, @panel_options + end + + def setup_options + @panel_options = { :title => _('Users'), + :col => ['username'], + :create => _('User'), + :name => _('user'), + :ajax_scroll => items_users_path()} + end + + def edit + @user = User.where(:id => params[:id])[0] + render :partial=>"edit", :locals=>{:user=>@user} + end + + def new + @user = User.new + render :partial=>"new", :locals=>{:user=>@user} + end + + def create + @user = User.new(params[:user]) + if @user.save + notice @user.username + _(" created successfully.") + #render :json=>@user + render :partial=>"common/list_item", :locals=>{:item=>@user, :accessor=>"id", :columns=>["username"]} + else + errors @user.errors + render :json=>@user.errors, :status=>:bad_request + end + end + + def update + + params[:user].delete :username + @user = User.where(:username => params[:id])[0] + + #Add in the own role if updating roles, cause the user shouldn't see his own role + if params[:user][:role_ids] + params[:user][:role_ids] << @user.own_role.id + end + + if @user.update_attributes(params[:user]) + notice _("User updated successfully.") + attr = params[:user].first.last if params[:user].first + attr ||= "" + render :text => escape_html(attr) and return + end + errors "", {:list_items => @user.errors.to_a} + render :text => @user.errors, :status=>:ok + end + + def destroy + @id = params[:id] + @user = User.where(:id => @id)[0] + begin + #remove the user + @user.destroy + if @user.destroyed? + notice _("User '#{@user[:username]}' was deleted.") + #render and do the removal in one swoop! + render :partial => "common/list_remove", :locals => {:id => @id} + else + raise + end + rescue Exception => e + errors e.to_s + end + end + + def clear_helptips + @user = User.where(:username => params[:id])[0] + @user.clear_helptips + notice _("Disabled help tips have been re-enabled.") + render :text => _("Cleared") + end + + def enable_helptip + current_user.enable_helptip params[:key] + render :text => "" + end + + def disable_helptip + current_user.disable_helptip params[:key] + render :text => "" + end + + private + + def authorize_update + authorize(params[:controller], "update") + end + + +end diff --git a/app/helpers/api/puppetclasses_helper.rb b/app/helpers/api/puppetclasses_helper.rb new file mode 100644 index 00000000000..99ff8863fbc --- /dev/null +++ b/app/helpers/api/puppetclasses_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module Api::PuppetclassesHelper +end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb new file mode 100644 index 00000000000..b459794febe --- /dev/null +++ b/app/helpers/application_helper.rb @@ -0,0 +1,135 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module ApplicationHelper + def current_url(extra_params={}) + url_for params.merge(extra_params) + end + + def project_name + _("Katello") + end + + def default_title + _("Open Source Systems Management") + end + + def link_to_authorized(*args, &block) + + if block_given? + options = args.first || {} + html_options = args.second + link_to_authorized(capture(&block), options, html_options) + else + name = args[0] + options = args[1] || {} + html_options = args[2] + + + if options.key? :controller + ctrl = options[:controller] + action = options[:action] || 'index' + + if current_user and current_user.allowed_to?({:controller => ctrl, :action => action}) + link_to(name, options, html_options) + end + end + end + + end + + def help_tip(text, key=nil) + key ||= params[:controller] + "-" + params[:action] + render :partial => "common/helptip", :locals=>{:key=>key, :text=>text} + end + + def help_tip_button(key=nil) + key ||= params[:controller] + "-" + params[:action] + render :partial => "common/helptip_button", :locals=>{:key=>key} + end + + def two_panel(collection, options) + options[:accessor] ||= "id" + enable_create = options[:enable_create] + enable_create = true if enable_create.nil? + + render :partial => "common/panel", + :locals => { + :title => options[:title], + :name => options[:name], + :create => options[:create], + :enable_create => enable_create, + :columns => options[:col], + :collection => collection, + :accessor=>options[:accessor], + :url=>options[:url], + :ajax_scroll =>options[:ajax_scroll]} + end + + def one_panel(panel_id, collection, options) + options[:accessor] ||= "id" + panel_id ||= "panel" + + render :partial => "common/one_panel", + :locals => { + :single_select => options[:single_select] || false, + :hover_text_cb => options[:hover_text_cb], + :panel_id => panel_id, + :title => options[:title], + :name => options[:name], + :columns => options[:col], + :collection => collection, + :accessor=>options[:accessor] } + end + + def include_common_i18n + render :partial => "common/common_i18n" + end + + def include_editable_i18n + render :partial=> "common/edit_i18n" + end + + def notification_polling_time() + time = AppConfig.notification && AppConfig.notification.polling_seconds + return time.to_i * 1000 if time + return 45000 + end + + + def environment_selector options = {} + options[:locker_clickable] = true if options[:locker_clickable].nil? # ||= doesn't work if false + options[:url_proc] = nil if options[:url_proc].nil? #explicitly set url_method to nil if not provided + render :partial=>"/common/env_select", :locals => options + end + + def env_select_class curr_env, selected_env, curr_path, selected_path, locker_clickable + classes = [] + classes << "path_link" if locker_clickable or !curr_env.locker? + + if curr_env.id == selected_env.id + if !selected_env.locker? + classes << "active" + else + #we only want to higlight the locker along the path that is actually selected + classes << "active" if curr_path[1] == selected_path[1] + end + end + classes.join(' ') + end + + def env_select_url proc, env, next_env, org + return nil if proc.nil? + proc.call(:environment=> env, :next_environment=>next_env, :organization=>org) + end + +end diff --git a/app/helpers/content_helper.rb b/app/helpers/content_helper.rb new file mode 100644 index 00000000000..e20a0526810 --- /dev/null +++ b/app/helpers/content_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module ContentHelper +end diff --git a/app/helpers/dashboard_helper.rb b/app/helpers/dashboard_helper.rb new file mode 100644 index 00000000000..d0b3f2598c6 --- /dev/null +++ b/app/helpers/dashboard_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module DashboardHelper +end diff --git a/app/helpers/environments_helper.rb b/app/helpers/environments_helper.rb new file mode 100644 index 00000000000..7fa504eedc1 --- /dev/null +++ b/app/helpers/environments_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module EnvironmentsHelper +end diff --git a/app/helpers/errata_helper.rb b/app/helpers/errata_helper.rb new file mode 100644 index 00000000000..4decf408081 --- /dev/null +++ b/app/helpers/errata_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module ErrataHelper +end diff --git a/app/helpers/nodes_helper.rb b/app/helpers/nodes_helper.rb new file mode 100644 index 00000000000..ed92f4929d1 --- /dev/null +++ b/app/helpers/nodes_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module NodesHelper +end diff --git a/app/helpers/notices_helper.rb b/app/helpers/notices_helper.rb new file mode 100644 index 00000000000..b33dbcfbd78 --- /dev/null +++ b/app/helpers/notices_helper.rb @@ -0,0 +1,21 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module NoticesHelper + + def sortable(column, title) + css_class = column == sort_column ? "active sortable #{sort_direction}" : nil + direction = column == sort_column && sort_direction == "asc" ? "desc" : "asc" + link_to title, {:sort => column, :direction => direction}, {:class => css_class} + end + +end diff --git a/app/helpers/operations_helper.rb b/app/helpers/operations_helper.rb new file mode 100644 index 00000000000..729c8d540eb --- /dev/null +++ b/app/helpers/operations_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module OperationsHelper +end diff --git a/app/helpers/packages_helper.rb b/app/helpers/packages_helper.rb new file mode 100644 index 00000000000..41701ab7c12 --- /dev/null +++ b/app/helpers/packages_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module PackagesHelper +end diff --git a/app/helpers/promotions_helper.rb b/app/helpers/promotions_helper.rb new file mode 100644 index 00000000000..36c1b765bef --- /dev/null +++ b/app/helpers/promotions_helper.rb @@ -0,0 +1,86 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module PromotionsHelper + + include ActionView::Helpers::JavaScriptHelper + + def details_path product_id=nil + promotion_details_path(@organization.cp_key, @environment.name, :product_id=>product_id) + end + + # Generates a json structure of the breadcrumb, consisting of a hash map of: + # :id => {:url, :name, :trail} where name is a human readable name, and :trail is + # a list of other :ids creating the trail leading up to it + # + def generate_breadcrumb + bc = {} + content_crumb_id = "content" + products_crumb_id = "products" + + add_crumb_node!(bc, content_crumb_id, promotion_details_path(@organization.cp_key, @environment.name) , + _("Content"), [], {:cache =>true, :content=>render(:partial=>"detail")}) + add_crumb_node!(bc, "all_errata", promotion_errata_path(@organization.cp_key, @environment.name), + _("All Errata"), [content_crumb_id], {:scrollable=>true}) + add_crumb_node!(bc, products_crumb_id, promotion_products_path(@organization.cp_key, @environment.name), + _("Products"), [content_crumb_id], {:cache=>true, :content=>render(:partial=>"products", :locals=>{:products=>@products, :changeset=>@changeset})}) + + for prod in @products + product_id = product_bc_id(prod) + #top of this product + add_crumb_node!(bc, product_id, promotion_details_path(@organization.cp_key, @environment.name, :product_id=>prod.id), + prod.name, [content_crumb_id,products_crumb_id], {:cache=>true, :content=>render(:partial=>"detail", :locals=>{:product=>prod})}) + + #product,packages + add_crumb_node!(bc, packages_bc_id(prod), promotion_packages_path(@organization.cp_key, @environment.name, :product_id=>prod.id, :changeset_id=>changeset_id(@changeset)), + _("Packages"), [content_crumb_id,products_crumb_id, product_id], {:scrollable=>true}) + + #product_errata + add_crumb_node!(bc, errata_bc_id(prod), promotion_errata_path(@organization.cp_key, @environment.name, :product_id=>prod.id, :changeset_id=>changeset_id(@changeset)), + _("Errata"), [content_crumb_id,products_crumb_id, product_id], {:scrollable=>true}) + + #product_repos + add_crumb_node!(bc, repo_bc_id(prod), promotion_repos_path(@organization.cp_key, @environment.name, :product_id=>prod.id, :changeset_id=>changeset_id(@changeset)), + _("Repos"), [content_crumb_id,products_crumb_id, product_id], {:scrollable=>true}) + end + bc.to_json + end + + def add_crumb_node! hash, id, url, name, trail, params={} + cache = false || params[:cache] #default to false + hash[id] = {:name=>name, :url=>url, :trail=>trail, :cache=>cache} + hash[id][:content] = params[:content] if params[:content] + hash[id][:scrollable] = true if params[:scrollable] + end + + + def product_bc_id product + "details_#{product.id}" + end + + def packages_bc_id product + "packages_#{product.id}" + end + + def errata_bc_id product + "errata_#{product.id}" + end + + def repo_bc_id product + "repo_#{product.id}" + end + + def changeset_id cs + return cs.id if cs + end + +end diff --git a/app/helpers/puppetclasses_helper.rb b/app/helpers/puppetclasses_helper.rb new file mode 100644 index 00000000000..40df56b0f62 --- /dev/null +++ b/app/helpers/puppetclasses_helper.rb @@ -0,0 +1,18 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module PuppetclassesHelper + + def name_without_module(klass) + klass[:name].gsub(/^#{klass[:module]}::/,"") + end +end diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb new file mode 100644 index 00000000000..e48b6c59976 --- /dev/null +++ b/app/helpers/repositories_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module RepositoriesHelper +end diff --git a/app/helpers/roles_helper.rb b/app/helpers/roles_helper.rb new file mode 100644 index 00000000000..e86c124aa82 --- /dev/null +++ b/app/helpers/roles_helper.rb @@ -0,0 +1,38 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module RolesHelper + + def closed_id(f) + "closed_#{perm_id(f)}" + end + + def opened_id(f) + "opened_#{perm_id(f)}" + end + + def perm_id(f) + f = f.object unless Permission === f + return f.object_id if f.new_record? + f.id + end + + def get_scopes(f) + return Tag.tags_for(@resource_type_names[0]) || [] if f.object.new_record? + Tag.tags_for(f.object.resource_type.name) || [] + end + + def get_verbs(f) + return Verb.verbs_for(@resource_type_names[0]) || [] if f.object.new_record? + Verb.verbs_for(f.object.resource_type.name) || [] + end +end diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb new file mode 100644 index 00000000000..6d77ace5600 --- /dev/null +++ b/app/helpers/search_helper.rb @@ -0,0 +1,35 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module SearchHelper + def max_search_history + max_entries = AppConfig.search && AppConfig.search.max_history + max_entries.nil? ? 5 : max_entries + end + + def max_search_favorites + max_entries = AppConfig.search && AppConfig.search.max_favorites + max_entries.nil? ? 5 : max_entries + end + + def history_entries + @search_histories.length < max_search_history ? @search_histories.length : max_search_history + end + + def favorite_entries + @search_favorites.length < max_search_favorites ? @search_favorites.length : max_search_favorites + end + + def search_string search + "?search="+search.params+"#" unless search.nil? or search.params.nil? + end +end diff --git a/app/helpers/sync_management_helper.rb b/app/helpers/sync_management_helper.rb new file mode 100644 index 00000000000..2ba19076314 --- /dev/null +++ b/app/helpers/sync_management_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module SyncManagementHelper +end diff --git a/app/helpers/sync_plans_helper.rb b/app/helpers/sync_plans_helper.rb new file mode 100644 index 00000000000..34a01c8d710 --- /dev/null +++ b/app/helpers/sync_plans_helper.rb @@ -0,0 +1,2 @@ +module SyncPlansHelper +end diff --git a/app/helpers/sync_schedules_helper.rb b/app/helpers/sync_schedules_helper.rb new file mode 100644 index 00000000000..b6f5e4af918 --- /dev/null +++ b/app/helpers/sync_schedules_helper.rb @@ -0,0 +1,15 @@ +module SyncSchedulesHelper + + + def hover_format item + case item.interval + when 'daily' + _("Daily at #{item.plan_time} from #{item.plan_date} #{item.plan_zone}") + when 'weekly' + _("Every #{plan_day} at #{item.plan_time} from #{item.plan_date} #{item.plan_zone}") + else + _("Hourly from #{item.plan_date} - #{item.plan_time} #{item.plan_zone}") + end + end + +end diff --git a/app/helpers/systems_helper.rb b/app/helpers/systems_helper.rb new file mode 100644 index 00000000000..4f000b336d8 --- /dev/null +++ b/app/helpers/systems_helper.rb @@ -0,0 +1,14 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module SystemsHelper +end diff --git a/app/helpers/translation_helper.rb b/app/helpers/translation_helper.rb new file mode 100644 index 00000000000..66a4b3d4434 --- /dev/null +++ b/app/helpers/translation_helper.rb @@ -0,0 +1,27 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module TranslationHelper + def relative_time_in_words(time) + _("%{relative_time} ago") % {:relative_time => time_ago_in_words(time)} + end + + def months + t('date.month_names') + end + + def month(i) + return '' unless i + i = i.to_time.month if i.respond_to? :to_time + months[i] + end +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb new file mode 100644 index 00000000000..33001c0e47c --- /dev/null +++ b/app/helpers/users_helper.rb @@ -0,0 +1,20 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module UsersHelper + + def mask_password user + return "" if user.password.nil? + user.password.gsub(/./, "●") + end + +end diff --git a/app/models/authorization.rb b/app/models/authorization.rb new file mode 100644 index 00000000000..32ed164c907 --- /dev/null +++ b/app/models/authorization.rb @@ -0,0 +1,101 @@ +# +# Copyright © 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public License, +# version 2 (GPLv2). There is NO WARRANTY for this software, express or +# implied, including the implied warranties of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 +# along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +# +# Red Hat trademarks are not licensed under GPLv2. No permission is +# granted to use or replicate Red Hat trademarks that are incorporated +# in this software or its documentation. + +module Authorization + + def self.included(base) + base.class_eval do + before_save :enforce_update_permissions + before_destroy :enforce_destroy_permissions + before_create :enforce_create_permissions + end + end + + # this method is hooked as a callback + def enforce_update_permissions + enforce_permissions(:update) if enforce? + end + + # this method is hooked as a callback + def enforce_destroy_permissions + enforce_permissions(:destroy) if enforce? + end + + # this method is hooked as a callback + def enforce_create_permissions + enforce_permissions(:create) if enforce? + end + + # performs permission checks - do not override this method and + # create check_permissions(operation) instead and return true if permission + # is granted or call access_denied(operation) explicitely for an + # intermediate denial + def enforce_permissions operation + # we get called again with the operation being set to create + return true if operation == :update and new_record? + + # method A - developer defined permissions (can veto using SecurityViolation) + if respond_to? :check_permissions + return true if check_permissions operation + end + + # method B - database (user) defined permissions + return true if enforce_db_permissions operation + + # authorization unsuccessful + access_denied operation + end + + private + + def type_name + "ar_#{self.class.table_name}" + end + + # enforce permissions from database for regular users + def enforce_db_permissions(operation) + User.allowed_to?(operation, type_name, self.id.to_s) or User.allowed_to?(operation, type_name) + end + + def access_denied(operation) + strid = self.id ? "(id = #{self.id})" : '' + struser = User.current.nil? ? "anonymous" : User.current.username + msg = "User #{struser} doesn't have permission to #{operation} the #{type_name} #{strid}" + Rails.logger.warn msg + raise Errors::SecurityViolation, msg + end + + def enforce? + return false + # TODO - do we want to introduce "superadmin" flag? + #return false if (User.current and User.current.superadmin?) + return false if Rails.env == "test" + return false if defined?(Rake) + true + end + +end + +# This class is a "fake" model Tag. It is returned by model objects to the +# view layer to present possible tags which can be assigned to permissions. +class VirtualTag + attr_accessor :name, :display_name + + def initialize(name, display_name) + raise ArgumentError, "Name cannot be nil or empty" if name.nil? or name == '' + raise ArgumentError, "Display name cannot be nil or empty" if display_name.nil? or display_name == '' + self.name = name + self.display_name = display_name + end +end diff --git a/app/models/changeset.rb b/app/models/changeset.rb new file mode 100644 index 00000000000..7f0544f8290 --- /dev/null +++ b/app/models/changeset.rb @@ -0,0 +1,161 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Changeset < ActiveRecord::Base + include Authorization + before_create :generate_name + + NEW = 'new' + REVIEW = 'review' + PROMOTED = 'promoted' + STATES = [NEW, REVIEW, PROMOTED] + + validates_inclusion_of :state, + :in => STATES, + :allow_blank => false, + :message => "A changeset must have one of the following states: #{STATES.join(', ')}." + + + has_and_belongs_to_many :products + has_many :packages, :class_name=>"ChangesetPackage", :inverse_of=>:changeset + has_many :errata, :class_name=>"ChangesetErratum", :inverse_of=>:changeset + has_many :repos, :class_name=>"ChangesetRepo", :inverse_of => :changeset + belongs_to :environment, :class_name=>"KPEnvironment" + before_save :uniquify_artifacts + + + + def generate_name + self.name = I18n.l(DateTime.now, :format=>:long) if name.blank? + end + + + def key_for item + "changeset_#{id}_#{item}" + end + + def package_ids + packages.collect{|pack| pack.package_id} + end + + def errata_ids + errata.collect{|erratum| erratum.errata_id} + end + + + def dependencies + repoids = [] + + prior = self.environment.prior + prior ||= self.environment.organization.locker #if no prior, then prior must be locker + + #get source repos to depsolve for + prior.products.each{|prod| + repoids += prod.repos(prior).collect{|repo| repo.id} + } + + #TODO look up NEVRA from pulp instead of relying on display_name + # will this be too expensive? should display_name be "formalized" + changelog_pkgs = self.packages.collect{|pkg| pkg.display_name} + + + #pulp can't handle an empty package list + return [] if changelog_pkgs.empty? + + all_pkgs = Pulp::Package.dep_solve(changelog_pkgs, repoids).collect do |package| + Glue::Pulp::Package.new(package) + end + + #remove pkgs that are in the next environment's repos + repo_pkg_ids = [] + if environment + environment.products do |prod| + prod.repos do |repo| + repo_pkg_ids += repo.packages.collect{|pkg| pkg.id} + end + end + end + + uniq_pkgs = [] + all_pkgs.each {|pkg| + uniq_pkgs << pkg if repo_pkg_ids.index(pkg.id).nil? + } + + uniq_pkgs + + end + + # returns list of virtual permission tags for the current user + def self.list_tags + select('id,name').all.collect { |m| VirtualTag.new(m.id, m.name) } + end + + def promote + self.products.each do |product| + product.promote self, self.environment + end + + #repo->list of pkg_ids + pkgs_promote = {} + + + #Identify which repos need what packages + #self.environment.products.each do |product| + #skip the product if we are promoting it anyways + # next if self.products.include?(product) + # product.repos(self).each do |repo| + #bring in the clones, for caching + # clones = [] + # repo.clone_ids.each{|id| clones << Glue::Pulp::Repo.find(id)} + + # self.packages.each do |pkg| + #if this repo has the package and the clone doesn't, then we should promote it + # if repo.has_package? pkg.package_id + # clones.each do |clone| + # if !clone.has_package? pkg.package_id + # pkgs_promote[clone] ||= [] + # pkgs_promote[clone] << pkg.package_id + # end + # end + # end + # end + # end + # end + + #pkgs_promote.each_pair do |repo, pkgs| + # repo.add_packages(pkgs) + #end + + self.promotion_date = Time.now + self.state = Changeset::PROMOTED + self.save! + + end + + private + def uniquify_artifacts + self.products.uniq! unless self.products.nil? + [[:packages,:package_id],[:errata, :errata_id],[:repos, :repo_id]].each do |items, item_id| + unless self.send(items).nil? + s = Set.new + # for some reason uniq! with a closure didn''t work + # so invented an equivalent + self.send(items).reject! do |item| + includes = s.include? item.send(item_id) + s.add(item.send(item_id)) unless includes + includes + end + end + end + end + +end diff --git a/app/models/changeset_erratum.rb b/app/models/changeset_erratum.rb new file mode 100644 index 00000000000..d0aaade42b1 --- /dev/null +++ b/app/models/changeset_erratum.rb @@ -0,0 +1,23 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class ChangesetErratum < ActiveRecord::Base + include Authorization + + + belongs_to :changeset, :inverse_of=>:errata + + # returns list of virtual permission tags for the current user + def self.list_tags + select('id,display_name').all.collect { |m| VirtualTag.new(m.id, m.display_name) } + end +end diff --git a/app/models/changeset_package.rb b/app/models/changeset_package.rb new file mode 100644 index 00000000000..5fbba4c8d10 --- /dev/null +++ b/app/models/changeset_package.rb @@ -0,0 +1,23 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class ChangesetPackage < ActiveRecord::Base + include Authorization + + + belongs_to :changeset, :inverse_of=>:packages + + # returns list of virtual permission tags for the current user + def self.list_tags + select('id,display_name').all.collect { |m| VirtualTag.new(m.id, m.display_name) } + end +end diff --git a/app/models/changeset_repo.rb b/app/models/changeset_repo.rb new file mode 100644 index 00000000000..6acb84f7c9c --- /dev/null +++ b/app/models/changeset_repo.rb @@ -0,0 +1,19 @@ +# +# Copyright © 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public License, +# version 2 (GPLv2). There is NO WARRANTY for this software, express or +# implied, including the implied warranties of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 +# along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +# +# Red Hat trademarks are not licensed under GPLv2. No permission is +# granted to use or replicate Red Hat trademarks that are incorporated +# in this software or its documentation. + +class ChangesetRepo < ActiveRecord::Base + + belongs_to :changeset, :inverse_of=>:repos + +end diff --git a/app/models/cp_consumer_user.rb b/app/models/cp_consumer_user.rb new file mode 100644 index 00000000000..4f66d0b5c23 --- /dev/null +++ b/app/models/cp_consumer_user.rb @@ -0,0 +1,21 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class CpConsumerUser < User + + attr_accessor :uuid + + def oauth_header + { 'cp-consumer' => self.uuid } + end + +end \ No newline at end of file diff --git a/app/models/errors.rb b/app/models/errors.rb new file mode 100644 index 00000000000..459729c9c43 --- /dev/null +++ b/app/models/errors.rb @@ -0,0 +1,22 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module Errors + class NotFound < StandardError; end + + # unauthorized access + class SecurityViolation < StandardError; end + + class OrchestrationException < StandardError; end + + class TemplateContentException < StandardError; end +end diff --git a/app/models/glue.rb b/app/models/glue.rb new file mode 100644 index 00000000000..68fc106db1d --- /dev/null +++ b/app/models/glue.rb @@ -0,0 +1,152 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'queue' +require 'errors' + +module Glue + def self.included(base) + base.send :include, InstanceMethods + base.class_eval do + attr_reader :old + + before_validation :setup_clone + + around_save :on_save + around_destroy :on_destroy + end + end + + module InstanceMethods + + def on_save + process queue + yield + @orchestration_for = nil + end + + def on_destroy + return false unless errors.empty? + + process(queue) + yield + @orchestration_for = nil + end + + # type of operation for this orchestration, ie: crud, product promotion + def orchestration_for + @orchestration_for ||= new_record? ? :create : :update + end + + def orchestration_for=(val) + @orchestration_for = val.to_sym + end + + def rollback + raise ActiveRecord::Rollback + end + + def queue + @queue ||= Queue.new + end + + public + # we override this method in order to include checking the + # after validation callbacks status, as rails by default does + # not care about their return status. + def valid?(context = nil) + super + errors.empty? + end + + # we override the destroy method, in order to ensure our queue exists before other callbacks + # and to process the queue only if we found no errors + def destroy + @orchestration_for ||= :destroy + queue + super + end + + def proxy_error e + (e.respond_to?(:response) and !e.response.nil?) ? e.response : e + end + + protected + # Handles the actual queue + # takes care for running the tasks in order + # if any of them fail, it rollbacks all completed tasks + # in order not to keep any left overs in our proxies. + def process q + # queue is empty - nothing to do. + return if q.empty? + + # process all pending tasks + q.pending.each do |task| + # if we have failures, we don't want to process any more tasks + next unless q.failed.empty? + task.status = "running" + task.status = execute({:action => task.action}) ? "completed" : "failed" + end + + # if we have no failures - we are done + return true if (errors.empty? && q.failed.empty?) + raise Errors::OrchestrationException.new("Errors occured during orchestration") + rescue => e + logger.debug "Rolling back due to a problem: #{q.failed}" + # handle errors + # we try to undo all completed operations and trigger a DB rollback + (q.completed + q.running).sort.reverse_each do |task| + begin + task.status = "rollbacked" + execute({:action => task.action, :rollback => true}) + rescue => rollback_exception + # if the operation failed, we can just report upon it + errors.add :base, "Failed to perform rollback on #{task.name} - #{rollback_exception}" + end + end + + raise e + end + + def execute opts = {} + obj, met, *args = opts[:action] + rollback = opts[:rollback] || false + # at the moment, rollback are expected to replace set with del in the method name + if rollback + met = met.to_s + case met + when /set/ + met.gsub!("set","del") + when /del/ + met.gsub!("del","set") + else + raise "Dont know how to rollback #{met}" + end + met = met.to_sym + end + if obj.respond_to?(met) + return args.empty? ? obj.send(met) : obj.send(met, *args) + else + raise Errors::OrchestrationException.new("invalid method #{met}") + end + end + + def setup_clone + return if new_record? + @old = clone + for key in (changed_attributes.keys - ["updated_at"]) + @old.send "#{key}=", changed_attributes[key] + end + end + + end +end diff --git a/app/models/glue/candlepin/consumer.rb b/app/models/glue/candlepin/consumer.rb new file mode 100644 index 00000000000..ad6dc64b6e4 --- /dev/null +++ b/app/models/glue/candlepin/consumer.rb @@ -0,0 +1,170 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/candlepin' + +module Glue::Candlepin::Consumer + + def self.included(base) + base.send :include, LazyAccessor + base.send :include, InstanceMethods + + base.class_eval do + before_save :save_consumer_orchestration + before_destroy :destroy_consumer_orchestration + + lazy_accessor :href, :facts, :cp_type, :href, :idCert, :owner, :lastCheckin, :created, :initializer => lambda { consumer_json = Candlepin::Consumer.get(uuid); convert_from_cp_fields(consumer_json) } + lazy_accessor :entitlements, :initializer => lambda { Candlepin::Consumer.entitlements(uuid) } + lazy_accessor :pools, :initializer => lambda { entitlements.collect { |ent| Candlepin::Pool.get ent["pool"]["id"]} } + lazy_accessor :available_pools, :initializer => lambda { Candlepin::Consumer.available_pools(uuid) } + end + end + + module InstanceMethods + + def initialize(attrs = nil) + if attrs.nil? + super + elsif + type_key = attrs.has_key?('type') ? 'type' : :type + #rename "type" to "cp_type" (activerecord and candlepin variable name conflict) + if attrs.has_key?(type_key) && !(attrs.has_key?(:cp_type) || attrs.has_key?('cp_type')) && new_record? + attrs[:cp_type] = attrs[type_key] + end + + attrs_used_by_model = attrs.reject do |k, v| + !attributes_from_column_definition.keys.member?(k.to_s) && (!respond_to?(:"#{k.to_s}=") rescue true) + end + + super(attrs_used_by_model) + end + end + + def validate + if new_record? + validates_inclusion_of :cp_type, :in => %w( system ) + validates_presence_of :facts + end + end + + def set_consumer + Rails.logger.info "Creating a consumer in candlepin: #{name}" + consumer_json = Candlepin::Consumer.create(self.name, self.cp_type, self.facts) + + self.uuid = consumer_json[:uuid] + convert_from_cp_fields(consumer_json).each do |k,v| + instance_variable_set("@#{k}", v) if respond_to?("#{k}=") + end + + # TODO: this will have to change once cp disambiguates owners explicitly (for example, based on url) + organization = Organization.first(:conditions => {:cp_key => consumer_json[:owner][:key]}) + raise _("Couldn't find organization '#{consumer_json[:owner][:key]}'") if organization.nil? + self.organization = organization + rescue => e + Rails.logger.error "Failed to create candlepin consumer #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def update_consumer + return true if @facts.nil? + + Rails.logger.info "Updating consumer in candlepin: #{name}" + Candlepin::Consumer.update(self.uuid, self.facts) + rescue => e + Rails.logger.error "Failed to update candlepin consumer #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def del_consumer + Rails.logger.info "Deleteing consumer in candlepin: #{name}" + Candlepin::Consumer.destroy(self.uuid) + rescue => e + Rails.logger.error "Failed to delete candlepin consumer #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def regenerate_identity_certificates + Rails.logger.info "Regenerating consumer identity certificates: #{name}" + Candlepin::Consumer.regenerate_identity_certificates(self.uuid) + rescue => e + Rails.logger.debug e.backtrace.join("\n\t") + raise e + end + + def subscribe pool + Rails.logger.info "Subscribing to pool '#{pool}' for : #{name}" + Candlepin::Consumer.consume_entitlement self.uuid, pool + rescue => e + Rails.logger.debug e.backtrace.join("\n\t") + raise e + end + + def unsubscribe pool + Rails.logger.info "Unsubscribing to pool '#{pool}' for : #{name}" + ents = self.entitlements.collect {|ent| ent["id"] if ent["pool"]["id"] == pool}.compact + ents.each { |ent| + Candlepin::Consumer.remove_entitlement self.uuid, ent + } + rescue => e + Rails.logger.debug e.backtrace.join("\n\t") + raise e + end + + def to_json + super(:methods => [:href, :facts, :idCert, :owner]) + end + + def convert_from_cp_fields(cp_json) + cp_json.merge(:cp_type => cp_json.delete(:type)) if cp_json.has_key?(:type) + reject_db_columns(cp_json) + end + + def reject_db_columns(cp_json) + cp_json.reject {|k,v| attributes_from_column_definition.keys.member?(k.to_s) } + end + + def save_consumer_orchestration + case orchestration_for + when :create + queue.create(:name => "create candlepin consumer: #{self.name}", :priority => 3, :action => [self, :set_consumer]) + when :update + queue.create(:name => "update candlepin consumer: #{self.name}", :priority => 3, :action => [self, :update_consumer]) + end + end + + def destroy_consumer_orchestration + queue.create(:name => "delete candlepin consumer: #{self.name}", :priority => 3, :action => [self, :del_consumer]) + end + + def hostname + facts["network.hostname"] + end + + def ip + facts.keys().grep(/eth.*ipaddr/).collect { |k| facts[k]}.first + end + + def kernel + facts["uname.release"] + end + + def arch + facts["uname.machine"] + end + + def distro + facts["distribution.name"] + end + + end + +end diff --git a/app/models/glue/candlepin/owner.rb b/app/models/glue/candlepin/owner.rb new file mode 100644 index 00000000000..72da0fc2b75 --- /dev/null +++ b/app/models/glue/candlepin/owner.rb @@ -0,0 +1,87 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/candlepin' + +module Glue::Candlepin::Owner + + def self.included(base) + base.send :include, InstanceMethods + base.class_eval do + before_save :save_owner_orchestration + before_destroy :destroy_owner_orchestration + + validates :cp_key, + :presence => true, + :format => { :with => /^[\w-]*$/ } + end + end + + module InstanceMethods + def set_owner + Rails.logger.info "Creating an owner in candlepin: #{name}" + Candlepin::Owner.create(cp_key, name) + rescue => e + Rails.logger.error "Failed to create candlepin owner #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def set_owner_user + Rails.logger.info "Creating a user for owner in candlepin: #{name}" + uname = get_user_name + Candlepin::Owner.create_user(cp_key, uname, uname) + rescue => e + Rails.logger.error "Failed to create user for candlepin owner #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def set_kp_user + Rails.logger.info "Creating katello user for owner user: #{name}" + uname = get_user_name + cp_role = Role.candlepin_role + User.create!(:username => uname, + :password => uname, + :roles => cp_role.nil? ? [] : [ Role.candlepin_role ]) + rescue => e + Rails.logger.error "Failed to create katello user #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def del_owner + Rails.logger.info "Deleteing owner in candlepin: #{name}" + Candlepin::Owner.destroy(cp_key) + rescue => e + Rails.logger.error "Failed to delete candlepin owner #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def save_owner_orchestration + case self.orchestration_for + when :create + queue.create(:name => "candlepin owner for organization: #{self.name}", :priority => 3, :action => [self, :set_owner]) + # TODO: the following two steps are very temporary. currently candlepin (in some cases) disambiguates owner based on credentials of the super admin + queue.create(:name => "candlepin user for owner: #{self.name}", :priority => 4, :action => [self, :set_owner_user]) + queue.create(:name => "kaplana user for owner: #{self.name}", :priority => 5, :action => [self, :set_kp_user]) + end + end + + def destroy_owner_orchestration + queue.create(:name => "candlepin owner for organization: #{self.name}", :priority => 3, :action => [self, :del_owner]) + end + + private + def get_user_name + self.name.downcase.gsub(/\W/,"_") + "_user" + end + end + +end diff --git a/app/models/glue/candlepin/product.rb b/app/models/glue/candlepin/product.rb new file mode 100644 index 00000000000..281e98c7568 --- /dev/null +++ b/app/models/glue/candlepin/product.rb @@ -0,0 +1,199 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/candlepin' + +module Glue::Candlepin::Product + + def self.included(base) + base.send :include, LazyAccessor + base.send :include, InstanceMethods + + base.class_eval do + lazy_accessor :productContent, :multiplier, :href, :attrs, + :initializer => lambda { convert_from_cp_fields(Candlepin::Product.get(cp_id)[0]) } + # Entitlement Certificate for this product + lazy_accessor :certificate, + :initializer => lambda { Candlepin::Product.certificate(cp_id) }, + :unless => lambda { cp_id.nil? } + # Entitlement Key for this product + lazy_accessor :key, :initializer => lambda { Candlepin::Product.key(cp_id) }, :unless => lambda { cp_id.nil? } + + before_save :save_product_orchestration + before_destroy :destroy_product_orchestration + end + end + + module InstanceMethods + + def initialize(attrs = nil) + unless attrs.nil? + attributes_key = attrs.has_key?(:attributes) ? :attributes : 'attributes' + if attrs.has_key?(attributes_key) + attrs[:attrs] = attrs[attributes_key] + attrs.delete(attributes_key) + end + + @productContent = [] unless attrs.has_key?(:productContent) + + # ugh. hack-ish. otherwise we have to modify code every time things change on cp side + attrs = attrs.reject do |k, v| + !attributes_from_column_definition.keys.member?(k.to_s) && (!respond_to?(:"#{k.to_s}=") rescue true) + end + end + + super(attrs) + end + + def build_productContent(attrs) + @productContent = attrs.collect { |pc| Glue::Candlepin::ProductContent.new pc } + end + + def arch + attrs.each do |attr| + return attr[:value] if attr[:name] == 'arch' + end + default_arch + end + + def default_arch + "noarch" + end + + def convert_from_cp_fields(cp_json) + ar_safe_json = cp_json.has_key?(:attributes) ? cp_json.merge(:attrs => cp_json.delete(:attributes)) : cp_json + ar_safe_json[:productContent] = ar_safe_json[:productContent].collect { |pc| Glue::Candlepin::ProductContent.new pc } + ar_safe_json.except('id') + end + + def set_product + Rails.logger.info "Creating a product in candlepin: #{name}" + json = Candlepin::Product.create({ + :name => self.name, + :multiplier => self.multiplier || 1, + :attributes => self.attrs || [] # name collision with ActiveRecord + }) + self.cp_id = json[:id] + rescue => e + Rails.logger.error "Failed to create candlepin product #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + + def del_product + Rails.logger.info "Deleting product in candlepin: #{name}" + Candlepin::Product.destroy self.cp_id + rescue => e + Rails.logger.error "Failed to delete candlepin product #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + + def set_content + self.productContent.each do |pc| + Rails.logger.info "Creating content in candlepin: #{pc.content.name}" + #TODO: use json returned from cp to populate productContent + new_content = Candlepin::Content.create pc.content + pc.content.id = new_content[:id] + end + rescue => e + Rails.logger.error "Failed to create content for product in candlepin #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def add_new_content(name, path, repo_type) + # create new content + pc = Glue::Candlepin::ProductContent.new({:content => { + :name => name, + :contentUrl => path, + :type => repo_type, + :label => name, + :vendor => "Custom" + } + }) + + self.productContent_will_change! + self.productContent << pc + pc + end + + def add_content + self.productContent.each do |pc| + Rails.logger.info "Adding content to product '#{self.cp_id}' in candlepin: #{pc.content.name}" + Candlepin::Product.add_content cp_id, pc.content.id, pc.enabled + end + rescue => e + Rails.logger.error "Failed to create content for product in candlepin #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def update_content + return true unless productContent_changed? + + old_content = productContent_change[0].nil? ? [] : productContent_change[0].map {|pc| pc.hash} + new_content = productContent_change[1].map {|pc| pc.hash} + + added_content = new_content - old_content + deleted_content = old_content - new_content + + self.productContent.select {|pc| deleted_content.include?(pc.hash)}.each do |pc| + Rails.logger.debug "deleting content #{pc.content.id}" + Candlepin::Content.destroy(pc.content.id) + end + + self.productContent.select {|pc| added_content.include?(pc.hash)}.each do |pc| + Rails.logger.debug "creating content #{pc.content.name}" + new_content = Candlepin::Content.create pc.content + pc.content.id = new_content[:id] # candlepin generates id for new content + + Rails.logger.debug "adding content #{pc.content.id}" + Candlepin::Product.add_content cp_id, pc.content.id, pc.enabled + end + end + + def create_unlimited_subscription + Rails.logger.info "Creating unlimited subscription for product #{name} in candlepin" + Candlepin::Product.create_unlimited_subscription self.organization.cp_key, self.cp_id + rescue => e + Rails.logger.error "Failed to create unlimited subscription for product in candlepin #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def delete_subscriptions + Rails.logger.info "Deleting subscriptions for product #{name} in candlepin" + Candlepin::Product.delete_subscriptions self.organization.cp_key, self.cp_id + rescue => e + Rails.logger.error "Failed to delete unlimited subscription for product in candlepin #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def save_product_orchestration + case self.orchestration_for + when :create + queue.create(:name => "candlepin product: #{self.name}", :priority => 3, :action => [self, :set_product]) + queue.create(:name => "candlepin content: #{self.name}", :priority => 4, :action => [self, :set_content]) + queue.create(:name => "add content to product in candlepin: #{self.name}", :priority => 5, :action => [self, :add_content]) + # we create unlimited subscriptions for generic yum providers + if self.provider and self.provider.yum_repo? + queue.create(:name => "create unlimited subscription for product in candlepin: #{self.name}", :priority => 7, :action => [self, :create_unlimited_subscription]) + end + when :update, :promote + queue.create(:name => "update candlepin product: #{self.name}", :priority =>3, :action => [self, :update_content]) + end + end + + def destroy_product_orchestration + queue.create(:name => "delete subscriptions for product in candlepin: #{self.name}", :priority => 7, :action => [self, :delete_subscriptions]) + queue.create(:name => "candlepin product: #{self.name}", :priority => 8, :action => [self, :del_product]) + end + end +end diff --git a/app/models/glue/candlepin/product_content.rb b/app/models/glue/candlepin/product_content.rb new file mode 100644 index 00000000000..011ac587096 --- /dev/null +++ b/app/models/glue/candlepin/product_content.rb @@ -0,0 +1,29 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module Glue::Candlepin + + class ProductContent + attr_accessor :content, :enabled + def initialize(params = {}) + @enabled = params[:enabled] || params["enabled"] + @content = Content.new(params[:content] || params["content"]) + end + end + + class Content + attr_accessor :name, :id, :type, :label, :vendor, :contentUrl, :gpgUrl + def initialize(params = {}) + params.each_pair {|k,v| instance_variable_set("@#{k}", v) unless v.nil? } + end + end +end diff --git a/app/models/glue/provider.rb b/app/models/glue/provider.rb new file mode 100644 index 00000000000..903bde2f523 --- /dev/null +++ b/app/models/glue/provider.rb @@ -0,0 +1,169 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require_dependency 'resources/candlepin' + +module Glue::Provider + + def self.included(base) + base.send :include, InstanceMethods + base.class_eval do + before_save :save_products_orchestration + before_destroy :destroy_products_orchestration + end + end + + module InstanceMethods + + def import_manifest zip_file_path + Rails.logger.info "Importing manifest for provider #{name}" + queue_import_manifest zip_file_path + process queue + end + + def sync + Rails.logger.info "Syncing provider #{name}" + self.products.each do |p| + Rails.logger.info "Syncing product #{p.name}" + p.sync + end + end + + def cancel_sync + Rails.logger.info "Cancelling synchronization of provider #{name}" + self.products.each do |p| + Rails.logger.info "Cancelling synchronization of product #{p.name}" + p.cancel_sync + end + end + + def add_custom_product(name, description, url) + Product.new() + # URL isn't used yet until we can do custom repo discovery in pulp + begin + Rails.logger.info "Creating custom product #{name} for provider: #{self.name}" + product = Product.new({ + :name => name, + :description => description, + :multiplier => 1 + }) + self.products << product + product.provider = self + product.environments << self.organization.locker + product.save! + product + rescue => e + Rails.logger.error "Failed to create custom product #{name} for provider #{self.name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + end + + def update_products + Rails.logger.info "Updating products for provider: #{name}" + self.products.each do |p| + p.provider = self + p.update_attributes!({ + :productContent => [Glue::Candlepin::ProductContent.new(:content => {:id => p.name})] # FIX ME: don't think this is correct + }) + #update name only for custom products + if p.name == old.name + p.update_attributes!({:name => name}) + end + end + rescue => e + Rails.logger.error "Failed to update products for provider #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def url_to_host_and_path(url = "") + parsed = URI.parse(url) + ["#{parsed.scheme}://#{parsed.host}#{ parsed.port ? ':' + parsed.port.to_s : '' }", parsed.path] + end + + def del_products + Rails.logger.info "Deleting all products #{name} for provider: #{name}" + self.products.each do |p| + p.destroy + end + rescue => e + Rails.logger.error "Failed to delete all products #{name} for provider #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def set_product attrs + Rails.logger.info "Creating product #{attrs['name']} for provider: #{name}" + productContent_attrs = attrs.delete(:productContent) if attrs.has_key?(:productContent) + product = Product.new(attrs) do |p| + p.provider = self + p.environments << self.organization.locker + p.productContent = p.build_productContent(productContent_attrs) + end + product.save! + rescue => e + Rails.logger.error "Failed to create product #{attrs['name']} for provider #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def del_product attrs + Rails.logger.info "Deleting product #{attrs['name']} for provider: #{name}" + Product.first(:conditions => {:cp_id => attrs['id']}).destroy + rescue => e + Rails.logger.error "Failed to delete product #{attrs['name']} for provider #{name}: #{e}, #{e.backtrace.join("\n")}" + raise e + end + + def owner_import zip_file_path + Candlepin::Owner.import self.organization.cp_key, zip_file_path + end + + def queue_import_manifest zip_file_path + queue.create(:name => "import manifest #{zip_file_path} for owner: #{self.organization.name}", :priority => 3, :action => [self, :owner_import, zip_file_path]) + queue.create(:name => "import of products in manifest #{zip_file_path}", :priority => 5, :action => [self, :queue_pool_product_creation]) + end + + def queue_create_product attrs + queue.create(:name => "create product imported from candlepin: #{attrs['name']}", :priority => 4, :action => [self, :set_product, attrs]) + end + + def queue_pool_product_creation + pools = Candlepin::Owner.pools self.organization.cp_key + product_ids = pools.collect do |pool| + provided_products = pool[:providedProducts] + pool_product_ids = [] + pool_product_ids = provided_products.collect {|provided| provided[:productId]} unless provided_products.nil? + # Done with provided products, lets add the *actual* product + pool_product_ids << pool[:productId] + end.flatten.uniq + + existing_product_ids = self.organization.locker.products.all(:select => "cp_id").map(&:cp_id) + products_to_create = (product_ids - existing_product_ids).collect {|id| (Candlepin::Product.get(id))[0] } + + products_to_create.each do |p| + Rails.logger.info "product: "+p.to_json + queue_create_product p + end + process queue + end + + def save_products_orchestration + case self.orchestration_for + when :update + queue.create(:name => "update products for provider: #{self.name}", :priority => 3, :action => [self, :update_products]) + end + end + + def destroy_products_orchestration + queue.create(:name => "delete custom product for provider: #{self.name}", :priority => 1, :action => [self, :del_products]) + end + end + +end diff --git a/app/models/glue/pulp/distribution.rb b/app/models/glue/pulp/distribution.rb new file mode 100644 index 00000000000..1f78133d531 --- /dev/null +++ b/app/models/glue/pulp/distribution.rb @@ -0,0 +1,31 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require_dependency "resources/pulp" + +class Glue::Pulp::Distribution + attr_accessor :id, :description, :files + + def initialize(attrs = {}) + + attrs.each_pair do |k,v| + if Glue::Pulp::Distribution.method_defined? k and not v.nil? + instance_variable_set("@#{k}", v) if Glue::Pulp::Distribution.method_defined? k + end + end + end + + def self.find id + Glue::Pulp::Distribution.new(Pulp::Distribution.find(id)) + end + +end \ No newline at end of file diff --git a/app/models/glue/pulp/errata.rb b/app/models/glue/pulp/errata.rb new file mode 100644 index 00000000000..6d297da666f --- /dev/null +++ b/app/models/glue/pulp/errata.rb @@ -0,0 +1,43 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require_dependency "resources/pulp" + +class Glue::Pulp::Errata + attr_accessor :id, :title, :description, :version, :release, :type, :status, :updated, :issued, :from_str, :reboot_suggested, :references, :pkglist + + def initialize(params = {}) + params.each_pair {|k,v| instance_variable_set("@#{k}", v) unless v.nil? } + end + + def self.find id + Glue::Pulp::Errata.new(Pulp::Errata.find(id)) + end + +# def self.find id +# case (id.to_i % 4).to_s +# when "0" +# Glue::Pulp::Errata.new({:id => id, :title => "RHBA-2011:#{ "%04d" % id}", :description=>"The device-mapper-multipath package provides tools to manage multipath devices using the device-mapper multipath kernel module.\n\nThe advisory text was updated on the 27th of April, 2011 with the following bug description:\n\n* Installing the device-mapper-multipath RPM package could have caused the default installed /etc/kpartx.conf configuration file to be modified. As a consequence, verifying the package with the 'rpm -V' failed due to the /etc/kpartx.conf file's size, md5sum, and last modification time having been changed. This update adds flags to the device-mapper-multipath package's spec file that inform rpm that the size, md5sum and modification time of the /etc/kpartx.conf file may change, with the result that verifying the package now succeeds in this situation. (BZ#588753)\n\nThe advisory text was updated on the 27th of April, 2011 with the following two workaround descriptions:\n\n* When the /var directory was mounted on a separate file system from the root directory ('/'), the association between mpath[n] device names and device WWIDs could have been become inconsistent. As a workaround, a bindings_file configuration option now provides a consistent mapping between mpath[n] and WWID device names. Refer to the Release Notes link provided in the References section of this erratum for further details. (BZ#509095)\n\n* Multipath is unable to reconfigure a multipath device while the multipathd service is running, or add new paths to the device. A workaround for this issue is provided in the 4.9 Release Notes, which are linked to in the References section of this advisory. (BZ#487443)\n\n[The original advisory text follows]\n\nThis update provides fixes for the following bugs:\n\n* The direction path checker occasionally dropped paths due to a too short limit for the IO. The direction checker now waits asychronously for the IO with a 30 second limit per path. (BZ#500580)\n\n* When gathering path information, multipath did not wait long enough for some sysfs files to be created. This caused it to not create some devices. It will now wait up to a minute, unless it notices that the sysfs device directory has been removed, in which case it exits early. (BZ#511034)\n\n* Multipath gave incorrect path groupings for multipath devices configured to use 'group_by_node_name'. This was due to an incorrect reporting of the target node name for iSCSI (Internet Small Computer System Interface) targets. With this update multipath checks the iSCSI target name if the fc check fails. (BZ#512065)\n\n* Multipath could have occasionally consumed a large amount of memory. This was caused by improper setting of thread size. With this update, the thread size setting is adjusted and the issue no longer occurs. (BZ#516253)\n\n* Previously, kpartx could have made incorrect partitions for devices with minor numbers greater than 255. This happened due to a mistake in calculation of minor number of devices. This update fixes the calculation procedure and the issue is fixed. (BZ#528734)\n\n* Multipathd occasionally used an incorrect UID/GID/MODE setting for the devices it created, if these were defined in multipath.conf. This was due to a race between udevd and multipathd. With this update, the issue no longer occurs. (BZ#531131)\n\n* If a multipath device configured with queue_if_no_path with no working paths was created while booting, and multipathd was not running, the machine did not boot. init scripts must call multipath with the -q option that forces multipath to disable queuing on all devices. (BZ#575244)\n\nIn addition, this updated package provides the following enhancements:\n\n* The multipath.conf file contains a new option 'queue_without_daemon' with the 'yes' default setting. If set to 'no', multipathd disables queue_if_no_paths on all devices. (BZ#488921)\n\n* A default configuration for HP HSVX700 is added. (BZ#623468)\n\nAll device-mapper-multipath users are advised to upgrade to this updated package, which resolves these issues and adds these enhancements.", +# :type=>"Bugfix", :issued=>"1/2/2011", :updated=>"1/5/2011", :references=>[], :pkglist => ["device-mapper-multipath-0.4.5-42.el6.i386", "device-mapper-multipath-0.4.5-42.el6.x86_64"]}) +# when "1" +# Glue::Pulp::Errata.new({:id => id, :title => "RHBA-2011:#{ "%04d" % id}", :description=>"The Cluster Manager (cman) utility provides user-level services for managing a Linux cluster.\n\nThis update fixes the following bug:\n\n* Previous versions of the ccs_tool utility did not allow users to specify the port numbers to use when distributing the configuration. Consequent to this, changing the port numbers for Cluster Manager components rendered this utility unable to establish a connection with a cluster. With this update, the ccs_tool utility now allows users to specify the port numbers on the command line, so that the connection can be established as expected. (BZ#677814)\n\nAll users of cman are advised to upgrade to this updated package, which fixes this bug.", +# :type=>"Bugfix", :issued=>"4/28/11", :updated=>"4/28/11", :references=>[], :pkglist => ["cman-devel-2.0.115-68.el6_6.3.i386", "cman-devel-2.0.115-68.el5_6.3.x86_64"]}) +# when "2" +# Glue::Pulp::Errata.new({:id => id, :title => "RHBA-2011:#{ "%04d" % id}", :description=>"The finger utility allows users to display information about the system users, including their login names, full names, and the time they logged in to the system.\n\n The update fixes the following bug:\n\n* When the finger utility is run with no additional command line options, itprovides output in the form of a table. Prior to this update, this tabular output did not include a separate column for information about a host, and this information was incorrectly displayed in the Office column. This update adds a new column named Host, so that the host information no longer appears in the wrong column. (BZ#563291)\n\nAll users of finger are advised to upgrade to these updated packages, which fix this bug.", +# :type=>"Bugfix", :issued=>"4/27/11", :updated=>"4/27/11", :references=>[], :pkglist => ["finger-0.17-33.i386", "finger-0.17-33.x86_64"]}) +# else +# Glue::Pulp::Errata.new({:id => id, :title => "RHBA-2011:#{ "%04d" % id}", :description=>"The traceroute utility displays the route used by IP packets on their way to a specified network (or Internet) host. Traceroute displays the IP address and hostname (if possible) of the machines along the route taken by the packets.\n\nThis update fixes the following bugs:\n\n* Prior to this update, using the '-m' command line option to specify the\nmaximum time-to-live (TTL) value in the range 1 to 5 caused the traceroute\nutility to fail with the following error:\n\nsim hops out of range\n\nThis update applies an upstream patch to ensure that all TTL values in the range from 1 to 255 are supported as expected. (BZ#461278)\n\n* Previously, using the '-l' command line option to specify the flow label of the probing packets caused the utility to fail with the following error:\n\nsetsockopt IPV6_FLOWLABEL_MGR: Operation not permitted\n\nWith this update, the underlying source code has been modified to address this issue, and using the '-l' option no longer causes traceroute to fail.\n(BZ#644297)\n\nAll users of traceroute are advised to upgrade to this updated package, which fixes these bugs.'", +# :type=>"Bugfix", :issued=>"4/27/11", :updated=>"4/27/11", :references=>[], :pkglist => ["traceroute-2.0.1-6.el6.i386", " traceroute-2.0.1-6.el6.x86_64"]}) +# end +# end + +end \ No newline at end of file diff --git a/app/models/glue/pulp/package.rb b/app/models/glue/pulp/package.rb new file mode 100644 index 00000000000..377b75faaf7 --- /dev/null +++ b/app/models/glue/pulp/package.rb @@ -0,0 +1,30 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require_dependency "resources/pulp" + +class Glue::Pulp::Package + attr_accessor :id, :name, :download_url, :checksum, :license, :group, :filename, :requires, :provides, :description, :arch, :size, :buildhost + + def initialize(params = {}) + params.each_pair {|k,v| instance_variable_set("@#{k}", v) unless v.nil? } + end + + def self.find id + Glue::Pulp::Package.new(Pulp::Package.find(id)) + end + + def nvrea + "#{@name}-#{@version}-#{@release}.#{@arch}" + end + +end \ No newline at end of file diff --git a/app/models/glue/pulp/repo.rb b/app/models/glue/pulp/repo.rb new file mode 100644 index 00000000000..0bc877bf6b0 --- /dev/null +++ b/app/models/glue/pulp/repo.rb @@ -0,0 +1,186 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Glue::Pulp::Repo + attr_accessor :id, :groupid, :arch, :name, :feed, :feed_cert, :feed_key, :feed_ca, :clone_ids, :uri_ref + + def initialize(params = {}) + params.each_pair {|k,v| instance_variable_set("@#{k}", v) unless v.nil? } + end + + SYNC_STATE_FINISHED = "finished" + SYNC_STATE_ERROR = "error" + SYNC_STATE_RUNNING = "running" + SYNC_STATE_NOT_SYNCED = "notsynced" + SYNC_STATE_WAITING = "waiting" + + TYPE_YUM = "yum" + TYPE_LOCAL = "local" + + def create + feed_cert_data = {:ca => self.feed_ca, + :cert => self.feed_cert, + :key => self.feed_key + } + Pulp::Repository.create({ + :id => self.id, + :name => self.name, + :arch => self.arch, + :feed => self.feed, + :feed_cert_data => feed_cert_data, + :groupid => self.groupid + }) + end + + def destroy + Pulp::Repository.destroy(repo_id(name)) + end + + def packages + if @repo_packages.nil? + self.packages = Pulp::Repository.packages(id) + end + @repo_packages + end + + def packages=attrs + @repo_packages = attrs.collect do |package| + Glue::Pulp::Package.new(package) + end + @repo_packages + end + + def errata + if @repo_errata.nil? + self.errata = Pulp::Repository.errata(id) + end + @repo_errata + end + + def errata=attrs + @repo_errata = attrs.collect do |erratum| + Glue::Pulp::Errata.new(erratum) + end + @repo_errata + end + + def distributions + if @repo_distributions.nil? + self.distributions = Pulp::Repository.distributions(id) + end + @repo_distributions + end + + def distributions=attrs + @repo_distributions = attrs.collect do |dist| + Glue::Pulp::Distribution.new(dist) + end + @repo_distributions + end + + def has_package? id + self.packages.each{|pkg| + return true if pkg.id == id + } + return false + end + + def sync + Glue::Pulp::Sync.new(Pulp::Repository.sync(id)) + end + + def sync_status + self._get_most_recent_sync_status() + end + + def sync_state + status = self._get_most_recent_sync_status() + return Repo::SYNC_STATE_NOT_SYNCED if status.nil? + status.state + end + + def sync_start + status = _get_most_recent_sync_status() + retval = nil + if status.nil? or status.start_time.nil? + retval = nil + else + retval = status.start_time + # retval = date.strftime("%H:%M:%S %Y-%m-%d") + end + retval + end + + def cancel_sync + history = Pulp::Repository.sync_history(@id) + return if (history.nil? or history.empty?) + + Pulp::Repository.cancel(@id.to_s, history[0][:id]) + end + + def add_packages pkg_id_list + Pulp::Repository.add_packages self.id, pkg_id_list + end + + def sync_finish + status = _get_most_recent_sync_status() + retval = nil + if status.nil? or status.finish_time.nil? + retval = nil + else + retval = status.finish_time + # retval = date.strftime("%H:%M:%S %Y-%m-%d") + end + retval + end + + + def _get_most_recent_sync_status() + history = Pulp::Repository.sync_history(@id) + return Glue::Pulp::SyncStatus.new(:state => Glue::Pulp::Repo::SYNC_STATE_NOT_SYNCED) if (history.nil? or history.empty?) + Glue::Pulp::SyncStatus.new(history[0]) + end + + def synced? + sync_history = Pulp::Repository.sync_history @id + !sync_history.nil? && !sync_history.empty? && successful_sync?(sync_history[0]) + end + + def successful_sync?(sync_history_item) + sync_history_item['state'] == 'finished' + end + + def promote(to_environment, product) + cloned = returning Glue::Pulp::Repo.new do |c| + c.id = Glue::Pulp::Repos.clone_repo_id(id, to_environment.name) + %w[groupid arch name feed].each {|v| c.instance_variable_set("@#{v}", instance_variable_get("@#{v}"))} + end + cloned.groupid = Glue::Pulp::Repos.groupid(product, to_environment) + Pulp::Repository.clone_repo(self, cloned) + cloned + end + + def self.find(id) + Glue::Pulp::Repo.new(Pulp::Repository.find(id)) + end + + # Convert array of Repo objects to Ruby Hash in the form of repo.id => repo_object for fast searches. + # + # @param array_to_hash array of Repo objects + # @returns Hash structure + def self.array_to_hash(array_of_repos) + Hash[*array_of_repos.collect { |r| + [r.id, r] + }.flatten] + end + +end diff --git a/app/models/glue/pulp/repos.rb b/app/models/glue/pulp/repos.rb new file mode 100644 index 00000000000..5d6d2bf5445 --- /dev/null +++ b/app/models/glue/pulp/repos.rb @@ -0,0 +1,307 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'http_resource' +require 'resources/pulp' + +module Glue::Pulp::Repos + + def self.included(base) + base.send :include, InstanceMethods + base.class_eval do + before_save :save_repos_orchestration + before_destroy :destroy_repos_orchestration + end + end + + def self.groupid(product, environment) + [self.product_groupid(product), self.env_groupid(environment), self.env_orgid(product.locker.organization)] + end + + def self.clone_repo_id(repo_id, environment_name) + /(\w+\.\w+)-(\w+)-(\w+)$/.match(repo_id) or /(\w+\.\w+)-(\w+)-\w+-(\w+)$/.match(repo_id) + "#{$1}-#{$2}-#{environment_name}-#{$3}" + end + + def self.env_orgid(org) + "org:#{org.id}" + end + + def self.env_groupid(environment) + "env:#{environment.id}" + end + + def self.product_groupid(product) + "product:#{product.cp_id}" + end + + module InstanceMethods + + def repos env + @repos = {} if @repos.nil? + return @repos[env.id] if @repos[env.id] + + # TODO: temporary hack until groupid AND groupid querying is added to pulp + total_repos = Pulp::Repository.all [Glue::Pulp::Repos.env_groupid(env)] + env_repos = [] + total_repos.collect {|repo| + repo_obj = Glue::Pulp::Repo.new(repo) + env_repos << repo_obj if repo_obj.groupid.include?(Glue::Pulp::Repos.product_groupid(self)) + } + @repos[env.id] = env_repos + return env_repos + end + + def promote from_env, to_env + @orchestration_for = :promote + + queue_promote_repos repos(from_env), to_env + if !to_env.products.include? self + to_env.products << self + self.environments << to_env + end + + save! + to_env.save! # TODO: do i need to call this? + end + + #is the repo cloned in the specified environment + def is_cloned_in? repo, env + self.repos(env).each{ |curr_repo| + return true if repo.clone_ids.include?(curr_repo.id) + } + return false + end + + def sync + self.repos(locker).collect do |r| + r.sync + end + end + + def synced? + self.repos(locker).any? { |r| r.synced? } + end + + # Get the most relavant status for all the repos in this Product + def sync_status + states = Array.new + # Get the most recent status from all the repos in this product + not_synced = Glue::Pulp::SyncStatus.new(:state => Glue::Pulp::Repo::SYNC_STATE_NOT_SYNCED) + top_status = not_synced + for r in repos(self.locker) + curr_status = r._get_most_recent_sync_status() + repo_sync_state = curr_status.state + if repo_sync_state == Glue::Pulp::Repo::SYNC_STATE_ERROR + top_status = curr_status + elsif repo_sync_state == Glue::Pulp::Repo::SYNC_STATE_RUNNING and + top_status != Glue::Pulp::Repo::SYNC_STATE_ERROR + top_status = curr_status + elsif repo_sync_state == Glue::Pulp::Repo::SYNC_STATE_FINISHED and + top_status != Glue::Pulp::Repo::SYNC_STATE_RUNNING and + top_status != Glue::Pulp::Repo::SYNC_STATE_ERROR + top_status = curr_status + end + end + top_status + end + + def sync_state + self.sync_status().state + end + + def sync_start + start_times = Array.new + for r in repos + start = r.sync_start + start_times << start unless start.nil? + end + start_times.sort! + start_times.last + end + + def sync_finish + finish_times = Array.new + for r in repos + finish = r.sync_finish + finish_times << finish unless finish.nil? + end + finish_times.sort! + finish_times.last + end + + def sync_size + size = repos(environments.first.locker).inject(0) { |sum,v| sum + v.sync_status.total_size } + end + + def cancel_sync + for r in repos + r.cancel_sync + end + end + + def repo_id content_id, env_name = nil + return content_id if content_id.include?(self.organization.name) && content_id.include?(self.cp_id.to_s) + [self.cp_id.to_s, content_id.to_s, env_name, self.organization.name].compact.join("-").gsub(":","_") + end + + def repository_url content_url + return content_url if self.provider.provider_type == Provider::CUSTOM + self.provider[:repository_url] + content_url + end + + def delete_repo(name) + #TODO: delete candlepin content as well + Pulp::Repository.destroy(repo_id(name)) + end + + def add_repo(name, url) + # TODO: Make this async + repo = Glue::Pulp::Repo.new(:id => repo_id(name), + :groupid => Glue::Pulp::Repos.groupid(self, self.locker), + :arch => arch, + :name => name, + :feed => url + ) + repo.create + end + + def setup_sync_schedule + if self.sync_plan_id_changed? + self.productContent.each do |pc| + schedule = (self.sync_plan && self.sync_plan.schedule_format) || "" + Pulp::Repository.update(repo_id(pc.content.id), { + :sync_schedule => schedule + }) + end + end + end + + def set_repos + self.productContent.collect do |pc| + cert = self.certificate + key = self.key + ca = File.open("#{Rails.root}/config/candlepin-ca.crt", 'rb') { |f| f.read } + repo = Glue::Pulp::Repo.new(:id => repo_id(pc.content.id), + :arch => arch, + :name => pc.content.name, + :feed => repository_url(pc.content.contentUrl), + :feed_ca => ca, + :feed_cert => cert, + :feed_key => key, + :groupid => Glue::Pulp::Repos.groupid(self, self.locker) + ) + repo.create + end + end + + def update_repos + return true unless productContent_changed? + + old_content_ids = productContent_change[0].map {|pc| pc.content.id} + new_content_ids = productContent_change[1].map {|pc| pc.content.id} + + added_content_ids = new_content_ids - old_content_ids + deleted_content_ids = old_content_ids - new_content_ids + + self.productContent.select {|pc| deleted_content_ids.include?(pc.content.id)}.each do |pc| + Rails.logger.debug "deleting repository #{repo_id(pc.content.name)}" + Pulp::Repository.destroy(repo_id(pc.content.name)) + end + + self.productContent.select {|pc| added_content_ids.include?(pc.content.id)}.each do |pc| + if !(self.environments.map(&:name).any? {|name| pc.content.name.include?(name)}) || pc.content.name.include?('locker') + Rails.logger.debug "creating repository #{repo_id(pc.content.name)}" + self.add_repo(pc.content.name, repository_url(pc.content.contentUrl)) + else + raise "new content was added to environment other than locker. use promotion instead." + end + end + + # + # TODO: candlepin currently doesn't support modification of content + # + #common_content_ids = (old_content_ids & new_content_ids) + #changed_content = self.productContent_change[1].select do |new_pc| + # common_content_ids.include?(new_pc.id) && productContent_change[0].any? do |old_pc| + # old_pc.id == new_pc.id && old_pc.content.contentUrl != new_pc.content.contentUrl + # end + #end + # + #changed_content.each do |pc| + # Pulp::Repository.update(repo_id(pc.content.id), { + # :feed => repository_url(pc.content.contentUrl) + # }) + #end + end + + # Empty method to allow rollbacks + def del_repos + if not self.productContent.nil? + self.productContent.collect do |pc| + Pulp::Repository.destroy(repo_id(pc.content.name)) + end + end + true + end + + def save_repos_orchestration + case orchestration_for + when :create + queue.create(:name => "create pulp repositories for product: #{self.name}", :priority => 6, :action => [self, :set_repos]) + queue.create(:name => "setting up pulp sync schedule for product: #{self.name}", + :priority => 7, :action => [self, :setup_sync_schedule]) if self.sync_plan_id_changed? + when :update + queue.create(:name => "update pulp repositories for product: #{self.name}", :priority => 6, :action => [self, :update_repos]) + queue.create(:name => "setting up pulp sync schedule for product: #{self.name}", + :priority => 7, :action => [self, :setup_sync_schedule]) if self.sync_plan_id_changed? + when :promote + # do nothing, as repos have already been promoted (see promote_repos method) + end + end + + def destroy_repos_orchestration + queue.create(:name => "delete pulp repositories for product: #{self.name}", :priority => 6, :action => [self, :del_repos]) + end + + protected + def promote_repos repos, to_env + repos.each do |repo| + if self.is_cloned_in?(repo, to_env) + #repo is already cloned, so lets just re-sync it from its parent + print "Should be syncing repos" + else + new_repo = repo.promote(to_env, self) + + pulp_uri = URI.parse(AppConfig.pulp.url) + new_productContent = Glue::Candlepin::ProductContent.new({:content => { + :name => new_repo.name, + :contentUrl => "#{pulp_uri.scheme}://#{pulp_uri.host}/pulp/repos/#{new_repo.id}/", + :id => new_repo.id, + :type => "yum", + :label => new_repo.id, + :vendor => "Custom" + } + }) + + productContent_will_change! + productContent << new_productContent + end + end + end + + private + def queue_promote_repos repos, to_env + queue.create(:name => "promote repositories for product: #{self.name}", :priority => 2, :action => [self, :promote_repos, repos, to_env]) + end + end +end diff --git a/app/models/glue/pulp/sync.rb b/app/models/glue/pulp/sync.rb new file mode 100644 index 00000000000..95d25dfeece --- /dev/null +++ b/app/models/glue/pulp/sync.rb @@ -0,0 +1,23 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module Glue::Pulp + + class Sync + attr_accessor :sync_id, :state + + def initialize(attrs = {}) + attrs.each_pair {|k, v| instance_variable_set("@#{k}", v) unless v.nil? } + end + end + +end \ No newline at end of file diff --git a/app/models/glue/pulp/sync_status.rb b/app/models/glue/pulp/sync_status.rb new file mode 100644 index 00000000000..ecef3d11e4a --- /dev/null +++ b/app/models/glue/pulp/sync_status.rb @@ -0,0 +1,33 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module Glue::Pulp + class SyncStatus + attr_reader :sync_id, :state, :total_size, :size_left, :total_count, :items_left, :start_time, :finish_time, :error_details + + def initialize(attrs = {}) + @total_size = @size_left = @total_count = @items_left = 0 + + @state = attrs[:state] + ht = HashUtil.new + if @state != "error" + @total_size = ht.null_safe_get(attrs, 0, ['progress','size_total']) + @size_left = ht.null_safe_get(attrs, 0, ['progress','size_left']) + @total_count = ht.null_safe_get(attrs, 0, ['progress','details','rpm','total_count']) + @items_left = ht.null_safe_get(attrs, 0, ['progress','details','rpm','items_left']) + end + @start_time = Time.parse(attrs[:start_time]) unless attrs[:start_time].nil? + @finish_time = Time.parse(attrs[:finish_time]) unless attrs[:finish_time].nil? + @error_details = ht.null_safe_get(attrs, 0, ['progress', 'error_details']) + end + end +end diff --git a/app/models/hash_util.rb b/app/models/hash_util.rb new file mode 100644 index 00000000000..3c32541637f --- /dev/null +++ b/app/models/hash_util.rb @@ -0,0 +1,35 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class HashUtil + def null_safe_get(hash, default, params) + # Base case .. if we are down to the last param + # lets actually try and find the value + if params.size == 1 + begin + # If we got back null lets assign the default + return hash[params[0]] || default + rescue Exception => e + # If we errored out trying to fetch the value we return + # default value. + return default + end + end + subhash = hash[params.first] + # If we don't have a subhash don't try and recurse down + if !subhash.nil? and !subhash.empty? + self.null_safe_get(subhash, default, params[1..-1]) + else + default + end + end +end \ No newline at end of file diff --git a/app/models/help_tip.rb b/app/models/help_tip.rb new file mode 100644 index 00000000000..cff84052a3c --- /dev/null +++ b/app/models/help_tip.rb @@ -0,0 +1,15 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class HelpTip < ActiveRecord::Base + belongs_to :user +end diff --git a/app/models/katello_description_format_validator.rb b/app/models/katello_description_format_validator.rb new file mode 100644 index 00000000000..42dd8c18635 --- /dev/null +++ b/app/models/katello_description_format_validator.rb @@ -0,0 +1,20 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class KatelloDescriptionFormatValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + if value + max_length = 255 + record.errors[attribute] << N_("cannot contain more than #{max_length} characters") unless value.length <= max_length + end + end +end \ No newline at end of file diff --git a/app/models/katello_name_format_validator.rb b/app/models/katello_name_format_validator.rb new file mode 100644 index 00000000000..176c6850397 --- /dev/null +++ b/app/models/katello_name_format_validator.rb @@ -0,0 +1,30 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class KatelloNameFormatValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + if value + record.errors[attribute] << N_("cannot contain characters other than alpha numerals, space,'_', '-'.") unless value =~ /\A[\w|\s|_|-]*\Z/ + NoTrailingSpaceValidator.validate_trailing_space(record, attribute, value) + KatelloNameFormatValidator.validate_length(record, attribute, value) + else + record.errors[attribute] << N_("can't be blank") + end + end + + def self.validate_length(record, attribute, value, max_length = 128, min_length = 3) + if value + record.errors[attribute] << N_("cannot contain more than #{max_length} characters") unless value.length <= max_length + record.errors[attribute] << N_("must contain at least #{min_length} characters") unless value.length >= min_length + end + end +end \ No newline at end of file diff --git a/app/models/kp_environment.rb b/app/models/kp_environment.rb new file mode 100644 index 00000000000..1dbb80e4aa0 --- /dev/null +++ b/app/models/kp_environment.rb @@ -0,0 +1,149 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class SelfReferenceEnvironmentValidator < ActiveModel::Validator + def validate(record) + record.errors[:base] << _("Environment cannot be in its own promotion path") if record.priors.select(:id).include? record.id + end +end + +class PriorValidator < ActiveModel::Validator + def validate(record) + #need to ensure that prior + #environment already doesnot have a successor + #this is because in v1.0 we want + # prior to have only one child (unless its the locker) + return if record.prior.nil? + has_no_prior = record.organization.environments.reject{|env| env == record || env.prior != record.prior}.empty? + record.errors[:prior] << _("environment cannot be a prior to a different environment") unless has_no_prior + end +end + + +class PathDescendentsValidator < ActiveModel::Validator + def validate(record) + #need to ensure that + #environment is not duplicated in its path + # We do not want circular dependencies + return if record.prior.nil? + record.errors[:prior] << _(" environment cannot be set to an environment already on its path") if is_duplicate? record.prior + end + + def is_duplicate? record + s = record.successor + ret = [record.id] + until s.nil? + return true if ret.include? s.id + ret << s.id + s = s.successor + end + false + end +end + +class KPEnvironment < ActiveRecord::Base + include Authorization + set_table_name "environments" + + belongs_to :organization, :inverse_of => :environments + has_and_belongs_to_many :priors, {:class_name => "KPEnvironment", :foreign_key => :environment_id, + :join_table => "environment_priors", :association_foreign_key => "prior_id", :uniq => true} + has_and_belongs_to_many :successors, {:class_name => "KPEnvironment", :foreign_key => "prior_id", + :join_table => "environment_priors", :association_foreign_key => :environment_id, :readonly => true} + has_and_belongs_to_many :products, { :uniq=>true } + + has_many :working_changesets, :conditions => ["state = '#{Changeset::NEW}' OR state = '#{Changeset::REVIEW}'"], :foreign_key => :environment_id, :class_name=>"Changeset", :dependent => :destroy, :inverse_of => :environment + has_many :changeset_history, :conditions => {:state => Changeset::PROMOTED}, :foreign_key => :environment_id, :class_name=>"Changeset", :dependent => :destroy, :inverse_of => :environment + + + + after_create :create_changeset + + validates_uniqueness_of :name, :scope => :organization_id, :message => N_("must be unique within one organization") + + validates :name, :presence => true, :katello_name_format => true + validates :description, :katello_description_format => true + validates_with PriorValidator + validates_with PathDescendentsValidator + + def locker? + self.locker + end + + def successor + return self.successors[0] unless self.locker? + self.organization.promotion_paths()[0][0] if !self.organization.promotion_paths().empty? + end + + def prior + self.priors[0] + end + + def prior=(env_id) + self.priors.clear + return if env_id.nil? || env_id == "" + prior_env = KPEnvironment.find env_id + self.priors << prior_env unless prior_env.nil? + end + + def path + s = self.successor + ret = [self] + until s.nil? + raise "Environment path has duplicates!!. #{self}. Duplicate => #{ret}. Path => #{s}" if ret.include? s + ret << s + s = s.successor + end + ret + end + + #Unlike path which only gives the path from this environment going forward + # Get the full path, that is go to the HEAD of the path this environment is on + # and then give me that entire path + def full_path + p = self + until p.prior.nil? + p = p.prior + end + p.path + end + + def available_products + if self.prior.nil? + # if there is no prior, then the prior is the locker, which has all products + prior_products = self.organization.locker.products + else + prior_products = self.prior.products + end + return prior_products - self.products + end + + def create_changeset + Changeset.create!(:environment=>self) + end + + + def as_json options = {} + to_ret = self.attributes + to_ret['prior'] = self.prior && self.prior.id + to_ret + end + + def key_for(item) + "environment_#{id}_#{item}" + end + + # returns list of virtual permission tags for the current user + def self.list_tags + select('id,name').all.collect { |m| VirtualTag.new(m.id, m.name) } + end +end diff --git a/app/models/lazy_accessor.rb b/app/models/lazy_accessor.rb new file mode 100644 index 00000000000..39ec2390a58 --- /dev/null +++ b/app/models/lazy_accessor.rb @@ -0,0 +1,133 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module LazyAccessor + + def self.included(base) + base.send :include, LazyAccessor::InstanceMethods + base.send :extend, LazyAccessor::ClassMethods + end + + module ClassMethods + # example: lazy_accessor :a, :b, :c, + # :initializer => lambda { json = Candlepin::Product.get(cp_id)[0] }, + # :unless => lambda { cp_id.nil? } + def lazy_accessor *args + options = args.extract_options! + + raise ArgumentError, "Attribute names must be symbols" if args.any?{ |attribute| !attribute.is_a?(Symbol) } + redefined_attr = args.find{ |attribute| instance_methods.include?(attribute.to_s) } + Rails.logger.warn "Remote attribute '#{redefined_attr}' has already been defined" if redefined_attr + + initializer = options[:initializer] + raise ArgumentError, "Please provide an initializer" if initializer.nil? + + args.each do |symbol| + send :define_method, "#{symbol.to_s}_will_change!" do + changed_remote_attributes[symbol.to_s] ||= cached_remote_attribute_value(symbol.to_s) + end + + send :define_method, "#{symbol.to_s}_changed?" do + remote_attribute_changed?(symbol.to_s) + end + + send :define_method, "#{symbol.to_s}_change" do + attr = symbol.to_s + if remote_attribute_changed?(attr) + old = old_remote_attribute_value(attr, initializer, args.size > 1) + return [old, __send__(attr)] + end + nil + end + + send :define_method, "#{symbol.to_s}_was" do + attr = symbol.to_s + remote_attribute_changed?(attr) ? old_remote_attribute_value(attr, initializer, args.size > 1) : __send__(attr) + end + + send :define_method, "#{symbol.to_s}=" do |val| + attr = symbol.to_s + + old = cached_remote_attribute_value(attr) + changed_remote_attributes[attr] = old if old != val + + instance_variable_set("@#{attr}", val) + end + + send :define_method, symbol do + attr = symbol.to_s + + excepted = options.has_key?(:unless) ? self.instance_eval(&options[:unless]) : new_record? + if instance_variable_get("@#{attr}").nil? && (not excepted) + remote_values = run_initializer(args.size > 1, initializer) + if args.size > 1 + remote_values.each_pair {|k,v| instance_variable_set("@#{k.to_s}", v) if (args.include?(k.to_sym) and respond_to?("#{k.to_s}="))} + else + instance_variable_set("@#{attr}", remote_values) if respond_to?("#{attr}=") + end + end + instance_variable_get("@#{attr}") + end + end + end + end + + module InstanceMethods + def changed_remote_attributes + @changed_remote_attributes ||= {} + end + + def remote_attribute_changed?(attr) + changed_remote_attributes.has_key?(attr) + end + + def save(*) + if status = super + changed_remote_attributes.clear + end + status + end + + def save!(*) + super.tap do + changed_remote_attributes.clear + end + end + + def reload(*) + super.tap do + changed_remote_attributes.clear + end + end + + private + def cached_remote_attribute_value(attr) + instance_variable_get("@#{attr}").nil? ? nil : instance_variable_get("@#{attr}") + end + + def old_remote_attribute_value(attr, initializer, in_group) + if changed_remote_attributes[attr].nil? + remote_values = run_initializer(in_group, initializer) + changed_remote_attributes[attr] = in_group ? remote_values["#{attr}"] : remote_values + end + changed_remote_attributes[attr] + end + + def run_initializer(in_group, initializer) + remote_values = self.instance_eval(&initializer) + if in_group && !remote_values.is_a?(Hash) + raise RuntimeError.new("Expect initializer to return hash if a group of attributes is defined by lazy_accessor") + end + remote_values + end + end +end diff --git a/app/models/login_credential.rb b/app/models/login_credential.rb new file mode 100644 index 00000000000..d0a06457313 --- /dev/null +++ b/app/models/login_credential.rb @@ -0,0 +1,31 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class LoginCredential < ActiveRecord::Base + include Authorization + + belongs_to :provider + validates_presence_of :password + validates :username, :uniqueness => true, :presence => true, :username => true + + def mask_password + masked = "" + unless self.password.nil? + masked = self.password + + # mask the characters of the password to be a black dot + # this is used when displaying the password within forms + masked.gsub(/./, "●") + end + end +end + diff --git a/app/models/no_trailing_space_validator.rb b/app/models/no_trailing_space_validator.rb new file mode 100644 index 00000000000..1d2040ff488 --- /dev/null +++ b/app/models/no_trailing_space_validator.rb @@ -0,0 +1,23 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class NoTrailingSpaceValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + NoTrailingSpaceValidator.validate_trailing_space(record, attribute, value) + end + + def self.validate_trailing_space(record, attribute, value) + if value + record.errors[attribute] << _("must not contain leading or trailing white spaces.") unless value.strip == value + end + end +end diff --git a/app/models/notice.rb b/app/models/notice.rb new file mode 100644 index 00000000000..98c173dc2d1 --- /dev/null +++ b/app/models/notice.rb @@ -0,0 +1,57 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Notice < ActiveRecord::Base + include Authorization + has_many :notice_statuses + has_many :user_notices + has_many :users, :through => :user_notices + + TYPES = [:message, :warning, :success, :error] + + validates_inclusion_of :level, :in => TYPES + validates_presence_of :text + validates_length_of :user_notices, :minimum => 1 + + before_validation :set_default_notice_level + before_save :add_to_all_users + + scoped_search :on => :level, :complete_value => true + scoped_search :on => :text, :complete_value => true, :rename => :description + scoped_search :on => :created_at, :complete_value => true, :rename => :created + + def to_s + "#{level}: #{text}" + end + + def check_permissions operation + logger.debug "CHECKING #{operation}" + # anybody can create notices + return true if operation == :create + if operation == :update or operation == :destroy + # TODO: who is a real owner of a notice? + end + false + end + + private + + def add_to_all_users + if global + self.users = User.all + end + end + + def set_default_notice_level + self.level ||= TYPES.first + end +end diff --git a/app/models/organization.rb b/app/models/organization.rb new file mode 100644 index 00000000000..55025654d56 --- /dev/null +++ b/app/models/organization.rb @@ -0,0 +1,52 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + + +class Organization < ActiveRecord::Base + include Glue::Candlepin::Owner if AppConfig.use_cp + include Glue if AppConfig.use_cp + include Authorization + + has_many :providers + has_many :systems, :dependent => :destroy, :inverse_of => :organization + has_many :environments, :class_name => "KPEnvironment", :conditions => {:locker => false}, :dependent => :destroy, :inverse_of => :organization + has_one :locker, :class_name =>"KPEnvironment", :conditions => {:locker => true}, :dependent => :destroy + attr_accessor :parent_id,:pools + + scoped_search :on => :name, :complete_value => true, :default_order => true, :rename => :'organization.name' + scoped_search :on => :description, :complete_value => true, :rename => :'organization.description' + scoped_search :in => :environments, :on => :name, :complete_value => true, :rename => :'environment.name' + scoped_search :in => :environments, :on => :description, :complete_value => true, :rename => :'environment.description' + scoped_search :in => :providers, :on => :name, :complete_value => true, :rename => :'provider.name' + scoped_search :in => :providers, :on => :description, :complete_value => true, :rename => :'provider.description' + scoped_search :in => :providers, :on => :provider_type, :complete_value => {:redhat => :'Red Hat', :custom => :'Custom'}, :rename => :'provider.type' + scoped_search :in => :providers, :on => :repository_url, :complete_value => true, :rename => :'provider.url' + + before_create :create_locker + validates :name, :uniqueness => true, :presence => true, :katello_name_format => true + validates :description, :katello_description_format => true + def promotion_paths + #I'm sure there's a better way to do this + (self.environments - environments.joins(:priors)).collect do |env| + env.path + end + end + + def create_locker + self.locker = KPEnvironment.new(:name => "locker", :locker => true, :organization => self) + end + + # returns list of virtual permission tags for the current user + def self.list_tags + select('id,name').all.collect { |m| VirtualTag.new(m.id, m.name) } + end +end diff --git a/app/models/permission.rb b/app/models/permission.rb new file mode 100644 index 00000000000..d3857ded24a --- /dev/null +++ b/app/models/permission.rb @@ -0,0 +1,57 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Permission < ActiveRecord::Base + belongs_to :resource_type + belongs_to :role, :inverse_of => :permissions + has_and_belongs_to_many :verbs + has_and_belongs_to_many :tags + + before_save :cleanup_tags_verbs + + def tag_names + self.tags.collect {|tag| tag.name} + end + + def tag_names=attributes + self.tags = attributes.collect do |tag| + Tag.find_or_create_by_name(tag) + end + end + + + def verb_values + self.verbs.collect {|verb| verb.verb} + end + + def verb_values=attributes + self.verbs = attributes.collect do |verb| + Verb.find_or_create_by_verb(verb) + end + end + + def resource_type_attributes=(attributes) + self.resource_type= ResourceType.find_or_create_by_name(attributes[:name]) + end + + def to_text + v = verbs.collect { |v| v.verb }.join(',') + t = tags.collect { |t| t.name }.join(',') + "Role #{role.name}'s allowed to #{v} in #{resource_type.name} scoped #{t}" + end + + private + def cleanup_tags_verbs + self.tags.clear if self.all_tags? + self.verbs.clear if self.all_verbs? + end +end diff --git a/app/models/ping.rb b/app/models/ping.rb new file mode 100644 index 00000000000..4d4e4bf0b9b --- /dev/null +++ b/app/models/ping.rb @@ -0,0 +1,74 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'rest_client' +require 'resources/pulp' +require 'resources/candlepin' + +class Ping + class << self + + # + # Calls "status" services in all backend engines. + # + # This should be called as 'admin' user otherwise the oauth will fail. + # + def ping + result = { :result => 'ok', :status => { + :pulp => {}, + :candlepin => {}, + :pulp_auth => {}, + :candlepin_auth => {}, + }} + + # pulp - ping without oauth + url = AppConfig.pulp.url + exception_watch(result[:status][:pulp]) do + RestClient.get "#{url}/services/status/" + end + + # candlepin - ping without oauth + url = AppConfig.candlepin.url + exception_watch(result[:status][:candlepin]) do + RestClient.get "#{url}/status" + end + + # pulp - ping with oauth + exception_watch(result[:status][:pulp_auth]) do + Pulp::PulpPing.ping + end + + # candlepin - ping with oauth + exception_watch(result[:status][:candlepin_auth]) do + Candlepin::CandlepinPing.ping + end + + # set overall status result code + result[:status].each_value { |v| result[:result] = 'fail' if v[:result] != 'ok' } + result + end + + # check for exception - set the result code properly + def exception_watch(result, &block) + begin + start = Time.new + yield + result[:result] = 'ok' + result[:duration_ms] = ((Time.new - start) * 1000).round.to_s + rescue Exception => e + Rails.logger.warn(e.backtrace ? [e.message, e.backtrace].join("\n") : e.message) + result[:result] = 'fail' + result[:message] = e.message + end + end + end +end diff --git a/app/models/pool.rb b/app/models/pool.rb new file mode 100644 index 00000000000..6aea187b24d --- /dev/null +++ b/app/models/pool.rb @@ -0,0 +1,19 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Pool + attr_accessor :organization, :product_ids +end + +class Subscription + attr_accessor :product, :consumed, :quantity +end diff --git a/app/models/product.rb b/app/models/product.rb new file mode 100644 index 00000000000..c0645eb2bcb --- /dev/null +++ b/app/models/product.rb @@ -0,0 +1,73 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class LockerPresenceValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + record.errors[attribute] << "must contain 'locker'" if value.select {|e| e.locker}.empty? + end +end + +class Product < ActiveRecord::Base + include Glue::Candlepin::Product if AppConfig.use_cp + include Glue::Pulp::Repos if (AppConfig.use_cp and AppConfig.use_pulp) + include Glue if AppConfig.use_cp + include Authorization + + has_and_belongs_to_many :environments, {:class_name => "KPEnvironment", :uniq => true} + has_and_belongs_to_many :changesets + belongs_to :provider, :inverse_of => :products + belongs_to :sync_plan, :inverse_of => :products + + validates :description, :katello_description_format => true + validates :environments, :locker_presence => true + validates :name, :presence => true, :katello_name_format => true + + scoped_search :on => :name, :complete_value => true + scoped_search :on => :multiplier, :complete_value => true + + def initialize(attrs = nil) + + unless attrs.nil? + id_key = attrs.has_key?('id') ? 'id' : :id + #rename "id" to "cp_id" (activerecord and candlepin variable name conflict) + if attrs.has_key?(id_key) && !(attrs.has_key?(:cp_id) || attrs.has_key?('cp_id')) && new_record? + attrs[:cp_id] = attrs[id_key] + attrs.delete(id_key) + end + + # ugh. hack-ish. otherwise we have to modify code every time things change on cp side + attrs = attrs.reject do |k, v| + !attributes_from_column_definition.keys.member?(k.to_s) && (!respond_to?(:"#{k.to_s}=") rescue true) + end + end + + super(attrs) + end + + def organization + provider.organization + end + + + def locker + environments.select {|e| e.locker}.first + end + + def plan_name + return sync_plan.name if sync_plan + N_('None') + end + # returns list of virtual permission tags for the current user + def self.list_tags + select('id,name').all.collect { |m| VirtualTag.new(m.id, m.name) } + end +end diff --git a/app/models/provider.rb b/app/models/provider.rb new file mode 100644 index 00000000000..bd34fd59fb1 --- /dev/null +++ b/app/models/provider.rb @@ -0,0 +1,74 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Provider < ActiveRecord::Base + include Glue::Provider + include Glue + include Authorization + + REDHAT = 'Red Hat' + CUSTOM = 'Custom' + TYPES = [REDHAT, CUSTOM] + belongs_to :organization + has_many :products, :inverse_of => :provider + + validates :name, :presence => true, :katello_name_format => true + validates :description, :katello_description_format => true + validates_uniqueness_of :name, :scope => :organization_id + validates_presence_of :repository_url, :if => :rh_repo? + validates_inclusion_of :provider_type, + :in => TYPES, + :allow_blank => false, + :message => "Please select provider type from one of the following: #{TYPES.join(', ')}." + validates_format_of :repository_url, :with => URI::regexp(%w(https)), :if => :rh_repo? + + scoped_search :on => :name, :complete_value => true, :rename => :'provider.name' + scoped_search :on => :description, :complete_value => true, :rename => :'provider.description' + scoped_search :on => :repository_url, :complete_value => true, :rename => :'provider.url' + scoped_search :on => :provider_type, :complete_value => true, :rename => :'provider.type' + scoped_search :in => :products, :on => :name, :complete_value => true, :rename => :'custom_product.name' + scoped_search :in => :products, :on => :description, :complete_value => true, :rename => :'custom_product.description' + + validate :only_one_rhn_provider + + def only_one_rhn_provider + # validate only when new record is added (skip explicit valid? calls) + if new_record? and provider_type == REDHAT and count_providers(REDHAT) != 0 + errors.add(:base, _("Only one Red Hat provider permitted for an Organization")) + end + end + + def count_providers type + ::Provider.where(:organization_id => self.organization_id, :provider_type => type).count(:id) + end + + def yum_repo? + provider_type == CUSTOM + end + + def rh_repo? + provider_type == REDHAT + end + + # Logic to ask a Provider if it is one that has subscriptions managed for + # the products contained within. Right now this is just redhat products but + # wanted to centralize the logic in one method. + def has_subscriptions? + rh_repo? + end + + # returns list of virtual permission tags for the current user + def self.list_tags + select('id,name').all.collect { |m| VirtualTag.new(m.id, m.name) } + end +end + diff --git a/app/models/puppetclasses.rb b/app/models/puppetclasses.rb new file mode 100644 index 00000000000..f4f687f2387 --- /dev/null +++ b/app/models/puppetclasses.rb @@ -0,0 +1,24 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'resources/foreman' + +class Puppetclasses + + class << self + + def all + Foreman::Puppetclass.new.list + end + + end +end diff --git a/app/models/resource_type.rb b/app/models/resource_type.rb new file mode 100644 index 00000000000..aca3714a575 --- /dev/null +++ b/app/models/resource_type.rb @@ -0,0 +1,16 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class ResourceType < ActiveRecord::Base + belongs_to :permission +end + diff --git a/app/models/role.rb b/app/models/role.rb new file mode 100644 index 00000000000..b49467d531c --- /dev/null +++ b/app/models/role.rb @@ -0,0 +1,201 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Role < ActiveRecord::Base + include Authorization + has_and_belongs_to_many :users + has_many :permissions, :dependent => :destroy,:inverse_of =>:role, :class_name=>"Permission" + has_one :owner, :class_name => 'User', :foreign_key => "own_role_id" + has_many :search_tags, :class_name => 'Tag' + has_many :search_verbs, :class_name => 'Verb' + has_many :resource_types, :through => :permissions + + validates :name, :uniqueness => true, :presence => true, :username => true + #validates_associated :permissions + accepts_nested_attributes_for :permissions, :allow_destroy => true + + scoped_search :on => :name, :complete_value => true, :rename => :'role.name' + scoped_search :in => :resource_types, :on => :name, :complete_value => true, :rename => :'permission.type' + scoped_search :in => :search_verbs, :on => :verb, :complete_value => true, :ext_method => :search_by_verb, :only_explicit => true, :rename => :'permission.verb' + scoped_search :in => :search_tags, :on => :name, :complete_value => true, :ext_method => :search_by_tag, :rename => :'permission.scope', :only_explicit => true + + def self.search_by_tag(key, operator, value) + permissions = Permission.all(:conditions => "tags.name #{operator} '#{value_to_sql(operator, value)}'", :include => :tags) + roles = permissions.map(&:role) + opts = roles.empty? ? "= 'nil'" : "IN (#{roles.map(&:id).join(',')})" + + return {:conditions => " roles.id #{opts} " } + end + + + def self.search_by_verb(key, operator, value) + permissions = Permission.all(:conditions => "verbs.verb #{operator} '#{value_to_sql(operator, value)}'", :include => :verbs) + roles = permissions.map(&:role) + opts = roles.empty? ? "= 'nil'" : "IN (#{roles.map(&:id).join(',')})" + + return {:conditions => " roles.id #{opts} " } + end + + def self.value_to_sql(operator, value) + return value if (operator !~ /LIKE/i) + return (value =~ /%|\*/) ? value.tr_s('%*', '%') : "%#{value}%" + end + + # Is this role allowed to verb? or + # is this role allowed to verb, type and tag(s) combination? + # + # @param [String or Hash] verb string or hash with two strings [:controller] and [:action] + # @param [String] resource type + # @param [String or Array] one or more tags + def allowed_to?(verb, resource_type = nil, tags = nil) + allowed_to_tags? verb, resource_type, tags + end + + # Create permission for given role - for more info see allow + # + # @param [Role or Array] one or more roles to allow (accepts also String for role name) + def self.allow(role, verb, resource_type = nil, tags = nil) + raise ArgumentError, "role can't be nil" if role.nil? + raise ArgumentError, "verb can't be nil" if verb.nil? + roles = role.is_a?(Array) ? role : [role] + + roles.each do |r| + allow_role = r.is_a?(String)? Role.find_or_create_by_name(r) : r + allow_role.allow(verb, resource_type, tags) + end + end + + def self.non_self_roles() + #gotta be a better way to do this, but others wouldn't work + Role.all(:conditions=>{"users.own_role_id"=>nil}, :include=> :owner) + end + + # create permission with verb for the role or + # create permission with verb, type and tag(s) for the role + def allow(verb, resource_type = nil, tags = nil) + raise ArgumentError, "verb can't be nil" if verb.nil? + + # handle :controller => [ :action1, :action2 ] format + if verb.is_a? Hash + raise ArgumentError, "type and tags must be nil" unless (resource_type.nil? or tags.nil?) + verbs = [] + tags = [] + verb.each_pair do |c, a| + tags << c + if a.is_a? Array + verbs = verbs + a + else + verbs << a + end + end + else + verbs = verb.is_a?(Array) ? verb : [verb] + end + + resource_type = nil_to_string resource_type + tags = nil_to_string tags + tags = [tags] unless tags.is_a? Array + + # create permissions + Permission.transaction do + p = Permission.create!(:role => self) + verbs.each do |verb| + p.verbs << Verb.find_or_create_by_verb(verb) + end + tags.each do |tag| + p.tags << Tag.find_or_create_by_name(tag) + end + p.resource_type = ResourceType.find_or_create_by_name(resource_type) + p.save! + Rails.logger.info "Permission created: #{p.to_text}" + end + end + + def disallow(verb, resource_type = nil, tags = nil) + raise ArgumentError, "verb can't be nil" if verb.nil? + raise ArgumentError, "tag(s) can't be nil" if tags.nil? + verbs = verb.is_a?(Array) ? verb : [verb] + resource_type = nil_to_string resource_type + tags = nil_to_string tags + + # delete permissions + Permission.transaction do + Permission.select('DISTINCT(permissions.id)').joins(:resource_type, :verbs, :tags).where( + :role_id => id, + :resource_types => { :name => resource_type }, + :tags => { :name => tags }, + :verbs => { :verb => verb }).find_each do |p| + Permission.destroy(p.id) + end + end + end + + # returns the candlepin role (for RHSM) + def self.candlepin_role + Role.find_by_name('candlepin_role') + end + + private + # convert nil object to string "NIL" + def nil_to_string(object) + (object.nil? or object == '') ? 'NIL' : object + end + + def allowed_to_tags?(verb, resource_type, tags) + + # handle :controller => :x, :action => :y format + if verb.is_a? Hash + raise ArgumentError, "type and tags must be nil" unless (resource_type.nil? or tags.nil?) + tags = [ verb[:controller] ] + verb = verb[:action] + end + + resource_type = nil_to_string resource_type + tags = nil_to_string tags + tags = [tags] unless tags.is_a? Array + verb = action_to_verb(verb, tags) + Rails.logger.debug "Checking if role #{name} is allowed to #{verb.inspect} in #{resource_type.inspect} scoped #{tags.inspect}" + Permission.joins(:resource_type, :verbs, :tags).where( + :role_id => id, + :resource_types => { :name => resource_type }, + :tags => { :name => tags }, + :verbs => { :verb => verb }).count('tags.name', :distinct => true) == tags.count + # TODO - for now we just compare count - this is dangerous - we need to compare the content + end + + DEFAULT_VERBS = { + :edit => 'update', :update=> 'update', + :new => 'create', :create => 'create', :create_favorite => 'create', + :index => 'read', :show => 'read', :auto_complete_search => 'read', + :destroy => 'delete', :destroy_favorite => 'delete', + :items => 'read' + } + + ACTION_TO_VERB = { + :notices => {:get_new => 'read', :details => 'read', :note_count => 'read', + :destroy_all => 'delete'}, + :sync_management => {:status => 'read',:product_status => 'read'}, + :certificates => {:serials => 'read'}, + :consumers => {:export_status => 'read'}, + :owners => {:import_status => 'read'} + } + + def action_to_verb(verb, tags) + tags.each do |tag| + return ACTION_TO_VERB[tag.to_sym][verb.to_sym] if ACTION_TO_VERB[tag.to_sym] and ACTION_TO_VERB[tag.to_sym][verb.to_sym] + end + return DEFAULT_VERBS[verb.to_sym] if DEFAULT_VERBS[verb.to_sym] + + return verb + end + +end diff --git a/app/models/search_favorite.rb b/app/models/search_favorite.rb new file mode 100644 index 00000000000..1e54b3015f9 --- /dev/null +++ b/app/models/search_favorite.rb @@ -0,0 +1,32 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +# +class SearchFavorite < ActiveRecord::Base + include SearchHelper + + belongs_to :user + validate :max_favorites + + def max_favorites + if new_record? + path = self.attributes["path"] + if count_favorites(path) >= max_search_favorites + errors.add(:base, _("Only #{max_search_favorites} favorites may be created.")) + end + end + end + + def count_favorites path + count = ::SearchFavorite.where(:user_id => self.user_id, :path => path).count(:id) + end + +end diff --git a/app/models/search_history.rb b/app/models/search_history.rb new file mode 100644 index 00000000000..1248b7caa1a --- /dev/null +++ b/app/models/search_history.rb @@ -0,0 +1,15 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +# +class SearchHistory < ActiveRecord::Base + belongs_to :user +end diff --git a/app/models/support.rb b/app/models/support.rb new file mode 100644 index 00000000000..ce699d5ebb5 --- /dev/null +++ b/app/models/support.rb @@ -0,0 +1,17 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +module Support + def Support.deep_copy object + Marshal::load(Marshal.dump(object)) + end +end diff --git a/app/models/sync_plan.rb b/app/models/sync_plan.rb new file mode 100644 index 00000000000..db2b4642226 --- /dev/null +++ b/app/models/sync_plan.rb @@ -0,0 +1,68 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class SyncPlan < ActiveRecord::Base + include Glue + + NONE = 'none'; + HOURLY = 'hourly'; + DAILY = 'daily'; + WEEKLY = 'weekly'; + TYPES = [NONE, HOURLY, DAILY, WEEKLY] + DURATION = { NONE => '', HOURLY => 'T1H', DAILY => 'T24H', WEEKLY => '7D' } + WEEK_DAYS = (%W(Sunday Monday Tuesday Wednesday Thursday Friday)).collect{|d| N_(d)} + + + belongs_to :organization + has_many :products + + validates :name, :uniqueness => true, :presence => true, :katello_name_format => true + validate :validate_sync_date + validates_inclusion_of :interval, + :in => TYPES, + :allow_blank => false + + scoped_search :on => :name, :complete_value => true + + def validate_sync_date + errors.add_to_base _("Start Date and Time can't be blank") if self.sync_date.nil? + end + + def plan_day + WEEK_DAYS[self.sync_date.strftime('%e').to_i] + end + + def plan_date + self.sync_date.nil? ? '' : self.sync_date.strftime('%m/%d/%Y'); + end + + def plan_time + self.sync_date.nil? ? '' : self.sync_date.strftime('%I:%M %p'); + end + + def schedule_format + format = Time.parse(self.sync_date.to_s).iso8601 + if self.interval != NONE + format << "/P" << DURATION[self.interval] + end + return format + end + + def plan_zone + self.sync_date.strftime('%Z') + end + + # returns list of virtual permission tags for the current user + def self.list_tags + select('id,name').all.collect { |m| VirtualTag.new(m.id, m.name) } + end +end diff --git a/app/models/system.rb b/app/models/system.rb new file mode 100644 index 00000000000..dbf04646c98 --- /dev/null +++ b/app/models/system.rb @@ -0,0 +1,55 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class System < ActiveRecord::Base + include Glue::Candlepin::Consumer + include Glue + include Authorization + + belongs_to :organization, :inverse_of => :systems + validates :name, :presence => true, :no_trailing_space => true + validates :description, :katello_description_format => true + before_create :fill_defaults + + scoped_search :on => :name, :complete_value => true + scoped_search :on => :description, :complete_value => true + scoped_search :on => :location, :complete_value => true + scoped_search :on => :uuid, :complete_value => true + + def consumed_pool_ids + self.pools.collect {|t| t['id']} + end + + def consumed_pool_ids=attributes + attribs_to_unsub = consumed_pool_ids - attributes + + attribs_to_unsub.each do |id| + self.unsubscribe id + end + + attribs_to_sub = attributes - consumed_pool_ids + attribs_to_sub.each do |id| + self.subscribe id + end + end + + # returns list of virtual permission tags for the current user + def self.list_tags + select('id,name').all.collect { |m| VirtualTag.new(m.id, m.name) } + end + + private + def fill_defaults + self.description = "Initial Registration Params" unless self.description + self.location = "None" unless self.location + end +end diff --git a/app/models/system_template.rb b/app/models/system_template.rb new file mode 100644 index 00000000000..e1d3a6ab57b --- /dev/null +++ b/app/models/system_template.rb @@ -0,0 +1,184 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + + +class SystemTemplate < ActiveRecord::Base + #has_many :products + belongs_to :environment, {:class_name => "KPEnvironment"} + + validates_presence_of :name + + attr_reader :packages, :errata, :products, :host_group, :kickstart_attrs + + + def initialize attrs + super(attrs) + end + + + def packages_json= attrs + @packages = nil + @attributes['packages_json'] = attrs + end + + def errata_json= attrs + @errata = nil + @attributes['errata_json'] = attrs + end + + def products_json= attrs + @products = nil + @attributes['products_json'] = attrs + end + + + def packages + return @packages if not @packages.nil? + + packages = ActiveSupport::JSON.decode(self.packages_json) + @packages = packages.collect do |p| + package = self.find_package_in_env(p) + if package == nil + raise Errors::TemplateContentException.new("Package #{p} not found in this environment.") + end + package + end + end + + + def errata + return @errata if not @errata.nil? + + errata = ActiveSupport::JSON.decode(self.errata_json) + @errata = errata.collect do |e| + erratum = self.find_errata_in_env(e) + if erratum == nil + raise Errors::TemplateContentException.new("Errata #{e} not found in this environment.") + end + erratum + end + end + + + def products + return @products if not @products.nil? + + products = ActiveSupport::JSON.decode(self.products_json) + @products = products.collect do |p| + product = self.environment.products.find_by_name(p) + if product == nil + raise Errors::TemplateContentException.new("Product #{p} not found in this environment.") + end + product + end + end + + + def host_group + ActiveSupport::JSON.decode(self.host_group_json) + end + + + def kickstart_attrs + ActiveSupport::JSON.decode(self.kickstart_attrs_json) + end + + + #TODO: comment + def content_valid? + self.packages + self.errata + self.host_group + self.kickstart_attrs + self.packages + + return true + rescue + + return false + end + + def import tpl_file_path + Rails.logger.info "Importing into template #{name}" + + file = File.open(tpl_file_path,"r") + content = file.read + json = ActiveSupport::JSON.decode(content) + + self.revision = json["revision"] + self.packages_json = (json["packages"] or []).to_json + self.errata_json = (json["errata"] or []).to_json + self.products_json = (json["products"] or []).to_json + self.host_group_json = (json["host_group"] or {}).to_json + self.kickstart_attrs_json = (json["kickstart_attributes"] or []).to_json + + if not self.content_valid? + raise Errors::TemplateContentException.new("Specified template content not found in this environment.") + end + + ensure + file.close + end + + def string_export + tpl = { + :revision => self.revision, + :packages => ActiveSupport::JSON.decode(self.packages_json), + :errata => ActiveSupport::JSON.decode(self.errata_json), + :products => ActiveSupport::JSON.decode(self.products_json), + :host_group => ActiveSupport::JSON.decode(self.host_group_json), + :kickstart_attrs => ActiveSupport::JSON.decode(self.kickstart_attrs_json) + } + tpl.to_json + end + + def to_json(options={}) + super(options.merge({ + :methods => [:products, + :packages, + :errata, + :host_group, + :kickstart_attrs] + }) + ) + end + + protected + + def find_errata_in_env(erratum_id) + + self.products.each do |product| + product.repos(self.environment).each do |repo| + #search for errata in all repos in a product + idx = repo.errata.index do |e| e.id == erratum_id end + return repo.errata[idx] if idx != nil + + end + end + + nil + end + + def find_package_in_env(package_name) + + self.products.each do |product| + product.repos(self.environment).each do |repo| + #search for errata in all repos in a product + idx = repo.packages.index do |p| p.name == package_name end + return repo.packages[idx] if idx != nil + + end + end + + nil + end +end diff --git a/app/models/tag.rb b/app/models/tag.rb new file mode 100644 index 00000000000..eb1d414e2fe --- /dev/null +++ b/app/models/tag.rb @@ -0,0 +1,37 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'util/model_util' + +class Tag < ActiveRecord::Base + has_and_belongs_to_many :permission + + # used for user-friendly presentation of this record + def display_name + name + end + + def self.tags_for(resource_type_name) + + # step 1 - try to load tags from our model classes + resource_type_name = resource_type_name.gsub('ar_', '') + table_to_class = Katello::ModelUtils.table_to_model_hash + if table_to_class.key?(resource_type_name) + model_klass = table_to_class[resource_type_name] + return model_klass.list_tags if model_klass.respond_to? :list_tags + end + + # step 2 - fetch information from the database + Tag.select('DISTINCT(tags.name)').joins(:permission => :resource_type).where(:resource_types => { :name => resource_type_name }) + end + +end diff --git a/app/models/user.rb b/app/models/user.rb new file mode 100644 index 00000000000..bf83d62267f --- /dev/null +++ b/app/models/user.rb @@ -0,0 +1,160 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'ldap' +require 'util/threadsession.rb' + +class User < ActiveRecord::Base + has_and_belongs_to_many :roles + belongs_to :own_role, :class_name => 'Role' + has_many :help_tips + has_many :user_notices + has_many :notices, :through => :user_notices + has_many :search_favorites, :dependent => :destroy + has_many :search_histories, :dependent => :destroy + + validates :username, :uniqueness => true, :presence => true, :username => true + validates :password, :presence => true, :length=>{:within=>6..100} + validate :own_role_included_in_roles + + # check if the role does not already exist for new username + validates_each :username do |model, attr, value| + if model.new_record? and Role.find_by_name(value) + model.errors.add(:username, "role with the same name '#{value}' already exists") + end + end + + + scoped_search :on => :username, :complete_value => true, :rename => :name + scoped_search :in => :roles, :on => :name, :complete_value => true, :rename => :role + + # create own role for new user + after_create do |u| + if u.own_role.nil? + r = Role.create!(:name => u.username.downcase + "_role") + u.roles << r unless u.roles.include? r + u.own_role = r + u.save! + end + end + + # support for session (thread-local) variables + include Katello::ThreadSession::UserModel + include Ldap + + # return the special "nobody" user account + def self.anonymous + find_by_username('anonymous') + end + + def self.authenticate!(username, password) + User.where({:username => username, :password => password}).first + end + + def self.authenticate_using_ldap!(username, password) + if Ldap.valid_ldap_authentication? username, password + User.new :username => username + else + nil + end + end + + # Return true if the user is allowed to do the specified action for a resource type + # verb/action can be: + # * a parameter-like Hash (eg. :controller => 'projects', :action => 'edit') + # * a permission Symbol (eg. :edit_project) + # + # This method is called by every protected controller. + def allowed_to?(verb, resource_type = nil, tags = nil) + return false if roles.empty? + not roles.detect {|role| role.allowed_to?(verb, resource_type, tags)}.nil? + end + + # Class method that has the same functionality as allowed_to? method but operates + # on the current logged user. The class attributte User.current must be set! + # If the current user is not set (is nil) it treats it like the 'anonymous' user. + def self.allowed_to?(verb, resource_type = nil, tags = nil) + u = User.current + u = User.anonymous if u.nil? + raise ArgumentError, "current user is not set" if u.nil? or not u.is_a? User + u.allowed_to?(verb, resource_type, tags) + end + + # Class method with the very same functionality as allowed_to? but throws + # SecurityViolation exception leading to the denial page. + def self.allowed_to_or_error?(verb, resource_type = nil, tags = nil) + u = User.current + raise ArgumentError, "current user is not set" if u.nil? or not u.is_a? User + unless u.allowed_to?(verb, resource_type, tags) + msg = "User #{u.username} is not allowed to #{verb} in #{resource_type} using #{tags}" + Rails.logger.error msg + raise Errors::SecurityViolation, msg + end + end + + # Create permission for the user's own role - for more info see Role.allow + def allow(verb, resource_type, tags) + raise ArgumentError, "user has no own role" if own_role.nil? or not own_role.is_a? Role + own_role.allow(verb, resource_type, tags) + end + + # Delete permission for the user's own role - for more info see Role.allow + def disallow(verb, resource_type, tags) + raise ArgumentError, "user has no own role" if own_role.nil? or not own_role.is_a? Role + own_role.disallow(verb, resource_type, tags) + end + + def disable_helptip(key) + return if !self.helptips_enabled? #don't update helptips if user has it disabled + return if not HelpTip.where(:key => key, :user_id => self.id).empty? + help = HelpTip.new + help.key = key + help.user = self + help.save + end + + def enable_helptip(key) + return if !self.helptips_enabled? #don't update helptips if user has it disabled + help = HelpTip.where(:key => key, :user_id => self.id).first + return if help.nil? + help.destroy + end + + def clear_helptips + HelpTip.destroy_all(:user_id=>self.id) + end + + def helptip_enabled?(key) + return self.helptips_enabled && HelpTip.where(:key => key, :user_id => self.id).first.nil? + end + + def defined_roles + self.roles - [self.own_role] + end + + def defined_role_ids + self.role_ids - [self.own_role_id] + end + + def oauth_header + { 'cp-user' => self.username } + end + + protected + + def own_role_included_in_roles + unless own_role.nil? + errors.add(:own_role, 'own role must be included in roles') unless roles.include? own_role + end + end + +end diff --git a/app/models/user_notice.rb b/app/models/user_notice.rb new file mode 100644 index 00000000000..95861ae20df --- /dev/null +++ b/app/models/user_notice.rb @@ -0,0 +1,29 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class UserNotice < ActiveRecord::Base + include Authorization + + belongs_to :user + belongs_to :notice + + def check_permissions operation + # anybody can create user_notice relationships + return true if operation == :create + # only notice owner can update or destroy + if operation == :update or operation == :destroy + return true if user.id and User.current and user.id == User.current.id + end + false + end + +end diff --git a/app/models/username_validator.rb b/app/models/username_validator.rb new file mode 100644 index 00000000000..a0f31a97e9c --- /dev/null +++ b/app/models/username_validator.rb @@ -0,0 +1,20 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class UsernameValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + if value + record.errors[attribute] << _("cannot contain characters other than alpha numerals,'_', '-'.") unless value =~ /\A[\w|_|-]+\Z/ + KatelloNameFormatValidator.validate_length(record, attribute, value, 64, 3) + end + end +end diff --git a/app/models/verb.rb b/app/models/verb.rb new file mode 100644 index 00000000000..1e4a4bd08d5 --- /dev/null +++ b/app/models/verb.rb @@ -0,0 +1,29 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Verb < ActiveRecord::Base + has_and_belongs_to_many :permission + + # alias for verb attribute + def name + verb + end + + # used for user-friendly presentation of this record + def display_name + verb + end + + def self.verbs_for(resource_type_name) + Verb.select('DISTINCT(verbs.verb)').joins(:permission => :resource_type).where(:resource_types => { :name => resource_type_name }) + end +end diff --git a/app/stylesheets/_base.scss b/app/stylesheets/_base.scss new file mode 100644 index 00000000000..69127c23121 --- /dev/null +++ b/app/stylesheets/_base.scss @@ -0,0 +1,144 @@ +@charset "UTF-8"; +@import "grid"; + +/* colors */ +$kprimary: #26B3E2; /* Primary Katello ID */ +$kselected: darken($kprimary,15%); /* all selected items */ +$linkfg: darken($kprimary,05%); /* default links */ +$tabon: darken($kselected, 1%); +$taboff: #747474; /* unfocused tabs */ +$lightkprimary: #F2FAFA; +$listhover: lighten($kselected, 10%); /* list items prelight state */ +$headerbg: $kprimary; +$formheadbg: #eee; +$formheadfg: #333; +$labelfg: #888; + +$breadcrumbbg: #e9e9e9; + +$footerbg: #f3f3f3; +$strokecl: #aaa; +$errorcl: #cb292b; +$warningcl: #f6a20a; + +$headercl: #333; + +$goodcl: #bfcc29; +$okcl: orange; +$badcl: red; + +$lightgrey: #939292; + +@import "text"; + +@mixin border-radius($radius) { + border-radius: $radius; + -moz-border-radius: $radius; + -webkit-border-radius: $radius; +} + +@mixin border-bottom-lr-radius($radius) { + -webkit-border-bottom-right-radius: $radius; + -webkit-border-bottom-left-radius: $radius; + -moz-border-radius-bottomright: $radius; + -moz-border-radius-bottomleft: $radius; + border-bottom-right-radius: $radius; + border-bottom-left-radius: $radius; +} + +@mixin border-right-radius($radius) { + -webkit-border-bottom-right-radius: $radius; + -webkit-border-top-right-radius: $radius; + -moz-border-radius-bottomright: $radius; + -moz-border-radius-topright: $radius; + border-bottom-right-radius: $radius; + border-top-right-radius: $radius; +} + +@mixin border-left-radius($radius) { + -webkit-border-bottom-left-radius: $radius; + -webkit-border-top-left-radius: $radius; + -moz-border-radius-bottomleft: $radius; + -moz-border-radius-topleft: $radius; + border-bottom-left-radius: $radius; + border-top-left-radius: $radius; +} + +@mixin border-top-lr-radius($radius) { + -webkit-border-top-left-radius: $radius; + -webkit-border-top-right-radius: $radius; + -moz-border-radius-topleft: $radius; + -moz-border-radius-topright: $radius; + border-top-left-radius: $radius; + border-top-right-radius: $radius; +} + +@mixin border-top-r-radius($radius) { + -webkit-border-top-right-radius: $radius; + -moz-border-radius-topright: $radius; + border-top-right-radius: $radius; +} + +@mixin box-shadow($x,$y,$blur,$color) { + box-shadow: $x $y $blur $color; + -moz-box-shadow: $x $y $blur $color; + -webkit-box-shadow: $x $y $blur $color; +} + +@mixin inset-box-shadow($x,$y,$blur,$color) { + box-shadow: inset $x $y $blur $color; + -moz-box-shadow: inset $x $y $blur $color; + -webkit-box-shadow: inset $x $y $blur $color; +} + +@mixin no-box-shadow { + box-shadow: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; +} + +@mixin text-shadow($x,$y,$blur,$color) { + text-shadow: $x $y $blur $color; + -moz-text-shadow: $x $y $blur $color; + -webkit-text-shadow: $x $y $blur $color; +} + +@mixin no-text-shadow { + text-shadow: none; + -moz-text-shadow: none; + -webkit-textbox-shadow: none; +} + +@mixin column-count($c) { + -moz-column-count: $c; + -o-column-count: $c; + -webkit-column-count: $c; + column-count: $c; +} + +@mixin column-gap($g) { + -moz-column-gap: $g; + -o-column-gap: $g; + -webkit-column-gap: $g; + column-gap: $g; +} + +@mixin opacity($opacity) { + /* IE 8 */ + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=$opacity * 100)"; + /* IE 5-7 */ + filter: alpha(opacity=$opacity * 100); + /* Netscape */ + -moz-opacity: $opacity; + /* Safari 1.x */ + -khtml-opacity: $opacity; + /* Good browsers */ + opacity: $opacity; +} + +@mixin background-size($size) { + -webkit-background-size: $size; + -o-background-size: $size; + -moz-background-size: $size; + background-size: $size; +} diff --git a/app/stylesheets/_liberation.scss b/app/stylesheets/_liberation.scss new file mode 100644 index 00000000000..cfa7ed85180 --- /dev/null +++ b/app/stylesheets/_liberation.scss @@ -0,0 +1,42 @@ +@font-face { + font-family: 'Liberation Sans'; + src: local('Liberation Sans'), local('LiberationSans'), local('Liberation-Sans'), + url('/fonts/LiberationSans-Regular-webfont.eot?#iefix') format('eot'), + url('/fonts/LiberationSans-Regular-webfont.woff') format('woff'), + url('/fonts/LiberationSans-Regular-webfont.ttf') format('truetype'), + url('/fonts/LiberationSans-Regular-webfont.svg#webfontLfr8h6FA') format('svg'); + font-weight: normal; + font-style: normal; + +} + +@font-face { + font-family: 'Liberation Sans'; + src: local('Liberation Sans Italic'), local('LiberationSansItalic'), local('Liberation-Sans-Italic'), + url('/fonts/LiberationSans-Italic-webfont.woff') format('woff'), + url('/fonts/LiberationSans-Italic-webfont.ttf') format('truetype'), + url('/fonts/LiberationSans-Italic-webfont.svg#webfont8TmwkzPJ') format('svg'); + font-weight: normal; + font-style: italic; +} + +@font-face { + font-family: 'Liberation Sans'; + src: local('Liberation Sans Bold'), local('LiberationSansBold'), local('Liberation-Sans-Bold'), + url('/fonts/LiberationSans-Bold-webfont.woff') format('woff'), + url('/fonts/LiberationSans-Bold-webfont.ttf') format('truetype'), + url('/fonts/LiberationSans-Bold-webfont.svg#webfontHyWb8e07') format('svg'); + font-weight: bold; + font-style: normal; +} + +@font-face { + font-family: 'Liberation Sans'; + src: local('Liberation Sans Bold Italic'), local('LiberationSansBoldItalic'), local('Liberation-Sans-Bold-Italic'), + url('/fonts/LiberationSans-BoldItalic-webfont.woff') format('woff'), + url('/fonts/LiberationSans-BoldItalic-webfont.ttf') format('truetype'), + url('/fonts/LiberationSans-BoldItalic-webfont.svg#webfont8uGO27Bu') format('svg'); + font-weight: bold; + font-style: italic; + +} diff --git a/app/stylesheets/_overpass.scss b/app/stylesheets/_overpass.scss new file mode 100755 index 00000000000..5f8e89d4510 --- /dev/null +++ b/app/stylesheets/_overpass.scss @@ -0,0 +1,21 @@ +@font-face { + font-family: 'Overpass'; + src: local("Overpass"), + url('/fonts/overpass_regular-web.eot?#iefix') format('eot'), + url('/fonts/overpass_regular-web.woff') format('woff'), + url('/fonts/overpass_regular-web.ttf') format('truetype'), + url('/fonts/overpass_regular-web.svg#webfontLTZe4IYH') format('svg'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Overpass'; + src: local("Overpass Bold"), local("OverpassBold"), + url('/fonts/overpass_bold-web.eot?#iefix') format('eot'), + url('/fonts/overpass_bold-web.woff') format('woff'), + url('/fonts/overpass_bold-web.ttf') format('truetype'), + url('/fonts/overpass_bold-web.svg#webfontzAU82Ltw') format('svg'); + font-weight: bold; + font-style: normal; +} diff --git a/app/stylesheets/_text.scss b/app/stylesheets/_text.scss new file mode 100644 index 00000000000..b9ce75a9162 --- /dev/null +++ b/app/stylesheets/_text.scss @@ -0,0 +1,40 @@ +/* 960 Grid System ~ Text CSS. + * Learn more ~ http://960.gs/ + * * + * Licensed under GPL and MIT. */ + +@import "960/text"; + +@import "overpass"; +@import "liberation"; +$screenfont: "Liberation Sans", sans-serif; +$headlinefont: "Overpass", Interstate, sans-serif; + +body { + font: 12px/1.5 $screenfont; +} + +h1 { font-size: 180%; + text-transform: uppercase; + font-weight: bold; +} +h2 { font-size: 170%; } +h3 { font-size: 160%; } +h4 { font-size: 150%; } +h5 { font-size: 140%; } +h1,h2,h3,h4,h5 { + color: #939292; + font-family: $headlinefont; + margin-top: 1em; + font-weight: bold; + word-wrap: break-word; +} +li { + margin-left: 0; +} +h1,h2,h3,h4,h5, p { + margin: 0.5em 0; +} +fieldset { + margin-bottom: 10px; +} diff --git a/app/stylesheets/fancyqueries.scss b/app/stylesheets/fancyqueries.scss new file mode 100644 index 00000000000..3169cf4f5df --- /dev/null +++ b/app/stylesheets/fancyqueries.scss @@ -0,0 +1,217 @@ +@charset "UTF-8"; + +/* GENERIC TEXT ENTRIES */ +input, textarea { + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.2); + /* -webkit-box-shadow: inset $x $y $blur $color; breaks on border-radius */ + border: 1px solid #aaaaaa; + background-color: #f0f0f0; + background: #f0f0f0 url(/images/input-bg.png) repeat-x 0 0; + padding: 4px; + margin: 0; + + &:focus { + border-width: 2px; + padding: 3px; + background-color: #fff; + outline: none; + } + &.disabled, &[disabled] { + opacity: 0.6; + } +} + +/* search forms */ +.search { + position: relative; + display: inline-block; + overflow: visible; + /* search widget dropdown list */ + + button { + z-index: 3; + position: absolute; + width: 16px; + height: 16px; + text-indent: -300em; + color: rgba(0, 0, 0, 0); + right: 8px; + top: 50%; + margin: -8px 0 0; + background-position: 0 0; + border: none; + padding: 0; + background: url(/images/icons/icon_search.png) no-repeat 0 0; + + &:hover { + box-shadow: none; + -webkit-shadow: none; + -moz-box-shadow: none; + } + } + + input[type="search"], input[type="text"] { + z-index: 2; + position: relative; + -moz-appearance: none; + -webkit-appearance: none; + border-radius: 20px; + -moz-border-radius: 20px; + -webkit-border-radius: 20px; + padding: 4px 30px 4px 10px; + float: right; + + &:focus { + padding: 3px 29px 3px 9px; + } + } + + .queries { + z-index: 1; + position: absolute; + left: 0; + top: 0; + bottom: 0; + width: 40px; + border-top-left-radius: 20px; + border-bottom-left-radius: 20px; + -moz-border-radius-topleft: 20px; + -moz-border-radius-bottomleft: 20px; + -webkit-border-top-left-radius: 20px; + -webkit-border-bottom-left-radius: 20px; + background-color: #ddd; + /* for IE */ + background: -moz-linear-gradient(top, #f0f0f0, #dddddd); + background: -webkit-gradient(linear, left top, left bottom, from(#f0f0f0), to(#dddddd)); + border: 1px solid #aaa; + + .arrow { + display: block; + position: relative; + width: 18px; + height: 6px; + top: 10px; + left: 3px; + margin-top: -1px; + background: url(/images/icons/icon_menu_arrow.gif) no-repeat 0 0; + } + + &:active { + background: -moz-linear-gradient(top, #d0d0d0, #f0f0f0); + background: -webkit-gradient(linear, left top, left bottom, from(#d0d0d0), to(#f0f0f0)); + } + + .open { + background: #f6f6f6; + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-top-left-radius: 14px; + -moz-border-radius-topleft: 14px; + -webkit-border-top-left-radius: 14px; + } + .queryeditor { + background: #bbb; + border-radius: 0; + -moz-border-radius: 0; + -webkit-border-radius: 0; + border-top-left-radius: 14px; + -moz-border-radius-topleft: 14px; + -webkit-border-top-left-radius: 14px; + } + } + + .qdropdown { + position: absolute; + border: 1px solid #bbb; + background-color: #f6f6f6; + top: 100%; + /* Providing a very high z-index. The intent is to not have other elements over top of the dropdown. */ + z-index: 100000; + + .left-menu { + left: 0; + } + .right-menu { + right: 12px; + } + ul { + display: block; + margin: 0; + li { + display: block; + padding: 0 16px 0 0; + &:hover { + cursor: pointer !important; + text-decoration: none; + background-color: #E6E6E6; + color: #000000; + } + a { + display: block; + padding: 4px 10px 4px 24px; + white-space: nowrap; + &:hover { + cursor: pointer !important; + text-decoration: none; + background-color: #E6E6E6; + color: #000000; + } + } + .delete { + position: absolute; + right: 3px; + width: 16px; + height: 16px; + margin: -22px 0 0 0; + background: url("/images/icons/action-icons.png") no-repeat -160px 0px; + &:hover { + background: url("/images/icons/action-icons.png") no-repeat -160px -16px #E6E6E6; + } + } + .favorite { + background: url(/images/icons/favorite.png) no-repeat 4px center; + } + .recent { + background: url(/images/icons/recent.png) no-repeat 4px center; + } + } + } +/* +.qdropdown ul { + margin: 0; padding: 0; +} +*/ + .showmore { + display: block; + font-size: 80%; + text-align: right; + padding-right: 10px; + text-decoration: none; + color: #888; + + &:hover { + cursor: pointer; + background-color: #fff; + color: #000; + } + } + + .queryeditor { + h1 { + font-size: 80%; + color: #fff; + background-color: #bbb; + text-align: right; + padding: 0.25em 0.5em; margin: 0; + } + h2 { + margin: 0 0 1em; + } + div { + padding: 12px; + } + } + } +} diff --git a/app/stylesheets/grid.scss b/app/stylesheets/grid.scss new file mode 100644 index 00000000000..93118098e4e --- /dev/null +++ b/app/stylesheets/grid.scss @@ -0,0 +1,16 @@ +/* 960 Grid System ~ Core CSS. + * Learn more ~ http://960.gs/ + * * + * Licensed under GPL and MIT. */ + +@import "compass/reset"; +@import "960/grid"; + +// The following generates the default grids provided by the css version of 960.gs +.container_12 { + @include grid-system(12); +} + +.container_16 { + @include grid-system(16); +} diff --git a/app/stylesheets/ie.scss b/app/stylesheets/ie.scss new file mode 100644 index 00000000000..5cd5b6c5bee --- /dev/null +++ b/app/stylesheets/ie.scss @@ -0,0 +1,5 @@ +/* Welcome to Compass. Use this file to write IE specific override styles. + * Import this file using the following HTML or equivalent: + * */ diff --git a/app/stylesheets/katello.scss b/app/stylesheets/katello.scss new file mode 100644 index 00000000000..a1a1a591d61 --- /dev/null +++ b/app/stylesheets/katello.scss @@ -0,0 +1,1039 @@ +@charset "UTF-8"; +@import "base"; +@import "compass/css3/gradient"; + +html { +} + +body { + background: #FFF url(/images/outer-background.png) repeat-x top; +} + +a { + color: $linkfg; + text-decoration: none; + &:hover, &:focus { + color: lighten($linkfg, 10%); + text-decoration: underline; + } + &:active { + color: darken($linkfg, 20%); + } +} + +strong { + font-weight: bold; +} + +/* TEXT ENTRIES */ +input,textarea { + @include inset-box-shadow(0,1px,1px,rgba(0, 0, 0, 0.2)); + border: 1px solid darken($strokecl,20%); + background-color: #f0f0f0; + background: #f0f0f0 url(/images/input-bg.png) repeat-x 0 0; + padding: 4px; + margin: 0; + &:focus { + border-width: 2px; + padding: 3px; + background-color: #fff; + outline: none; + } + &.disabled, &[disabled] { + opacity: 0.4; + } +} + input[type="search"] { + @include border-radius(20px); + padding: 4px 30px 4px 10px; + &:focus { + padding: 3px 29px 3px 9px; + } + } + /* CHECKBOXES and RADIOBUTTONS*/ + input[type="checkbox"],input[type="radio"] { + background-color: transparent; + border: none; + margin: 0; + padding: 2px; + &:focus { + border-width: 1px; + padding: 1px; + } + } + +/* FILE INPUT */ +input[type="file"] { + /* FIXME */ +} + +/* compensate grid_* for padding+border of the inputboxes and textareas */ +input.grid_1 { width: 30px !important; } +input.grid_2 { width: 90px !important; } + .grid_2 input[type="file"] { width: 90px; } +input.grid_3 { width: 150px !important; } + .grid_3 input[type="search"] { width: 118px; } +input.grid_4 { width: 210px !important; } +input.grid_5 { width: 270px !important; } + + +/* BUTTONS */ +input[type='submit'],button,.button { + font-family: $screenfont; /* for some reason ff3.6 won't inherit from body */ + font-size: 10px; + display: inline-block; + background: -moz-linear-gradient(top, #f9f9f9, #f0f0f0, #e5e5e5, #e9e9e9); + background: -webkit-gradient(linear, left top, left bottom, from(#f9f9f9), color-stop(0.9, #e5e5e5), to(#e9e9e9)); + @include no-box-shadow; + border: 1px solid darken($strokecl, 20%); + color: #221e1f; + cursor: pointer; + margin: 4px; + padding: 4px 12px; + @include border-radius(5px); + @include text-shadow(0, 1px, 0, #fff); + min-height: 14px; + .nomargin { + margin: 0; + } + &:hover { + background: -moz-linear-gradient(top, #fff, #fff, #cfcfcf); + background: -webkit-gradient(linear, left top, left bottom, from(#fff), color-stop(0.6, #fff), to(#cfcfcf)); + @include box-shadow(0, 1px, 2px, rgba(0,0,0,0.5)); + text-decoration: none; + color: black; + } + &:active { + background: -moz-linear-gradient(top, #c2c3c0, #e4e5e4); + background: -webkit-gradient(linear, left top, left bottom, from(#c2c3c0), to(#e4e5e4)); + @include no-box-shadow; + padding: 5px 12px 3px; + text-decoration: none; + } + &:focus { + text-decoration: none; + color: #000; + border-width: 2px; + padding: 3px 11px; + } + &.dialogbutton { + float: right; + margin-left: 3px; + margin: 40px 4px 4px; + } + &.formbutton { + display: inline-block; + margin-left: 3px; + margin: 40px 4px 4px; + } + &.actionlink { + margin: 40px 0 0; + } + &.disabled, &[disabled] { + cursor: default; + background: transparent; + opacity: 0.4; + /* @include no-box-shadow; */ + &:hover { + background: transparent; + @include no-box-shadow; + } + } + &.iconbutton { + display: inline-block; + } + &.tiny { + padding: 4px; + margin: 0; + &:active, &:focus { + margin: 0; + padding: 3px; + } + } +} + +.clear { + clear: both; +} + +.wrap { /* wrapper around floated elements */ + overflow: hidden; + margin-bottom: 2em; +} + +.nomargin { + margin: none; +} + +/* text align left */ +.la { text-align: left; } +/* text align right */ +.ra { text-align: right; } +/* text align right */ +.ca { text-align: center; } +/* float right */ +.fr { float: right; } +/* float left */ +.fl { float: left; } +/* "float", center */ +.fc { display: inline-block; margin: 0 auto; } + +.twocolumn { + @include column-count(2); + @include column-gap(10px); +} + +.placeholder { margin-bottom: 2em; } +.disabled { opacity: 0.4; cursor: default; } +.nomargin { margin: 0; } + +div,section,fieldset { + display: block; +} + +/* TABLES */ + +table { + border-collapse: collapse; + border: 1px solid $strokecl !important; + margin: 10px 0 40px; width: 100%; + font-size: 95%; + thead { + background-color: lighten($strokecl,25%); + th { + font-size: 95%; + padding: 2px 6px; + font-family: $headlinefont; + font-weight: bold; + color: lighten($headercl,20%); + text-transform: uppercase; + border-right: 1px dotted darken($strokecl,20%); + &:last-child { + border-right: 0 none; + } + a, a:hover { + display: block; + margin: 0; + color: inherit; + text-decoration: none; + &.active { + &.sortable { + display: inline-block; + padding-right: 20px; + } + &.desc { + background: url(/images/order-desc.png) no-repeat center right; + } + &.asc { + background: url(/images/order-asc.png) no-repeat center right; + } + } + } + } + } + td { + padding: 4px; + vertical-align: top; + min-height: 16px; + } + &.noborder { + border: none; + thead { + background-color: transparent; + th { + border: none; + span { + color: lighten($headercl,30%); + } + } + } + td { + color: #888; + .percentBlock { + border:1px solid #909090; + padding: 0; + width:100px; + font-size: 9px; + text-align: center; + color: #555; + .percentBlockInner { + } + .gradGreen { + background-color: $goodcl; + } + } + .min { + background: url(/images/arrow-min.png) no-repeat top center; + float:left; + padding-top:5px; + width:50%; + } + .max { + background: url(/images/arrow-max.png) no-repeat top center; + float:right; + padding-top:5px; + width:50%; + } + } + } + &.gap { + margin-bottom: 7em; + } +} + +.action { + background: url(/images/icons/action-icons.png) no-repeat 0 0; + &:hover { + background: url(/images/icons/action-icons.png) no-repeat 0 0; + } + &:active { + background: url(/images/icons/action-icons.png) no-repeat 0 0; + } +} + +.actionsidebar { + border-right: 1px solid darken($footerbg, 10%); + width: 159px !important; + img { + margin: 7px 0px 0px 0px; + } + dt { + background-color: $footerbg; + border-bottom: 1px solid darken($footerbg, 10%); + border-top: 1px solid darken($footerbg, 10%); + color: $headercl; + font-family: $headlinefont; + font-size: 110%; + font-weight: bold; + margin: 3px 0 20px; + padding:14px 10px 12px; + text-transform: uppercase; + } + dd { + margin: 0 0 0 10px; + font-size: 110%; + position: relative; + a { + display: block; + padding: 4px 4px 4px 20px; + &.selected { + background: url("/images/actionsidebar-bullet.png") no-repeat left center; + font-weight: bold; + color: $kselected; + } + } + h5 { + margin: 3em 0 .5em 0; + &:first-child { + margin: 0 0 .5em 0; + } + } + ul { + display: block; + li { + display: block; + margin: 0; + padding: 0 0 0 16px; + position: relative; + } + } + } + form.buttononly { + display: inline-block; + } + input[type='submit'].icon { + border: none; + background: transparent; + font-size: 100%; + padding: 0; + &:hover { + @include no-box-shadow; + color: $kselected; + &[disabled] { + color: #000; + } + } + } + span { + display: block; + position: absolute; + width: 16px; height: 16px; + left: 0; top: 50%; margin-top: -8px; + background: url(/images/icons/action-icons.png) no-repeat 0 0; + } + .edit span { background-position: -16px 0;} + .delete span { background-position: -32px 0;} + .rename span { background-position: -80px 0;} + .copy span { background-position: -48px 0;} + .build span { background-position: -64px 0;} + .add span { background-position: -48px 0;} + label { + font-weight: normal; + } +} + +.actions { + span { + display: inline-block; + position: relative; + width: 16px; height: 16px; + margin: 2px 2px 0px 6px; + background: url(/images/icons/action-icons.png) no-repeat 0 0; + float: left; + &.edit { background-position: -16px 0;} + &.delete { background-position: -32px 0;} + &.rename { background-position: -80px 0;} + &.copy { background-position: -48px 0;} + &.build { background-position: -64px 0;} + &.add { background-position: -48px 0;} + &:first-child { margin-left: 2px; } + } + label { + font-weight: normal; + float: left; + border-right: 2px solid #BEBEBE; + padding-right: 6px; + &:last-child { + border-right: none 0; + } + } + /* BUTTONS */ + input[type='submit'],button,.button { + margin: 0px 4px 4px; + } +} + +/* ICONS */ + +img.icon { + width: 16px; height: 16px; + vertical-align: middle; + background: url(/images/icons/statusicons.png) no-repeat 0 0; + &.large { + width: 48px; height: 16px; + } + &.yes { background-position: -16px 0; } + &.no { background-position: -32px 0; } + &.platform { + background: url(/images/icons/platformicons.png) no-repeat 0 0; + &.rhel { + background-position: 0 0; + } + } +} + +#notification { + &>div { + padding: 10px; + @include border-radius(5px); + margin-bottom: 2em; + ul { + display: block; + margin: 0; + li { + display: block; + margin: 0; + } + } + } + .success { + background-color: lighten($goodcl,40%); + border: 1px solid $goodcl; + } + .error { + background-color: lighten($badcl,40%); + border: 1px solid $badcl; + } + .close { + display: block; + position: absolute; + width: 16px; height: 16px; + top: 0; right: 0; + background: url(/images/icons/close.png) no-repeat 0 0; + cursor: pointer; + } +} + +ul.block { + display: block; + margin: 0; + li { + display: block; + margin: 0; + } +} + +#head { + font-size: 12px; + padding: 5px 0 0 0; + overflow: hidden; + @include text-shadow(0, 1px, 0, #000); + height: 40px; + header { + display: block; + ul { + margin-top: 9px; + display: inline-block; + float: right; + li { + display: inline-block; + margin: 0 5px; + &.hello { + margin-left: 30px; + } + a { + color: #fff; + } + } + } + h1 { + font-size: 14px; + color: #FFF; + margin: 7px 0 0 8px; + float: left; + } + img { + margin: 6px; + float: left; + &:first-child { + margin-top: 2px !important; + margin-left: 0 !important; + } + &:last-child { + margin: 0; + } + } + #loading { + display: none; + position: relative; + width: 16px; + padding: 8px 0 0 0; + } + } + + /* HEADER BUTTONS */ + input[type='submit'],button,.button { + font-family: $screenfont; + font-weight: bold; + font-size: 10px; + display: inline-block; + background: -moz-linear-gradient(top, lighten($kprimary, 20%), $kprimary ); + background: -webkit-gradient(linear, left top, left bottom, from(lighten($kprimary, 20%)), to($kprimary)); + @include no-box-shadow; + border: 0 none; + color: #FFF; + cursor: pointer; + @include border-radius(5px); + @include text-shadow(0, 1px, 0, #000); + min-height: 14px; + .nomargin { + margin: 0; + } + &:hover { + background: -moz-linear-gradient(top, lighten($kprimary, 30%), lighten($kprimary, 20%)); + background: -webkit-gradient(linear, left top, left bottom, from(lighten($kprimary, 30%)), to(lighten($kprimary, 20%))); + @include box-shadow(0, 1px, 2px, rgba(0,0,0,0.5)); + text-decoration: none; + color: #fff; + } + &:active { + background: -moz-linear-gradient(top, lighten($kprimary, 30%), lighten($kprimary, 20%)); + background: -webkit-gradient(linear, left top, left bottom, from(lighten($kprimary, 30%)), to(lighten($kprimary, 20%))); + @include no-box-shadow; + text-decoration: none; + @include text-shadow(0, 2px, 2px, #000); + } + &:focus { + text-decoration: none; + color: #FFF; + } + &.disabled, &[disabled] { + cursor: default; + background: transparent; + opacity: 0.4; + /* @include no-box-shadow; */ + &:hover { + background: transparent; + @include no-box-shadow; + } + } + } +} + +#subheader { + position: relative; + min-height: 62px; + height: 62px; + #s { + font-size: 80%; + text-align: right; + overflow: hidden; + padding: 10px 0 0; + p { + margin: 0; + } + div { + position: relative; + margin-bottom: 0; + button { + position: absolute; + width: 16px; height: 16px; + text-indent: -200em; + right: 8px; top: 50%; + margin: -8px 0 0; + background-position: 0 0; + border: none; + padding: 0; + &:hover { + @include no-box-shadow; + } + } + input[type="search"] { + border-color: $headerbg; + width: 80%; + } + } + a { + color: #fff; + margin-right: 10px; + } + } +} + +nav { + &.tab_nav { /* main tabs navigation */ + display: block; + font-weight: bold; + font-family: $headlinefont; + font-size: 125%; + &>ul { + display: block; + position: absolute; + bottom: 0; + &>li { + display: inline-block; + margin: 0 4px 0 0; + padding: 0; + color: #888; + background-color: #ddd; + background: -moz-linear-gradient(top, #fff, #ddd 2px, #ddd 70%, lighten($strokecl, 10%)); + background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#eee), to(lighten($strokecl,10%)), color-stop(.01, #ddd), color-stop(.7,#ddd)); + border: 1px solid $strokecl; + &.selected { + background: #fff; + padding-bottom: 1px; + border-bottom: none; + &>a { + color: $tabon; + @include no-text-shadow(); + } + } + &>a { + display: block; + padding: 9px 18px; + text-decoration: none; + color: $taboff; + @include text-shadow(0,1px,0,#fff); + &:hover { + color: lighten($kselected,10%); + } + } + } + } + } + &.subnav { /* subnavigation */ + position: relative; + display: block; + background: transparent url(/images/subnav-shadow.png) repeat-x 0 bottom; + font-family: $headlinefont; + font-size: 115%; + padding-bottom: 9px; + &>ul { + display: block; + li { + display: inline-block; + margin: 0; + padding: 0; + a { + cursor: pointer; + text-transform: none; + text-decoration: none; + @include text-shadow(0,1px,0,#fff); + display: block; + margin: 0; + padding: 8px 16px 6px; + color: $taboff; + &.selected { + color: $tabon; + font-weight: bold; + border-bottom: 3px solid $kselected; + padding-bottom: 3px; + } + &:hover { + color: lighten($kselected,10%); + } + } + } + } + } + &.subsubnav { /* in page tabs */ + @include border-radius(16px); + position: static; + overflow: hidden; + bottom: inherit; + left: inherit; + right: inherit; + margin-bottom: 2em; + border: none; + &>ul { + display: inline-block; + height: 3.5em; + background-color: lighten($kselected, 65%); + @include border-radius(5px); + li { + display: block; + float: left; + margin: 5px; + a { + cursor: pointer; + font-family: $screenfont; + text-transform: none; + font-weight: normal; + color: black; + display: block; + padding: 6px 12px; margin-right: 10px; + &.selected { + background-color: $kselected; + @include border-radius(5px); + color: #FFF; + } + } + } + } + } +} /*end nav*/ + +.modalbox { + margin: 130px auto; + @include box-shadow(0,1px,5px,rgba(0, 0, 0, 0.6)); + width: 550px; + overflow: hidden; + background-color: #FFF; + h2 { + background-color: $formheadbg; + color: $formheadfg; + text-transform: uppercase; + font-size: 120%; + padding: 10px; + } + .katello_form { + margin: 40px; + overflow: hidden; + } + .errorExplanation { + h2 { + text-transform: none; + } + } +} + +#maincontent { + background: transparent url(/images/center-background.png) no-repeat center top; + overflow: hidden; + min-height: 200px; + .inner { + margin-top: 16px; + min-height: 325px; + p { + margin-left: 10px; + } + } + a { + cursor: pointer; + cursor: hand; + } +} +/* FORMS */ +/* generic */ +label { + text-align: right; + font-weight: bold; + color: $labelfg; + &.header { + text-align: left; + font-weight: normal; + font-size: 90%; + margin-bottom: 1em; + } + &.big { + text-align: left; + text-transform: uppercase; + font-family: $headlinefont; + font-size: 110%; + font-weight: bold; + color: $formheadfg; + } +} + +legend { + font-size: 130%; + font-family: $headlinefont; + font-weight: bold; + text-transform: uppercase; + color: $headercl; +} + +/* When you need to seperate items within a fieldset */ +.fielditem { + margin-top: 5px; + margin-bottom: 5px; +} + +/* simple two column label + input pairs */ +.katello_form { + fieldset { + overflow: hidden; + margin: 10px 0 0; + text-align: right; + label { + display: inline-block; + font-weight: bold !important; + padding: 4px 10px 0 0; + max-width: 10em; + } + input { + display: inline-block; + width: 20em; + } + .fieldWithErrors { + display: inline-block; + border: 0; margin: 0; padding: 0; + input { + background-color: lighten($errorcl, 45%); + color: $errorcl; + } + label { + color: $errorcl; + } + } + } + .indented { + margin: 10px 0 0; + text-align: right; + input[type="text"],label,a,div,p { + text-align: left; + display: inline-block; + width: 20em; + } + } +} + +/* search forms */ + +.search { + position: absolute; + button { + position: absolute; + width: 16px; height: 16px; + text-indent: -4000em; + right: 10px; top: 50%; + margin: -8px 0 0; + background-position: 0 0; + border: none; + padding: 0; + &:hover { + @include no-box-shadow; + } + } + input[type="search"] { + float: right; /* webkit adds an extra padding and makes the widget narrower */ + width: 220px; + } +} + +/*footer*/ +footer { + font-size: 95%; + margin: 20px 0 0; + padding: 20px 10px 10px 10px; + display: block; + background: transparent url(/images/footer-shade.png) repeat-x 0 0; + ul { + display: block; + padding: 10px 10px 0 0; + min-height: 50px; + width: 99%; + li { + &:first-child { + float: left; + } + display: block; + float: right; + margin-left: 1em; + } + } + + &.fixed { + position: absolute; + bottom: 0; left: 0; right: 0; + } +} +#toTop { + display:none; + text-decoration:none; + position:fixed; + bottom:10px; + left:10px; + overflow:hidden; + width:32px; + height:32px; + border:none; + text-indent:-999px; + background:url(/images//ui.totop.png) no-repeat left top; +} + +#toTopHover { + background:url(/images//ui.totop.png) no-repeat left -32px; + width:32px; + height:32px; + display:block; + overflow:hidden; + float:left; + opacity: 0; + -moz-opacity: 0; + filter:alpha(opacity=0); +} + +#toTop:active, #toTop:focus { + outline:none; +} +/* end footer */ + +/* RIGHT SIDEBAR */ +.sidebarcontainer { + /* height: 300px; overflow: scroll; */ + display: block; + li { + display: block; + margin: 0; + } + h5 { + text-transform: none; + margin-top: 3em; + } +} + +/* PAGE SPECIFIC */ +/* Sytems::Facts */ +#facts { + table { + td { + padding-left: 18px; + } + } +} + + +/* GRINDS */ +.status { + span { + display: inline-block; + width: 10px; + height: 10px; + background: url(/images/icons/status.png) no-repeat 0 0; + &.good { + background-position: 0 0; + } + &.ok { + background-position: 0 -10px; + } + &.bad { + background-position: 0 -20px; + } + } +} + +a.iconbutton { + padding: 4px 4px 4px 24px; + position: relative; + overflow: hidden; + @include border-radius(2px); + &:active { + padding: 4px 4px 4px 24px; + } + &:focus { + padding: 3px 3px 3px 23px; + } + img { + position: absolute; + width: 18px; + height: 54px; + left: 0; top: 50%; + margin-top: -27px; + background: url(/images/icons/launchinstance.png) no-repeat 0 0; + } +} + +/* IE and other horror browser workarounds */ + +/* basic image styling for buttons in older browsers */ +.no-cssgradients input[type='submit'], .no-cssgradients button, .no-cssgradients .button { + /* FIXME image based buttons */ +} + +/* when modalbox miss dropshadow set some border */ +.no-boxshadow .modalbox { border: 2px solid $strokecl; } + +/* DEBUG GRID */ +#grid { + display: none; + position: fixed; + top: 0; bottom: 0; + left: 50%; + width: 1020px; + margin-left: -510px; + background: url(/images/960.png) repeat-y top center; +} + +.outlined { + outline: 2px solid $kselected; +} + +.remove_item { + color: darkRed; + right: 82px; + position: absolute; + top: 9px; +} + +/*provides same styling as .remove_item without the bound action*/ +.remove_item_custom { + @extend .remove_item; +} + +.notifications { + tr.success { + @include linear-gradient(color-stops(white, white, "#F2FFE5")); + &:hover { + @include linear-gradient(color-stops(white, "#F2FFE5")); + } + } + tr.error { + @include linear-gradient(color-stops(white, white, "#FFE5E5")); + &:hover { + @include linear-gradient(color-stops(white, "#FFE5E5")); + } + } + tr.message { + @include linear-gradient(color-stops(white, white, "#EFEFEF")); + &:hover { + @include linear-gradient(color-stops(white, "#EFEFEF")); + } + } + tr.warning { + @include linear-gradient(color-stops(white, white, "#FFFFE5")); + &:hover { + @include linear-gradient(color-stops(white, "#FFFFE5")); + } + } +} diff --git a/app/stylesheets/print.scss b/app/stylesheets/print.scss new file mode 100644 index 00000000000..b0e9e456f84 --- /dev/null +++ b/app/stylesheets/print.scss @@ -0,0 +1,3 @@ +/* Welcome to Compass. Use this file to define print styles. + * Import this file using the following HTML or equivalent: + * */ diff --git a/app/stylesheets/screen.scss b/app/stylesheets/screen.scss new file mode 100644 index 00000000000..bf579b7b2ac --- /dev/null +++ b/app/stylesheets/screen.scss @@ -0,0 +1,856 @@ +@charset "UTF-8"; +@import "compass/reset"; +@import "base"; +@import "text"; + +#main { + ul { + margin: 0; + padding: 0; + li { + list-style-type: none; + } + } + .actions { + margin-top: 1em; + } +} + +.heading { + display:block; + h1,h2,h3,h4,h5 { + display: inline-block; + float: left; + } + .helptip-close { + float: left; + } + .helptip-open { + clear: both; + } +} + +#loginpage #content { + background: none; +} +#generic #content { + background-position: top center; +} +.alt { + background-color: lighten($lightgrey, 35%) !important; +} + +.clickable { + cursor: pointer; + cursor: hand; +} + +.spinner { + margin-top: 30%; + height: 16px; + display: block; + /*display: none;*/ + position: relative; + z-index: 1000; + padding-left: 47%; +} + +/* details icon for in showing ability to click into details */ +.details +{ + cursor: pointer; + cursor: hand; + @include border-radius(5px); + &:hover { + background: #F2F2F2; + } +} + +.details-icon +{ + background: url("/images/icons/info.png") no-repeat scroll 98% 6px transparent; + &:hover { + background: url("/images/icons/info-hover.png") no-repeat scroll 98% 6px; + } +} +/* end details icon for in place editing*/ + +/* editable icon for in place editing */ +.editable +{ + padding: 4px 26px 4px 2px; + background: url("/images/icons/edit.png") no-repeat scroll 98% 6px transparent; + cursor: pointer; + cursor: hand; + @include border-radius(5px); + &:hover { + background: url("/images/icons/edit-hover.png") no-repeat scroll 98% 6px #F2F2F2; + } +} + +fieldset { + div { + padding: 4px 0; + } +} +/* end editable icon for in place editing*/ + +#loginpage #maincontent { + background: 0 none; +} + +/* 2 pane css */ +#container, .container { + width: 100%; + margin:0 auto; + min-height:500px; + #breadcrumb { + font-weight: bold; + font-size: 115%; + color: #FFF; + background-color: $kselected; + word-wrap: break-word; + outline: 2px solid $kselected; + padding: 5px; + } +} +/* right side of 2 pane below the sliding pane */ +.right { + float:right; + width:460px; +} +/* left side of 2 pane that has clickable links */ +.left { + float:left; + width:450px; + min-height:500px; + position:relative; + z-index: 100; + h2 { + margin-bottom: 0; + } + #new { + border-bottom: 0 none; + padding: 8px; + position: absolute; + margin: 0; + clear: right; + text-align: center; + width: 10em; + right: 0; + height: 2em; + &.block{ + &.active{ + .arrow-right { + border-bottom: 19px solid transparent; + border-left: 17px solid $kselected; + border-top: 18px solid transparent; + right: -17px; + } + } + &:hover { + .arrow-right { + border-left: 17px solid $listhover; + } + } + } + } + /* search forms */ + .search { + float: right; + margin-bottom: 6px; + margin-top: 6px; + margin-right: 6px; + position: relative; + clear: right; + button { + position: absolute; + width: 16px; height: 16px; + text-indent: -4000em; + margin: -8px 0 0; + background-position: 0 0; + border: none; + padding: 0; + &:hover { + box-shadow: none; + -webkit-shadow: none; + -moz-box-shadow: none; + } + } + input[type="text"] { + float: right; /* webkit adds an extra padding and makes the widget narrower */ + width: 215px; + } + } + .block_head { + background-color: lighten($strokecl,8%); + display: block; + height: 1.3em; + color: $lightgrey; + .column_1, .column_2, .column_3 { + text-align: left; + padding-left: 1%; + font-size: 85%; + font-family: $headlinefont; + color: lighten($headercl,20%); + text-transform: uppercase; + white-space:nowrap; + border-right: 1px dotted darken($strokecl,20%); + &:last-child { + border-right: 0 none; + } + a, a:hover { + display: block; + margin: 0; + color: inherit; + text-decoration: none; + &.active { + &.sortable { + display: inline-block; + padding-right: 20px; + } + &.desc { + background: url(/images/order-desc.png) no-repeat center right; + } + &.asc { + background: url(/images/order-asc.png) no-repeat center right; + } + } + } + } + .column_1 { width: 98%; } + .column_2 { width: 48%; } + .column_3 { width: 31%; } + } + .column_1 { + width: 100%; + float: left; + } + .column_2 { + width: 50%; + float: left; + } + .column_3 { + width: 33%; + float: left; + &:last-child { + width: 34%; + } + } +} +.ui-autocomplete { z-index: 300 !important } +.block { + border-bottom: solid 1px #F2F2F2; + padding: 4px 10px 8px 5px; + cursor:pointer; + position: relative; + width: 96.6%; + height: 30px; + font-size: 90%; + &.active { + background-color: $kselected; + color: #FFF; + .arrow-right { + border-bottom: 21px solid transparent; + border-left: 21px solid $kselected; + border-top: 21px solid transparent; + height: 0; + margin: 0; + position: absolute; + right: -21px; + top: 0px; + width: 0; + z-index: 220; + } + } + &.add { + background-color: $listhover; + color: #FFF; + } + &:hover { + background-color: $listhover; + color: #FFF; + .arrow-right { + border-left: 21px solid $listhover; + } + } + +} +#plans { + .block { + border-bottom: solid 1px #F2F2F2; + padding: 6px 16px 6px 17px; + cursor:pointer; + position: relative; + width: 416px; + height: 17px; + &.active { + background-color: $listhover; + color: #FFF; + .arrow-right { + border-top: 15px solid transparent; + border-bottom: 15px solid transparent; + border-right: 15px solid $listhover; + border-left: none; + height: 0; + margin: 0; + position: absolute; + left: -15px; + top: -1px; + width: 0; + z-index: 220; + } + } + } +} +#panel-frame { + position:absolute; + max-width:700px; + top: 13.2em; + z-index: 1; +} +#subpanel-frame { + position:absolute; + max-width:700px; + top: 13.2em; + z-index: 0; +} + +.subpanel { + z-index: 0; + border-top: 1px solid #D1D1D2; + top: 35px; + h2 { + font-size: 100%; + margin-top: 9px; + padding-right: 170px; + } +} + +.panel { + background-color:#F5FAFA; + width:490px; + height:490px; + margin-top:0; + position:relative; + left:0; + @include opacity(0); + overflow-x: hidden; + overflow-y: auto; + border-right: 1px solid #D1D1D2; + border-left: 1px solid #D1D1D2; + border-bottom: 1px solid #D1D1D2; + border-top: 1px solid #D1D1D2; + z-index: 0; + top: 0; + + .subnav { + border: 0; + width: inherit; + background: transparent url(/images/3rd-level-bg.png) no-repeat bottom center; + @include background-size(100% 29px); + margin-bottom: 10px; + &>ul { + li { + background: none; + &.selected { + background: none; + } + } + } + } + .subsubnav { + background: none transparent; + } + .helptip-close{ + float: right; + } + .helptip-open-button { + right: 50px; + top: 7px; + } +} +.data { + padding-left: 18px; + font-size: 100%; +} +.head { + padding:10px; + position: absolute; + right: 0; +} +#list, .list { + min-height:450px; + border: 1px solid #B5B5B5; + background-color: #FFF; + font-size: 110%; + .ajax_scroll { + margin-left: auto; + margin-right: auto; + display: block; + } + li { + cursor: pointer; + cursor: hand; + padding: 4px; + height: 2.7em; + &:hover { + background-color: $listhover; + color: #FFF; + } + } + .slide_link { + background: url(/images/icons/right-arrow.png) no-repeat right center transparent; + margin: 6px 0; + } + .item { + position: relative; + top: 8px; + padding-left: 4px; + @include border-radius(4px); + } + .button { + text-align: center; + width: 3.7em; + } + #slider { + .block { + border-bottom: none 0; + &:hover { + background-color: #729FCF; + } + } + } +} +#list-title, .list-title { + display: block; + height:74px; + width: 449px; + background-color: #FFF; +} +.slider {width: 437px;} + +#breadcrumb { + .slide_link { + display: inline; + } +} + + +/* sync products table */ +.products +{ + input[type="checkbox"],input[type="radio"] { + margin: 3px; + float: left; + } + ul { + margin: 0; + padding: 0 !important; + li { + margin: 0; + padding: 0 !important; + clear: both; + input[type="checkbox"], .products input[type="radio"] { + margin-right: 23px; + } + } + } + .repo div{ + padding-top: 3px; + } +} +.progress { + position: relative; + display: block; + height: 16px; + display: block !important; +} +/* end sync products */ + +/* content locker custom css */ +.shadowbox { + @include inset-box-shadow(1px,1px,1px,rgba(0, 0, 0, 0.2)); + padding: 0.5em; + margin-bottom: 1em; + border: 1px solid #D9D9D9; + min-height: 100px; + ul{ + margin: 0; + padding: 0; + list-style-type: none; + li { + margin: 0; + } + } +} +.content_add_remove_product { + cursor: pointer; + cursor: hand; + margin-right: 5px; + width: 40px; + text-align: center; +} +.remove_product { + background: -moz-linear-gradient(top, #CCC, #bbb, #aaa, #999); + background: -webkit-gradient(linear, left top, left bottom, from(#CCC), color-stop(0.9, #bbb), to(#999)); +} +.add_product { + background: -moz-linear-gradient(top, #FFF, #f0f0f0, #e5e5e5, #e9e9e9); + background: -webkit-gradient(linear, left top, left bottom, from(#FFF), color-stop(0.9, #e5e5e5), to(#e9e9e9)); +} +@mixin changeset_remove{ + font-weight: bold; + border: 1px solid transparent; + display: block; + float: left; + margin: 3px; + padding: 5px 18px 5px 5px; + &:hover { + background-color: #F2F2F2; + border-color: darken(#F2F2F2, 30%); + @include border-radius (5px); + background: url("/images/icons/close.png") no-repeat scroll right center transparent; + } +} + +$product_color: #070; +$package_color: #666; +$errata_color: #700; +$repo_color: #4A9FB1; +.changeset_remove_product { color: $product_color; @include changeset_remove;} +.changeset_remove_package { color: $package_color; @include changeset_remove;} +.changeset_remove_errata { color: $errata_color; @include changeset_remove;} +.changeset_remove_repo {color: $repo_color; @include changeset_remove;} + +.changeset_product { color: $product_color;} +.changeset_package { color: $package_color;} +.changeset_errata { color: $errata_color; } +.changeset_repo {color: $repo_color;} + +.breadcrumb { + list-style: none; + overflow: hidden; + font: 14px; + position: relative; + li { + float: left; + margin-left: 0; + a { + color: #000; + text-decoration: none; + padding: 8px 0 8px 55px; + background: $breadcrumbbg; /* fallback color */ + position: relative; + display: block; + float: left; + &:after { + content: " "; + display: block; + width: 0; + height: 0; + border-top: 50px solid transparent; /* Go big on the size, and let overflow hide */ + border-bottom: 50px solid transparent; + border-left: 30px solid $breadcrumbbg; + position: absolute; + top: 50%; + margin-top: -50px; + left: 100%; + z-index: 2; + } + &:before { + content: " "; + display: block; + width: 0; + height: 0; + border-top: 50px solid transparent; /* Go big on the size, and let overflow hide */ + border-bottom: 50px solid transparent; + border-left: 30px solid white; + position: absolute; + top: 50%; + margin-top: -50px; + margin-left: 1px; + left: 100%; + z-index: 1; + } + } + } +} +.breadcrumb li:first-child a { + padding-left: 20px; + @include border-left-radius(5px); +} +.breadcrumb li:nth-child(2) a { + background: $breadcrumbbg; + &:after { border-left-color: $breadcrumbbg; } +} +.breadcrumb li:last-child a { + padding-right: 30px; + @include border-right-radius(5px); + &:hover { + color: #FFF; + background: $listhover !important; + } + &:after { + border: 0; + &:hover { + border-left-color: $listhover !important; + } + } +} +.breadcrumb li a:hover { + background: $listhover !important; color: #FFF; @include text-shadow(2px ,2px,2px,rgba(0,0,0,0.6)); + &:after { + border-left-color: $listhover !important; + } +} +.breadcrumb li a.active { + background: $kselected; color: white; + &:hover:after { + border-left-color: $listhover !important; + } + &:after { + border-left-color: $kselected !important; + } +} +/* end content locker custom css */ + +/* begin helptip */ +.helptip-open { + background-color: #EEE; + display: block; + padding: 12px; + border: 1px solid #DDD; + width: 80%; + margin: 0 auto 5px auto; + @extend .clearfix; +} + +.helptip-open-button { + background: url(/images/icons/action-icons.png) no-repeat 0 0; + background-position: -336px 0; + height: 16px; + width: 16px; + z-index: 200; + position: absolute; + &:hover { + background-position: -336px -16px; + } + @extend .clearfix +} + +.helptip-close-button { + position: relative; + float: right; + height: 16px; + width: 16px; + margin: 0px; + background: url(/images/icons/action-icons.png) no-repeat 0 0; + background-position: -32px 0; + &:hover { + background-position: -32px -16px; + } +} +.helptip-close { + display: block; + margin: 4px; + height: 18px; +} +/* end helptip */ + +/* begin product icons */ +.sprite { + background: url(/images/icons/objects.png) no-repeat 0 0; + height: 16px; + width: 16px; + position: absolute; + margin-top: 2px; +} +.custom-product-sprite { + background-position: -16px 0; + @extend .sprite; +} + +.rh-product-sprite { + background-position: -48px 0; + @extend .sprite; +} + +.product-icon { + padding-left: 18px; + vertical-align:middle; +} +/* end product icons */ + +/* begin simple pass meter css */ +.simplePassMeter { + border: 1px solid #aaa; + background-color: #f3f3f3; + color: #666; + font-size: 0.8em; + padding: 1px 5px 0 5px; + margin: 0; + width: 19em; + margin-bottom: 10px; +} + +.meterFail { border: 1px solid #daa; background-color: #fdd; } +.meterWarn { border: 1px solid #fd6; background-color: #feb; } +.meterGood { border: 1px solid #ada; background-color: #dfd; } +.meterExcel { border: 1px solid #aad; background-color: #ddf; } + +.simplePassMeterBar { background-color: #ddd; } +.meterFail .simplePassMeterProgress { background-color: #f66; } +.meterWarn .simplePassMeterProgress { background-color: #fd6; } +.meterGood .simplePassMeterProgress { background-color: #ada; } +.meterExcel .simplePassMeterProgress { background-color: #88f; } + +.simplePassMeter p { margin: 0; } +.simplePassMeterIcon { height: 16px; width: 16px; float: left; } +.meterFail .simplePassMeterIcon, +.meterWarn .simplePassMeterIcon, +.meterGood .simplePassMeterIcon, +.meterExcel .simplePassMeterIcon { + background-image: url('/images/simplePassMeterSprite.png'); + background-repeat: no-repeat; +} +.meterExcel .simplePassMeterIcon { background-position: 0 0; } +.meterFail .simplePassMeterIcon { background-position: 0 -17px; } +.meterGood .simplePassMeterIcon { background-position: 0 -34px; } +.meterWarn .simplePassMeterIcon { background-position: 0 -51px; } + +.simplePassMeterText { margin-left: 2px; } +/* end simple pass meter css */ + +.permission { + display: inline-block; + margin-bottom:10px; + margin-top:10px; +} + +/*multi select*/ +.ui-multiselect { border: solid 1px #B5B5B5; font-size: 0.8em; } +.ui-multiselect ul { -moz-user-select: none; } +.ui-multiselect li { margin: 0; padding: 0; cursor: default; line-height: 20px; height: 20px; font-size: 11px; list-style: none; } +.ui-multiselect li a { color: #999; text-decoration: none; padding: 0; display: block; float: left; cursor: pointer;} +.ui-multiselect li.ui-draggable-dragging { padding-left: 10px; } + +.ui-multiselect div.selected { position: relative; padding: 0; margin: 0; border: 0; float:left; } +.ui-multiselect ul.selected { position: relative; padding: 0; overflow: auto; overflow-x: hidden; background: #fff; margin: 0; list-style: none; border: 0; position: relative; width: 100%; } +.ui-multiselect ul.selected li { } + +.ui-multiselect div.available { position: relative; padding: 0; margin: 0; border: 0; float:left; border-left: 1px solid; } +.ui-multiselect ul.available { position: relative; padding: 0; overflow: auto; overflow-x: hidden; background: #fff; margin: 0; list-style: none; border: 0; width: 100%; } +.ui-multiselect ul.available li { padding-left: 10px; } + +.ui-multiselect .ui-state-default { border: none; margin-bottom: 1px; position: relative; padding-left: 20px;} +.ui-multiselect .ui-state-hover { border: none; } +.ui-multiselect .ui-widget-header {border: none; font-size: 11px; margin-bottom: 1px;} + +.ui-multiselect .add-all { float: right; padding: 7px;} +.ui-multiselect .remove-all { float: right; padding: 7px;} +.ui-multiselect .search { float: left; padding: 4px;} +.ui-multiselect .count { float: left; padding: 7px;} + +.ui-multiselect li span.ui-icon-arrowthick-2-n-s { position: absolute; left: 2px; } +.ui-multiselect li a.multi-action { position: absolute; right: 2px; top: 2px; } + +.ui-multiselect input.search { height: 14px; padding: 1px; opacity: 0.5; margin: 4px; width: 100px; } + +.ui-resizable-e { + background: url("/images/icons/grabber.png") 1px 50% no-repeat; +} + +#unread_notices { + @include text-shadow(0,1px,1px, #000); + @include border-radius(3em); + background-color: darken($kprimary,10%); + margin: 0.3em; + padding: 0.2em 0.7em; + width: auto; + color: #FFF; + @include box-shadow(0, 1px, 1px, #000); +} + +.product-icon { + vertical-align:middle; +} + +.promoted { + font-size: 11px; + font-style: italic; + line-height: 30px; + text-align: center; + width: 71px; + @include opacity(.7); +} + +.product_arch { + font-size: 11px; + display: inline; +} + + +.sp { + width: 90px; + padding-top: 8px; +} + +/*Environment selector stuff*/ + +#path-widget { + margin: 0 auto; + width: 50%; +} + +#path-controller { + border-style: solid; + border-width: 1px; + border-color: #d3d3d3; + + padding: 6px; + +} +.path_selector { + display: inline; + float: right; + + vertical-align:middle; + margin-top: 8px; +} + +.path_selected { + display: inline; + padding-bottom: 6px; + margin-bottom: 6px; + +} +.path_entry_selected { + background-color: $lightgrey; + + +} +.path_entry { + padding-left: 6px; + padding-right: 33px; + padding-top: 6px; + padding-bottom: 6px; + &:hover { + background-color: $lightgrey; + color: #FFF; + } + +} +.path_entries { + @include box-shadow(4px,4px,2px,rgba(0, 0, 0, 0)); + + border-style: solid; + border-width: 1px; + border-color: #d3d3d3; + + display: none; + + z-index: 200; + position: absolute; + background-color: #FFF; +} diff --git a/app/views/accounts/show.html.haml b/app/views/accounts/show.html.haml new file mode 100644 index 00000000000..260baf8dc85 --- /dev/null +++ b/app/views/accounts/show.html.haml @@ -0,0 +1,6 @@ +!!! + +some user info goes here + +%a{ :href => "/logout"} + #{_('Logout')} \ No newline at end of file diff --git a/app/views/changesets/_changeset.html.haml b/app/views/changesets/_changeset.html.haml new file mode 100644 index 00000000000..6289151fc69 --- /dev/null +++ b/app/views/changesets/_changeset.html.haml @@ -0,0 +1,67 @@ +//Promotion change set pane + + +- if @changeset + #changeset{"data-id"=>@changeset.id, "data-timestamp"=>@changeset.updated_at.to_i} + #changeset-items.shadowbox + #changeset-items-product + - @changeset.products.sort{|a,b| a.name <=> b.name}.each do |product| + %a.changeset_remove.changeset_remove_product{"data-id" => product.id, "data-type"=>"product", "data-display_name"=>product.name} + = product.name + #changeset-items-errata + - @changeset.errata.each do |errata| + %a.changeset_remove.changeset_remove_errata{"data-id" => errata.errata_id, "data-display_name"=>errata.display_name, "data-type"=>"errata" } + = errata.display_name + #changeset-items-package + - @changeset.packages.each do |package| + %a.changeset_remove.changeset_remove_package{"data-id" => package.package_id, "data-display_name"=>package.display_name, "data-type"=>"package"} + = package.display_name + #changeset-items-repo + - @changeset.repos.each do |repo| + %a.changeset_remove.changeset_remove_repo{"data-id" => repo.repo_id, "data-display_name"=>repo.display_name, "data-type"=>"repo"} + = repo.display_name + %br.clear + + .clear +   + + .grid_7 + %h3 + = _("Changeset Summary") + + + .grid_2.ra.changeset_product + = _("Products") + ":" + .grid_5.la + = @changeset.products.size + + .grid_2.ra.changeset_errata + = _("Errata") + ":" + .grid_5.la + = @changeset.errata.size + + + .grid_2.ra.changeset_package + = _("Packages") + ":" + .grid_5.la + = @changeset.packages.size + + .grid_2.ra.changeset_repo + = _("Repositories") + ":" + .grid_5.la + = @changeset.repos.size + + .clear +   + + #depend_list.details{"data-url"=>dependency_list_changeset_path(@changeset.id)} + .grid_2.suffix_5.ra + = _("Dependencies") + ":" + .grid_2.ra.changeset_package + = _("Packages") + ":" + #depend_size.grid_5{"data-url"=>dependency_size_changeset_path(@changeset.id)} + = image_tag("/images/spinner.gif") + + - if @environment.successor + = form_tag "#{promote_changeset_path(@changeset.id)}", :method =>"post" do |f| + = submit_tag "#{_("Promote to")} #{@environment.name}", :class => "submit dialogbutton", :style=>"float:right;" diff --git a/app/views/changesets/_dependency_list.html.haml b/app/views/changesets/_dependency_list.html.haml new file mode 100644 index 00000000000..d945ec8e769 --- /dev/null +++ b/app/views/changesets/_dependency_list.html.haml @@ -0,0 +1,3 @@ +- for dep in @packages + %li + = dep.nvrea \ No newline at end of file diff --git a/app/views/changesets/_edit.html.haml b/app/views/changesets/_edit.html.haml new file mode 100644 index 00000000000..0abc80911e0 --- /dev/null +++ b/app/views/changesets/_edit.html.haml @@ -0,0 +1,43 @@ +//Edit/view page as seen on the 2 pane changeset history list + += include_javascripts :changeset_edit + +.grid_8 +   + +%h4.grid_7 + = _("Details") + + +#changeset.fieldset{'data-ajax_url'=>changeset_path(@changeset.id)} + .grid_2.ra + = _("Name") + .grid_5.la.editable.edit_textfield{:name=>"name", "data-id"=>@changeset.id,"data-url"=>changeset_path(@changeset.id)} #{@changeset.name} + +.fieldset + .grid_2.ra + = _("Promotion Date") + .grid_5.la + = I18n.l(@changeset.promotion_date, :format=>:long) + + + + +%h4.grid_7 + = _("Products") +.prefix_1.grid_6 + - for prod in @changeset.products + = prod.name + +%h4.grid_7 + = _("Errata") +.prefix_1.grid_6 + - for erratum in @changeset.errata + = erratum.display_name + +%h4.grid_7 + = _("Packages") +.prefix_1.grid_6 + - for pkg in @changeset.packages + = pkg.display_name + diff --git a/app/views/changesets/_list.html.haml b/app/views/changesets/_list.html.haml new file mode 100644 index 00000000000..9cc727da704 --- /dev/null +++ b/app/views/changesets/_list.html.haml @@ -0,0 +1,2 @@ +- for item in @changesets + = render :partial=>"common/list_item", :locals=>{:item=>item, :accessor=>:id, :columns=>@columns} \ No newline at end of file diff --git a/app/views/changesets/_name.html.haml b/app/views/changesets/_name.html.haml new file mode 100644 index 00000000000..cc69c40b402 --- /dev/null +++ b/app/views/changesets/_name.html.haml @@ -0,0 +1,6 @@ +%fieldset + .grid_3.ra + = label_tag :name, _("Name:") + .grid_4.la + %input.changeset_name{ :id => "name", :name => "name", :type => "text", :value => @changeset.name, "data-environment_id" => @environment.id } + diff --git a/app/views/changesets/index.html.haml b/app/views/changesets/index.html.haml new file mode 100644 index 00000000000..7b29f4610a4 --- /dev/null +++ b/app/views/changesets/index.html.haml @@ -0,0 +1,17 @@ += include_javascripts :edit += include_editable_i18n + +.grid_16 +   + +.grid_16 + = environment_selector(:locker_clickable=>false) + + + +.grid_16 + = two_panel(@changesets, @panel_options) + + +//Put this at the end since we're going to be calling changeset' += include_javascripts :changeset \ No newline at end of file diff --git a/app/views/common/403.html.haml b/app/views/common/403.html.haml new file mode 100644 index 00000000000..8f3fa446983 --- /dev/null +++ b/app/views/common/403.html.haml @@ -0,0 +1,7 @@ +%h1 #{_("Permission denied")} + +%p #{_("You are not authorised to perform this action.")} +%p #{_("Please request the required privileges from an administrator.")} + +%p + = link_to _("Back"), root_path diff --git a/app/views/common/_common_i18n.html.haml b/app/views/common/_common_i18n.html.haml new file mode 100644 index 00000000000..51fb76ee375 --- /dev/null +++ b/app/views/common/_common_i18n.html.haml @@ -0,0 +1,6 @@ +/common translations +:javascript + localize({ + "confirm_request": '#{_('Are you sure?')}', + "validation_errors": '#{_('Validation Failed:')}' + }); diff --git a/app/views/common/_edit_i18n.html.haml b/app/views/common/_edit_i18n.html.haml new file mode 100644 index 00000000000..5add8115e0c --- /dev/null +++ b/app/views/common/_edit_i18n.html.haml @@ -0,0 +1,10 @@ +/translations needed for jeditable +:javascript + localize({ + "cancel": '#{_('Cancel')}', + "upload": '#{_('Upload')}', + "uploading": '#{_('Uploading')}', + "clickToEdit": '#{_('Click to edit')}', + "save": '#{_('Save')}', + "saving": '#{_('Saving...')}' + }); diff --git a/app/views/common/_env_select.html.haml b/app/views/common/_env_select.html.haml new file mode 100644 index 00000000000..50cd0f97df1 --- /dev/null +++ b/app/views/common/_env_select.html.haml @@ -0,0 +1,26 @@ += include_javascripts :env_select +#path-widget + #path-controller + #path-collapsed.path_selector + %img{:src => "/images/icons/expander-collapsed-left.png", :alt => _("Expand")} + #path-expanded.path_selector + %img{:src => "/images/icons/expander-expanded.png", :alt => _("Collapse")} + + + #path-selected.path_selected + %ul.breadcrumb + - @path.each_with_index do |env, count| + %li + %a{"data-env_id"=> env.id, "data-url"=>env_select_url(url_proc, env, @path[count+1], @organization), + :class=>env_select_class(env, @environment, @path, @path, locker_clickable)} #{env.name} + + + + #path-entries.path_entries + - for path in @paths + %div.path_entry{"id"=> ("#{path.first.id}#{path.first.name}")} + %ul.breadcrumb + - path.each_with_index do |env, count| + %li + %a{"data-env_id"=> env.id, "data-url"=>env_select_url(url_proc, env, path[count+1], @organization), + :class=>env_select_class(env, @environment, @path, path, locker_clickable)} #{env.name} diff --git a/app/views/common/_helptip.html.haml b/app/views/common/_helptip.html.haml new file mode 100644 index 00000000000..23145b39f04 --- /dev/null +++ b/app/views/common/_helptip.html.haml @@ -0,0 +1,6 @@ +%div{:id=>"helptip-opened_#{key}", :style=> current_user().helptip_enabled?(key) ? "" : "display: none;", :class=>"helptip-open"} + .helptip-close-button + %p + = text + + diff --git a/app/views/common/_helptip_button.html.haml b/app/views/common/_helptip_button.html.haml new file mode 100644 index 00000000000..ca742e57126 --- /dev/null +++ b/app/views/common/_helptip_button.html.haml @@ -0,0 +1,3 @@ +%div{:id=>"helptip-closed_#{key}", :class=>"helptip-close", :style=> current_user().helptip_enabled?(key) ? "display: none;": ""} + .helptip-open-button +   diff --git a/app/views/common/_list_item.html.haml b/app/views/common/_list_item.html.haml new file mode 100644 index 00000000000..7349a9daf93 --- /dev/null +++ b/app/views/common/_list_item.html.haml @@ -0,0 +1,8 @@ +.block{:id => item.send(accessor), "data-ajax_url" => url_for(:action=> 'edit', :id => item.send(accessor))} + - for col in columns + %div{:class => 'column_' + columns.length.to_s} + - if col.to_s == "name" + = item.send(col)[0...32] + - else + = item.send(col) + .arrow-right \ No newline at end of file diff --git a/app/views/common/_list_items.html.haml b/app/views/common/_list_items.html.haml new file mode 100644 index 00000000000..1cb1e7b2788 --- /dev/null +++ b/app/views/common/_list_items.html.haml @@ -0,0 +1,2 @@ +- for item in collection + = render :partial=>"common/list_item", :locals=>{:item=>item, :accessor=>accessor, :columns=>columns} \ No newline at end of file diff --git a/app/views/common/_list_remove.js.haml b/app/views/common/_list_remove.js.haml new file mode 100644 index 00000000000..5dde01b1463 --- /dev/null +++ b/app/views/common/_list_remove.js.haml @@ -0,0 +1,2 @@ +!= "list.remove('#{escape_javascript(@id.to_s)}');" +!= "panel.closePanel($('#panel'));" \ No newline at end of file diff --git a/app/views/common/_list_update.html.haml b/app/views/common/_list_update.html.haml new file mode 100644 index 00000000000..8724f650e6b --- /dev/null +++ b/app/views/common/_list_update.html.haml @@ -0,0 +1,4 @@ +- for col in columns + %div{:class => 'column_' + columns.length.to_s} + = item.send(col) +.arrow-right ` \ No newline at end of file diff --git a/app/views/common/_one_panel.html.haml b/app/views/common/_one_panel.html.haml new file mode 100644 index 00000000000..831947a12c9 --- /dev/null +++ b/app/views/common/_one_panel.html.haml @@ -0,0 +1,10 @@ +.container + %div{:id => panel_id} + .left + .list-title + %h2.fl #{title} + %br.clear + .list{"data-single-selection" => ("true" if single_select) } + - for item in collection + = render :partial=>"common/one_panel_list_item", :locals=>{:item=>item, :accessor=>accessor, :columns=>columns, + :panel_id => panel_id, :hover_text => (send(hover_text_cb, item) if hover_text_cb)} diff --git a/app/views/common/_one_panel_list_item.haml b/app/views/common/_one_panel_list_item.haml new file mode 100644 index 00000000000..b0c73ea4e56 --- /dev/null +++ b/app/views/common/_one_panel_list_item.haml @@ -0,0 +1,5 @@ +%div{:class => 'block', :id => item.send(accessor), :panel_id => panel_id, "data-hover-text" => (hover_text if hover_text)} + - for col in columns + %div{:class => 'column_' + columns.length.to_s} + = item.send(col) + .arrow-right \ No newline at end of file diff --git a/app/views/common/_panel.html.haml b/app/views/common/_panel.html.haml new file mode 100644 index 00000000000..64d80c055f9 --- /dev/null +++ b/app/views/common/_panel.html.haml @@ -0,0 +1,63 @@ += include_javascripts :panel, :fancyqueries, :bbq += include_stylesheets :fancyqueries +#container + .right + - if enable_create + %h4 + #{_("Click New to create a new")} #{name} + %br + %br + %h4 + #{_('Select Result')}: + %br + #select-result + #panel-frame + #panel.panel.closed + .head + %a.close{:href => "#", "data-close"=>"panel"} #{_("Close")} + .data + .spinner + = image_tag ("spinner.gif") + .panel-content + %br.clear + #subpanel-frame + #subpanel.panel.subpanel.closed + .head + %a.close{:href => "#", "data-close"=>"subpanel"} #{_("Close")} + .data + .spinner + = image_tag ("spinner.gif") + .panel-content + %br.clear + + + .left + #list-title + %h2.fl #{title} + - if enable_create + %a.fr{:href => "#", :id => "new", :class => "block", "data-ajax_url" => url_for(:action=> 'new')} + #{_('+ New ')} #{create} + .arrow-right + %br + %br + - if url.nil? + %form#search_form.search{"data-url" => search_index_path()} + = auto_complete_field_tag_jquery(:search, params[:search], {:type => "text", :placeholder => "Filter..."},{ :delay => 100, :min_length => -1 }) + %button.action{:form => "search_form"} #{_("Search")} + - else + %form#search_form.search{"data-url" => url_for(url)} + = auto_complete_field_tag_jquery(:search, params[:search], {:type => "text", :placeholder => "Filter..."},{ :delay => 100, :min_length => -1 }) + %button.action{:form => "search_form"} #{_("Search")} + + #list.clear{:class=>("ajaxScroll" if ajax_scroll), "data-scroll_url"=>ajax_scroll, "data-page_size"=>current_user.page_size} + .block_head.clear + - for col in columns + %div{:class => 'column_' + columns.length.to_s} + - if col.to_s.sub(/[_]/, " ") == "name" + = col.to_s.sub(/[_]/, " ") + " (abbr.)" + - else + = col.to_s.sub(/[_]/, " ") + .arrow-right + - for item in collection + = render :partial=>"common/list_item", :locals=>{:item=>item, :accessor=>accessor, :columns=>columns} + %br.clear diff --git a/app/views/common/_search.html.haml b/app/views/common/_search.html.haml new file mode 100644 index 00000000000..bc5f51a49b2 --- /dev/null +++ b/app/views/common/_search.html.haml @@ -0,0 +1,17 @@ +%ul#search_list + - unless @search_histories.nil? + - for i in (0..history_entries-1) + %li.item + %a.recent{:href => search_string(@search_histories[i])} #{@search_histories[i].params} + + - unless @search_favorites.nil? + - for i in (0..favorite_entries-1) + %li.item + %a.favorite{:href => search_string(@search_favorites[i])} #{@search_favorites[i].params} + .delete#search_favorite_destroy{"data-id" => @search_favorites[i].id, "data-url" => destroy_favorite_search_index_path(@search_favorites[i].id)} + +%ul + %li + %a.add#search_favorite_save{:href => "#", "data-url" => url_for(favorite_search_index_path())} #{_("Save as Favorite")} + %li + %a.clear{:href => "?search="} #{_("Clear the Search")} diff --git a/app/views/consumers/export_status.html.haml b/app/views/consumers/export_status.html.haml new file mode 100644 index 00000000000..04d67590d1b --- /dev/null +++ b/app/views/consumers/export_status.html.haml @@ -0,0 +1,8 @@ +- if @status + %p Task id: #{params[:task_id]} + %p % complete: #{@status.pct_complete}, status: #{@status.status}, message: #{@status.message} + +%p There are #{@info[:pending]} pending and #{@info[:processed]} processed jobs across #{@info[:queues]} queues. + += form_for :consumers, :url => { :action => "export", :id => 'b4460d6c-9ffb-4246-9573-206916f24d78' } do |f| + = submit_tag "export" diff --git a/app/views/content/index.html.haml b/app/views/content/index.html.haml new file mode 100644 index 00000000000..3a0cda6cba5 --- /dev/null +++ b/app/views/content/index.html.haml @@ -0,0 +1,6 @@ +%h1 #{_("Content")} + +%ul + %li + %a{ :href => "/products"} + \/Products - mockup of one of the products syncing pages \ No newline at end of file diff --git a/app/views/dashboard/index.html.haml b/app/views/dashboard/index.html.haml new file mode 100644 index 00000000000..67abeefd0c4 --- /dev/null +++ b/app/views/dashboard/index.html.haml @@ -0,0 +1,6 @@ +.grid_16 + %h1 #{_("Dashboard")} + + %h3 Page 4000 + + %p #{_("This is to be the Dashboard area containing Monitors, Reporting, and Workflow branches.")} \ No newline at end of file diff --git a/app/views/environments/_edit.html.haml b/app/views/environments/_edit.html.haml new file mode 100644 index 00000000000..55dc7602760 --- /dev/null +++ b/app/views/environments/_edit.html.haml @@ -0,0 +1,30 @@ += include_javascripts :edit += include_editable_i18n += include_javascripts :environment_edit + +%h2 + = _("Environment") + ": " + @environment.name + +.clear += form_for @environment, :html => { :name => 'environment_edit' }, :url => {:action => "update", :organization_id => @organization.cp_key, :controller => "environments"}, :method => "put", :remote => true do |f| + + %fieldset.clearfix + .grid_2.ra + %label #{_("Name")}: + .grid_5.la.editable.edit_env_name{'name' => 'kp_environment[name]', "data-url"=>organization_environment_path(@organization.cp_key, @environment.id), "data-forward"=>edit_organization_path(@organization.cp_key)}<> #{@environment.name} + + %fieldset.clearfix + .grid_2.ra + %label #{_("Description")}: + .grid_5.la.editable.edit_env_description{:style => "word-wrap: break-word;", "data-url"=>organization_environment_path(@organization.cp_key, @environment.id), 'name' => 'kp_environment[description]'}<> #{@environment.description} + + %fieldset.clearfix + %input{ :type => "hidden", :name => "prior_envs", :value => @env_labels_json } + .grid_2.ra + %label #{_("Prior Environments")}: + .grid_5.la.editable.edit_prior_envs{'name' => 'kp_environment[prior]', "data-url"=>organization_environment_path(@organization.cp_key, @environment.id), "data-forward"=>edit_organization_path(@organization.cp_key)} #{@selected} + + + +%a.delete_environment.button{"data-url"=>organization_environment_path(@organization.cp_key, @environment.id), "data-forward"=>edit_organization_path(@organization.cp_key), "data-confirm-text"=>_('Are you sure?')} + = _("Remove Environment") diff --git a/app/views/environments/_new.html.haml b/app/views/environments/_new.html.haml new file mode 100644 index 00000000000..a2057cc2c34 --- /dev/null +++ b/app/views/environments/_new.html.haml @@ -0,0 +1,24 @@ + +%h2 #{_("Create Environment")} +.clear +   += form_tag organization_environments_path(@organization.name), :method => "post" do |f| + %fieldset.clearfix + %b + %label.grid_2 #{_("Name")}: + .grid_5 + = text_field_tag :name, params[:name], :class=>'grid_5', :tabindex => 1 + %fieldset.clearfix + %b + %label.grid_2 + #{_("Description")}: + .grid_5 + = text_area_tag :description, params[:description], :class=>'grid_5', :tabindex => 2 + %fieldset.clearfix + %b + %label.grid_2 #{_("Prior Environment")}: + .grid_5 + = select_tag "prior", options_for_select(@env_labels, @selected),{:include_blank => _("Locker"), :id => "environment_prior", :class => 'grid_5', :tabindex => 3} + .grid_7 + .button.dialogbutton.environment_create{:class=>"fr", 'data-url'=>edit_organization_path(@organization.name), :tabindex => 4} + #{_("Create")} \ No newline at end of file diff --git a/app/views/errata/_packages.html.haml b/app/views/errata/_packages.html.haml new file mode 100644 index 00000000000..be7448586e9 --- /dev/null +++ b/app/views/errata/_packages.html.haml @@ -0,0 +1,16 @@ + +%h2 + = @errata.title + +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) + + +%h2 + = _("Packages") +.clear +   + +- @errata.pkglist.each do |pkg| + .li.grid_6 + = pkg diff --git a/app/views/errata/_show.html.haml b/app/views/errata/_show.html.haml new file mode 100644 index 00000000000..cdb7e865f01 --- /dev/null +++ b/app/views/errata/_show.html.haml @@ -0,0 +1,49 @@ +%h2 + = @errata.title + +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) + + +.clear + +%fieldset + .grid_2.ra + %label #{_("Type")}: + .grid_5.la + = @errata.type + + +%fieldset + .grid_2.ra + %label #{_("Issued")}: + .grid_5.la + = @errata.issued + +%fieldset + .grid_2.ra + %label #{_("Updated")}: + .grid_5.la + = @errata.updated + +/%fieldset +/ .grid_2.ra +/ %label #{_("Affected Products")}: +/ .grid_5.la +/ Red Hat Enterprise Linux 5 +/ %br +/ Red Hat Super Product + +%fieldset + .grid_2.ra + %label #{_("Associated Bugs")}: + .grid_5.la + = @errata.references.inspect + +%fieldset + .grid_2.suffix_5.ra + %label #{_("Description")}: + .grid_7 + %pre{:style=>"white-space:pre-wrap"} + = @errata.description + diff --git a/app/views/layouts/_ajax_notices.haml b/app/views/layouts/_ajax_notices.haml new file mode 100644 index 00000000000..5cf65e0c4ab --- /dev/null +++ b/app/views/layouts/_ajax_notices.haml @@ -0,0 +1,9 @@ += include_javascripts :notices + +- if current_user + + %script(type="text/javascript") + notices.setup_notices(#{notification_polling_time}); + notices.addNotices( + != current_user.notices.to_json + ); diff --git a/app/views/layouts/_footer.haml b/app/views/layouts/_footer.haml new file mode 100644 index 00000000000..0b9fe6ac310 --- /dev/null +++ b/app/views/layouts/_footer.haml @@ -0,0 +1,7 @@ +%ul.container_16 + - if current_user + %li + %a{ :href => "/logout"} + #{_("Logout")} + %li + #{_("Copyright © ") + (Time.now).year.to_s + _(" Red Hat, Inc.") } diff --git a/app/views/layouts/_header.haml b/app/views/layouts/_header.haml new file mode 100644 index 00000000000..ea85fb65d73 --- /dev/null +++ b/app/views/layouts/_header.haml @@ -0,0 +1,23 @@ +.grid_3 + %a{:href => '/dashboard', :class => "fl"} + %img{:src => '/images/katello_32x32_icon.png', :alt => 'Katello Logo'} + %img.kp{:src => '/images/nav_pipe.png', :alt => 'Pipe Separator'} + %h1 Katello + #loading.fr + %img{:src => '/images/spinner_head.gif', :alt => 'Spinning Work Indicator'} +.grid_13 + - if current_user + / + %div.org + = render :partial => '/layouts/org' + %ul + %li.hello + = link_to account_path do + %strong + = current_user.username + %li + %a{ :id => "unread_notices", :href => "/notices", :title => "System Notifications"} + #{current_user.user_notices.length} + %li.logout + %a{ :href => "/logout"} + #{_("Logout")} diff --git a/app/views/layouts/_notification.haml b/app/views/layouts/_notification.haml new file mode 100644 index 00000000000..18c40a46518 --- /dev/null +++ b/app/views/layouts/_notification.haml @@ -0,0 +1,24 @@ +- if flash[:error] + %input{ :type => "hidden", :id=> "flash_message", :value => flash[:error] } + :javascript + notices.displayNotice("error", $("#flash_message").val()); + +- if flash[:warning] + %input{ :type => "hidden", :id=> "flash_message", :value => flash[:warning] } + :javascript + notices.displayNotice("warning", $("#flash_message").val()); + +- if flash[:success] + %input{ :type => "hidden", :id=> "flash_message", :value => flash[:success] } + :javascript + notices.displayNotice("success", $("#flash_message").val()); + +- if flash[:message] + %input{ :type => "hidden", :id=> "flash_message", :value => flash[:message] } + :javascript + notices.displayNotice("", $("#flash_message").val()); + +- if flash[:notice] + %input{ :type => "hidden", :id=> "flash_message", :value => flash[:notice] } + :javascript + notices.displayNotice("", $("#flash_message").val()); diff --git a/app/views/layouts/_org.haml b/app/views/layouts/_org.haml new file mode 100644 index 00000000000..823ca0b5ff9 --- /dev/null +++ b/app/views/layouts/_org.haml @@ -0,0 +1,2 @@ +%button{:class=>"linkbutton grid_4", + :onClick=>"location.href='#{organizations_path}/#{current_organization.name}';return false"} #{current_organization.name} \ No newline at end of file diff --git a/app/views/layouts/katello.haml b/app/views/layouts/katello.haml new file mode 100644 index 00000000000..443773ef00c --- /dev/null +++ b/app/views/layouts/katello.haml @@ -0,0 +1,43 @@ +!!! +%html + %head + %meta(http-equiv="Content-Type" content="text/html; charset=UTF-8") + %title + = project_name + = "-" + = content_for?(:title) ? yield(:title) : default_title + + = include_stylesheets :common + = include_javascripts :common + = csrf_meta_tag + = javascript_tag "var AUTH_TOKEN = #{form_authenticity_token.inspect};" if protect_against_forgery? + + / [if lt IE 9] + = include_javascripts :html5 + + - if controller.respond_to?(:section_id) + - section_id = controller.section_id + - else + - section_id = "generic" + %body{:id => controller.section_id} + = render :partial => '/layouts/ajax_notices' + = render :partial => '/layouts/notification' + %div#head + %header.container_16 + = render :partial => '/layouts/header' + - if not current_user + #maincontent.container_16 + #formwindow + = yield + - else + #subheader + %nav.container_16.tab_nav + = render_navigation(:expand_all => true, :level => 1) + #maincontent + %nav.subnav.container_16 + = render_navigation(:expand_all => true, :level => 2) + .inner.container_16 + = yield + %footer + = render :partial => "layouts/footer" + = render :partial => "/common/common_i18n" diff --git a/app/views/nodes/_list.html.haml b/app/views/nodes/_list.html.haml new file mode 100644 index 00000000000..63767232740 --- /dev/null +++ b/app/views/nodes/_list.html.haml @@ -0,0 +1,5 @@ +%table + %th Hostname + - nodes.each do |node| + %tr{:class => cycle(nil, 'alt')} + %td= link_to node.uuid, node_path(node.uuid) diff --git a/app/views/nodes/index.html.haml b/app/views/nodes/index.html.haml new file mode 100644 index 00000000000..dbc5fcc1b40 --- /dev/null +++ b/app/views/nodes/index.html.haml @@ -0,0 +1 @@ += render 'list', :nodes => @nodes diff --git a/app/views/nodes/show.html.haml b/app/views/nodes/show.html.haml new file mode 100644 index 00000000000..1fdd72e5cf1 --- /dev/null +++ b/app/views/nodes/show.html.haml @@ -0,0 +1,7 @@ +%table + %th Name + %th Value + - @facts.each do |name,value| + %tr{:class => cycle(nil, 'alt')} + %td= name + %td= value diff --git a/app/views/notices/show.html.haml b/app/views/notices/show.html.haml new file mode 100644 index 00000000000..44985b4a1e3 --- /dev/null +++ b/app/views/notices/show.html.haml @@ -0,0 +1,43 @@ += include_javascripts :notices_list += include_javascripts :katello_client += include_javascripts :fancyqueries += include_stylesheets :fancyqueries + +.grid_16#main + + .prefix_11 + %form#search_form.search{"data-url" => search_index_path()} + = auto_complete_field_tag_jquery(:search, params[:search], {:type => "text", :placeholder => "Filter..."},{ :delay => 100, :min_length => -1 }) + %button.action{:form => "search_form"} #{_("Search")} + + .heading + %h2.help_tip_button + = _("User Notifications") + = help_tip_button + = help_tip(_("User notifications lists all notifications generated by a user as well as global notifications that are sent to all users.")) | + + %div#dialog_content{:style => "word-wrap: break-word;"} + + %table.notifications + %thead + %th + = sortable "created_at", _("Created (UTC)") + %th + = sortable "level", _("Level") + %th + = sortable "text", _("Description") + %tbody + - for notice in @notices + - if notice.details.nil? + %tr{:class => "#{notice.level}"} + %td #{notice.created_at} + %td #{notice.level} + %td= "#{notice.text}".html_safe + - else + %tr.details{:id => "#{notice.id}", :class => "#{notice.level}"} + %td #{notice.created_at} + %td #{notice.level} + %td.details-icon= "#{notice.text}".html_safe + + = button_to _("Delete All"), {:action => "destroy_all", :controller => "notices"}, :method => :delete, :confirm => _('Are you sure?') + diff --git a/app/views/operations/index.html.haml b/app/views/operations/index.html.haml new file mode 100644 index 00000000000..d4d50ff948d --- /dev/null +++ b/app/views/operations/index.html.haml @@ -0,0 +1,4 @@ +.grid_16 + %h1 #{_("Administration")} + + %h3 Page 1000 \ No newline at end of file diff --git a/app/views/organizations/_edit.html.haml b/app/views/organizations/_edit.html.haml new file mode 100644 index 00000000000..67cd70646a0 --- /dev/null +++ b/app/views/organizations/_edit.html.haml @@ -0,0 +1,39 @@ += include_javascripts :organization_edit + +.grid_7 + %h2 + = @organization.name + +.clear += form_for @organization, :url => {:action => "update", :controller => "organizations"}, :method => "put", :remote => true do |f| + + %fieldset.clearfix + .grid_2.ra + %label #{_("Description")}: + .grid_5.la.editable.edit_textfield{:style => "word-wrap: break-word;", 'name' => 'organization[description]', 'data-url'=>edit_organization_path(@organization.cp_key)}<> #{@organization[:description]} + + .grid_7 + %h5 #{_("Environment Promotion Paths")}: + - unless @organization.environments.empty? + %ul#promotion_paths + - @organization.promotion_paths.each do |path| + .clear +   + .grid_7 + %ul.breadcrumb + %li + =link_to "Locker", "#" + - for env in path + %li + %a.subpanel_element{"data-url"=>edit_organization_environment_path(@organization.cp_key, env.id)} #{env.name} + - else + .grid_7 + #{_("No environments are available in this organization. Please add some environments to be able register systems to this organization.")}: + .clear +   + + .button.subpanel_element{"data-url"=>new_organization_environment_path(@organization.cp_key)} + = _("Add New Environment") + +%a.remove_item.remove_org{"data-id"=>@organization.name ,"data-url"=>organization_path(@organization.cp_key), "data-confirm-text"=>_('Are you sure?')} + = _("Remove Organization") \ No newline at end of file diff --git a/app/views/organizations/_new.html.haml b/app/views/organizations/_new.html.haml new file mode 100644 index 00000000000..f5cdd381d96 --- /dev/null +++ b/app/views/organizations/_new.html.haml @@ -0,0 +1,17 @@ + +%h1.grid_8 #{_("New Organization")} +.grid_8#new_organization123 + = form_tag organizations_path, :method => "post", :id => "new_organization" do |f| + %fieldset + .grid_2.ra + %label #{_("Name")}: + .grid_5.la + = text_field_tag :name, params[:name], :tabindex => 1 + %fieldset + .grid_2.ra + %label #{_("Description")}: + .grid_5.la + = text_area_tag :description, params[:description], :tabindex => 2 + .grid_6.ra + = button_to _("Save"), {:action => "create", :controller => "organizations"}, :method => :post, :id => :organization_save, :tabindex => 3 + diff --git a/app/views/organizations/index.html.haml b/app/views/organizations/index.html.haml new file mode 100644 index 00000000000..8f4d24f2aff --- /dev/null +++ b/app/views/organizations/index.html.haml @@ -0,0 +1,15 @@ += include_javascripts :edit += include_editable_i18n += include_javascripts :katello_client += include_javascripts :organization += include_javascripts :form + +.grid_16 + = help_tip_button + = help_tip(_("Organizations allow content and systems to be separated by logical divisions. " + | + "To edit the environments within an organization, click on that organization and then click " + | + "on the desired environment." )) | + + +.grid_16#main + = two_panel(@organizations, @panel_options) diff --git a/app/views/owners/import_status.html.haml b/app/views/owners/import_status.html.haml new file mode 100644 index 00000000000..d8c0d4527c0 --- /dev/null +++ b/app/views/owners/import_status.html.haml @@ -0,0 +1,17 @@ +- if @status + :javascript + window.onload = function() { + if ("#{params[:task_id]}") update_status(); + } + + %p Task id: #{params[:task_id]} + %p.status job status + +%p There are #{@info[:pending]} pending and #{@info[:processed]} processed jobs across #{@info[:queues]} queues. + += form_for :owners, :html => { :multipart => true }, :url => { :action => "import" } do |f| + = f.file_field :import + = f.submit "Import" + +=include_javascripts :common, :workspace + diff --git a/app/views/packages/_changelog.html.haml b/app/views/packages/_changelog.html.haml new file mode 100644 index 00000000000..eeb261219a7 --- /dev/null +++ b/app/views/packages/_changelog.html.haml @@ -0,0 +1,12 @@ +%h2 + = @package.nvrea + +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) + + +%h2 + = _("Changelog") + +.clear +Changelog entries.... \ No newline at end of file diff --git a/app/views/packages/_dependencies.html.haml b/app/views/packages/_dependencies.html.haml new file mode 100644 index 00000000000..07a1b134644 --- /dev/null +++ b/app/views/packages/_dependencies.html.haml @@ -0,0 +1,31 @@ +%h2 + = @package.nvrea + +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) + +.grid_8 +   + + +%h2 + = _("Dependencies") + + +.clear + +.grid_3 + %h4 + = _("Requires") + + - @package.requires.each do |item| + .li + = item + +.grid_3 + %h4 + = _("Provides") + + - @package.provides.each do |item| + .li + = item \ No newline at end of file diff --git a/app/views/packages/_filelist.html.haml b/app/views/packages/_filelist.html.haml new file mode 100644 index 00000000000..e7203c7d496 --- /dev/null +++ b/app/views/packages/_filelist.html.haml @@ -0,0 +1,15 @@ +%h2 + = @package.nvrea + +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) + +%h2 + = _("Filelist") + + +.clear + +file 1 +%br +file 2 \ No newline at end of file diff --git a/app/views/packages/_show.html.haml b/app/views/packages/_show.html.haml new file mode 100644 index 00000000000..69960c47ae3 --- /dev/null +++ b/app/views/packages/_show.html.haml @@ -0,0 +1,98 @@ +%h2 + = @package.nvrea + +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) + + +.clear +%fieldset + .grid_2.ra + %label #{_("Name")}: + .grid_4.la + = @package.nvrea + + + +%fieldset + .grid_2.ra + %label #{_("Description")}: + .grid_5.la + = @package.description + +%fieldset + .grid_2.ra + %label #{_("Architecture")}: + .grid_4.la + = @package.arch + + +/%fieldset +/ .grid_2.ra +/ %label #{_("Available From")}: +/ .grid_4.la +/ .li +/ Red Hat Enterprise Linux 5 +/ .li +/ Red Hat Super Special Product + + +%fieldset + .grid_2.ra + %label #{_("Signature")}: + .grid_4.la + - @package.checksum.each_pair do |type, sum| + = type + ":" + = " ".html_safe + sum.slice(0,15) + + +%fieldset + .grid_2.ra + %label #{_("Package Size")}: + .grid_4.la + = number_to_human_size(@package.size) + +/%fieldset +/ .grid_2.ra +/ %label #{_("Payload Size")}: +/ .grid_4.la +/ = "Unknown" + + +%fieldset + .grid_2.ra + %label #{_("Build Host")}: + .grid_4.la + = @package.buildhost + +%fieldset + .grid_2.ra + %label #{_("Build Date")}: + .grid_4.la + = "Unknown" + + +%fieldset + .grid_2.ra + %label #{_("License")}: + .grid_4.la + = @package.license + +%fieldset + .grid_2.ra + %label #{_("Package Group")}: + .grid_4.la + = @package.group + +%fieldset + .grid_2.ra + %label #{_("Download")}: + .grid_4.la + = content_tag(:a, @package.filename, :href => @package.download_url) + + +%fieldset + .grid_2.ra + %label #{_("Source Package")}: + .grid_4.la + = "Not Available" diff --git a/app/views/products/_edit.html.haml b/app/views/products/_edit.html.haml new file mode 100644 index 00000000000..179faef220f --- /dev/null +++ b/app/views/products/_edit.html.haml @@ -0,0 +1,33 @@ += include_javascripts :provider_edit + +%h2 + = _("Provider: ") + @provider.name +%h3 + = _("Edit Product") + +%fieldset + .grid_2.ra + %label #{_("Name")}: + .grid_5.la.editable.edit_providername#product_name{'name' => 'product[name]', :url => provider_product_path(@provider.id)} #{@product.name} + +%fieldset + .grid_2.ra + %label #{_("Description")}: + .grid_5.la.editable.edit_textarea{:style => "word-wrap: break-word;", 'name' => 'product[description]', :url => provider_product_path(@provider.id)}<> #{@product.description} + +/ A product url isn't currently available; therefore, it is stubbed out and cannot be edited. Custom repo discover in pulp will be required to support this. +%fieldset + .grid_2.ra + %label #{_("URL")}: + .grid_5.la.editable + #{_("Click to edit")} +/ .grid_5.la.editable.edit_textfield{'name' => 'product[feed]', :url => provider_product_path(@provider.id)} + +/ Type is not currently available +/%fieldset +/ .grid_2.ra +/ %label #{_("Type")}: +/ .grid_5.la #{@provider[:provider_type]} + +%a.remove_item.product_delete{"data-url"=>provider_product_path(@provider.id, @product.id), "data-forward"=>products_repos_provider_path(@provider.id), "data-confirm-text"=>_('Are you sure?')} + = _("Remove Product") diff --git a/app/views/products/_new.html.haml b/app/views/products/_new.html.haml new file mode 100644 index 00000000000..cb9a9dcbba9 --- /dev/null +++ b/app/views/products/_new.html.haml @@ -0,0 +1,35 @@ +%h2 #{_("Create Product")} +.clear +   += form_tag provider_products_path(@provider.id), :method => "post" do |f| + %fieldset.clearfix + .grid_2.ra + = label :product, :name, _("Name") + .grid_5.la + = text_field :product, :name, :id=>"product_name_field" + %fieldset.clearfix + .grid_2.ra + = label :product, :description, _("Description") + .grid_5.la + = text_field :product, :description, :id=>"product_description_field" + %fieldset.clearfix + .grid_2.ra + = label :product, :feed, _("URL") + .grid_5.la + = text_field :product, :feed, :id=>"product_url_field" + %fieldset.clearfix + .grid_2.ra + = label :product, :types, _("Types") + %br.clear + .grid_2.ra + = label :product, :types, _("Yum") + .grid_5.la + = check_box_tag :yum_type + %br.clear + .grid_2.ra + = label :product, :types, _("File") + .grid_5.la + = check_box_tag :file_type + .grid_6.ra + .button.dialogbutton.product_create#save_product_button{:style=>"float:right;", 'data-url'=>products_repos_provider_path(@provider.id)} + #{_("Create")} diff --git a/app/views/promotions/_detail.html.haml b/app/views/promotions/_detail.html.haml new file mode 100644 index 00000000000..4b01454b64e --- /dev/null +++ b/app/views/promotions/_detail.html.haml @@ -0,0 +1,22 @@ +- if !defined? product or product.nil? + %ul + %li + .slide_link{:id=>"products"} + %span #{_("Products")} + %li + .slide_link{:id=>"all_errata"} + %span #{_("All Errata")} + +- else + %ul + %li + .slide_link{:id=>packages_bc_id(product)} + %span #{_("Packages")} + + %li + .slide_link{:id=>errata_bc_id(product)} + %span #{_("Errata")} + + %li + .slide_link{:id=>repo_bc_id(product)} + %span #{_("Repositories")} \ No newline at end of file diff --git a/app/views/promotions/_errata.html.haml b/app/views/promotions/_errata.html.haml new file mode 100644 index 00000000000..75de97c9ea2 --- /dev/null +++ b/app/views/promotions/_errata.html.haml @@ -0,0 +1,16 @@ +%ul + -if @errata.empty? + #{_("No errata available.")} + - @errata.each do |e| + %li.clear + %span.item.block{:id => e.id, "data-ajax_url" => erratum_path(e.id)} + = e.title + - if @changeset + - if @changeset.errata_ids.include?(e.id) + %a{:class => "fl content_add_remove remove_errata button", "data-id" => e.id, "data-display_name"=> e.title, "data-type" => "errata", :id => "add_remove_errata_#{e.id}"} + #{_("Remove")} + - else + %a{ :class => "fl content_add_remove add_errata button", "data-id" => e.id, "data-display_name"=> e.title, "data-type" => "errata", :id => "add_remove_errata_#{e.id}"} + #{_("Add")} + %br.clear + \ No newline at end of file diff --git a/app/views/promotions/_packages.html.haml b/app/views/promotions/_packages.html.haml new file mode 100644 index 00000000000..18d1b3d8913 --- /dev/null +++ b/app/views/promotions/_packages.html.haml @@ -0,0 +1,17 @@ +%ul + -if @packages.empty? + #{_("No packages available for promotion")} + - @packages.each do |pack| + %li + - if @changeset + - if @next_env_pkgs.include? pack.id + .fl.promoted + = _("Promoted") + - elsif @changeset.package_ids.include?(pack.id) + %a{:class => "fl content_add_remove remove_package button", "data-display_name"=> pack.nvrea, "data-id" => pack.id, "data-type" => "package", :id => "add_remove_package_#{pack.id}"} + #{_("Remove")} + - elsif @environment.successor + %a{ :class => "fl content_add_remove add_package button", "data-display_name"=> pack.nvrea, "data-id" => pack.id, "data-type" => "package", :id => "add_remove_package_#{pack.id}"} + #{_("Add")} + %span.item.block{:id => pack.id, "data-ajax_url" => "/packages/#{pack.id}"} + = pack.nvrea \ No newline at end of file diff --git a/app/views/promotions/_products.html.haml b/app/views/promotions/_products.html.haml new file mode 100644 index 00000000000..558576745db --- /dev/null +++ b/app/views/promotions/_products.html.haml @@ -0,0 +1,27 @@ + + +%ul + -if products.empty? + #{_("No products")} + -for product in products + %li.clear + - if @changeset + - if @changeset_product_ids.include?(product.cp_id) + %a.content_add_remove.remove_product.button.fl{ "data-id" => product.id, "data-type"=>"product", "data-display_name"=>product.name, :id => "add_remove_product_#{product.id}" } + #{_("Remove")} + - else + %a.content_add_remove.add_product.button.fl{ "data-id" => product.id, "data-type"=>"product", "data-display_name"=>product.name, :id => "add_remove_product_#{product.id}" } + #{_("Add")} + .slide_link{:id=>product_bc_id(product)} + - if product.provider.provider_type == Provider::REDHAT + %span.rh-product-sprite + - else + %span.custom-product-sprite + %span.product-icon{:style=>"display: inline;"} + #{product.name}  + - for arch in product.repos(@environment).collect{|repo| repo.arch }.uniq + .product_arch + = arch + + +%br.clear diff --git a/app/views/promotions/_repos.html.haml b/app/views/promotions/_repos.html.haml new file mode 100644 index 00000000000..8e468db84d5 --- /dev/null +++ b/app/views/promotions/_repos.html.haml @@ -0,0 +1,17 @@ +%ul + -if @repos.empty? + #{_("No repos available for promotion")} + - @repos.each do |repo| + %li + - if @changeset + - if @changeset.repos.collect{|tmp| tmp.repo_id}.include?(repo.id) + %a{:class => "fl content_add_remove remove_repo button","data-display_name"=> repo.name, "data-id" => repo.id, "data-type" => "repo", :id => "add_remove_repo_#{repo.id}"} + #{_("Remove")} + - elsif !(@next_env_repos & repo.clone_ids).empty? + .fl.promoted + = _("Promoted") + - elsif @next_environment + %a{ :class => "fl content_add_remove add_repo button", "data-display_name"=> repo.name, "data-id" => repo.id, "data-type" => "repo", :id => "add_remove_repo_#{repo.id}"} + #{_("Add")} + %span.item + = repo.name \ No newline at end of file diff --git a/app/views/promotions/show.html.haml b/app/views/promotions/show.html.haml new file mode 100644 index 00000000000..4afc48efd35 --- /dev/null +++ b/app/views/promotions/show.html.haml @@ -0,0 +1,67 @@ += include_javascripts :bbq += include_javascripts :katello_client += include_javascripts :promotion += include_javascripts :panel + + + + +:javascript + var breadcrumb = eval('(#{escape_javascript(generate_breadcrumb())})'); + + +#error_dialog{:style=>"display: none"} + = _("An error has occured when communicating with the server, please refresh the page to retrieve the current changeset.") + + +//Div for dep. content +#dialog_content{:style => "word-wrap: break-word;", :title=>"#{_('Package Dependencies')}"} + + +.grid_1 + = help_tip_button +   +.grid_16 + = environment_selector(:url_proc=>lambda {|args| promotions_path(args[:organization].name, args[:environment].name, :next_env_id=>(args[:next_environment].id if args[:next_environment] and args[:environment].locker?) )}) + +%br.clear + +.grid_12.prefix_2.suffix_2 + = help_tip(_('Promotions allow you to promote content from one environment to the next along ' + | + 'a promotion path. Clicking "Add" next to one or more products will add them to '+ | + 'the change set. If products already exist in the next environment, you may ' + | + 'promote other types of content. Once you have created a change set, click the ' + | + '"Promote" button to commit it to the next environment.')) | + +.grid_16 + #container + .right + %h2 #{_("Current Changeset")} + %br + %br + = render(:partial => "changesets/changeset", :content_type => 'text/html') + + #panel-frame + #panel.panel.closed + .head + %a.close{:href => "#", "data-close"=>"panel"} #{_("Close")} + .data + #spinner{:style=>"display: none"} + = image_tag ("spinner.gif") + .panel-content + %br.clear + + .left + %h2 #{@environment.name + _(" Content")} + #breadcrumb.clickable.clear + #list.shadowbox.outlined{"data-page_size"=>current_user.page_size} + #slider.has_content.slider + = render(:partial=>"detail") + #slider-two.no_content.slider + + + + + + + \ No newline at end of file diff --git a/app/views/providers/_edit.html.haml b/app/views/providers/_edit.html.haml new file mode 100644 index 00000000000..bfab23ac110 --- /dev/null +++ b/app/views/providers/_edit.html.haml @@ -0,0 +1,34 @@ += include_javascripts :provider_edit +%input#provider_id{:name => @provider.id, :type => "hidden", :value => @provider.id, "data-ajax_url"=>url_for(:action=> 'update')} +.grid_8 + %h2 #{_("Edit Provider")} +#providers + .grid_8 + %nav.subnav + = render_navigation(:expand_all => true, :level => 3) + .grid_8#provider + = form_for(@provider, :html => {:multipart => true, :method => :put, :id => 'provider_edit', :remote => true}, :url => provider_path(@provider)) do |f| + + %fieldset + .grid_2.ra + %label #{_("Name")}: + .grid_5.la.editable.edit_providername#provider_name{'name' => 'provider[name]', :url => provider_path(@provider.id)} #{@provider[:name]} + + %fieldset + .grid_2.ra + %label #{_("Description")}: + .grid_5.la.editable.edit_textarea{:style => "word-wrap: break-word;", 'name' => 'provider[description]', :url => provider_path(@provider.id)}<> #{@provider[:description]} + + %fieldset + .grid_2.ra + %label #{_("Type")}: + .grid_5.la #{@provider[:provider_type]} + + -if @provider.provider_type == Provider::REDHAT + %fieldset + .grid_2.ra + %label #{_("Repository Url")}: + .grid_5.la.editable.edit_textfield{'name' => 'provider[repository_url]', :url => provider_path(@provider.id)} #{@provider[:repository_url]} + + = link_to _("Remove Provider"), {:action => "destroy", :controller => "providers"}, :method => :delete, :confirm => _('Are you sure?'), :class => "remove_item", :remote=>true + diff --git a/app/views/providers/_form.html.haml b/app/views/providers/_form.html.haml new file mode 100644 index 00000000000..0c7155f2ba1 --- /dev/null +++ b/app/views/providers/_form.html.haml @@ -0,0 +1,29 @@ +-# parameters: form +- raise ArgumentError, "Provider form requires :form be passed in :locals" unless local_assigns[:form] + +%fieldset + .grid_2.ra + %label #{_("Name")}: + .grid_5.la + = form.text_field :name + +%fieldset + .grid_2.ra + %label #{_("Description")}: + .grid_5.la + = form.text_field :description + +%fieldset + .grid_2.ra + %label #{_("Type")}: + .grid_5.la + = select_tag('provider[provider_type]', options_for_select(Provider::TYPES, @provider.provider_type)) + +%fieldset + .grid_2.ra + %label #{_("Repository Url")}: + .grid_5.la + = form.text_field :repository_url, :id=>"repository_url_field" + +.grid_6.la.prefix_2 + = button_to _("Save"), {:action => "create", :controller => "providers"}, :method => :post, :id => :provider_save diff --git a/app/views/providers/_new.html.haml b/app/views/providers/_new.html.haml new file mode 100644 index 00000000000..54c39a6bba8 --- /dev/null +++ b/app/views/providers/_new.html.haml @@ -0,0 +1,8 @@ += include_javascripts :provider_create + +.grid_16 + %h2 #{_("New Provider")} + #provider + .grid_8#new_provider + = form_for @provider, :html => {:method => :post}, :url => providers_path do |f| + = render :partial => 'form', :locals => { :form =>f } diff --git a/app/views/providers/_products_repos.html.haml b/app/views/providers/_products_repos.html.haml new file mode 100644 index 00000000000..61276f3d630 --- /dev/null +++ b/app/views/providers/_products_repos.html.haml @@ -0,0 +1,39 @@ += include_javascripts :products_repos + += help_tip_button('product_repos-help') + +%h2 #{_("Products & Repositories")} + +#products_repos + .grid_8 + %nav.subnav + = render_navigation(:expand_all => true, :level => 3) + + .grid_8 + = help_tip(_("On Products & Repositories you can add your own Products and Repositories to your Provider. " + | + "This allows you to synchronize content from any remote repository to this server. Simply " + | + "add a Product and then setup one or more repositories to add to this Provider. This feature is only " + | + "available for Custom Providers."), 'product_repos-help') | + + .grid_8#products + %input{ :type => "hidden", :id=> "provider_id", :name => "provider_id", :value => @provider.id } + + .button.subpanel_element{"data-url"=>new_provider_product_path(@provider.id)} + = _("Add Product") + + -@products.each do |product| + %ul + %li + .grid_1.ra + %a.clickable{ :href => "#", :onclick => ""} + %img{:src => "/images/icons/expander-collapsed.png", :alt => "Expand"} + .grid_6.la.editable.subpanel_element{"data-url"=>edit_provider_product_path(@provider.id, product.id)} #{product.name} + + %ul{:style => "display:none;"} + -product.repos(product.organization.locker).each do |repo| + %li{:class=>'repo'} + .grid_6.prefix_1.la.editable.subpanel_element{"data-url"=>edit_provider_product_repository_path(@provider.id, product.id, repo.name)} #{repo.name} + .prefix_1 + .button.subpanel_element{"data-url"=>new_provider_product_repository_path(@provider.id, product.id)} + #{_("Add Repository")} + diff --git a/app/views/providers/_subscriptions.html.haml b/app/views/providers/_subscriptions.html.haml new file mode 100644 index 00000000000..8cc6a709e1b --- /dev/null +++ b/app/views/providers/_subscriptions.html.haml @@ -0,0 +1,38 @@ +.grid_8 + = help_tip_button('subscriptions-help') +   + %br.clear + %br.clear + +#subscriptions + .grid_8 + %nav.subnav + = render_navigation(:expand_all => true, :level => 3) + + .grid_7 + = help_tip(_("Listed below are the products available from the selected provider, as well as the " + | + "related subscription information. If you have a subscription manifest you may upload it below. " + | + "This manifest may be obtained by visiting the Red Hat Customer Portal or by contacting your support representative."), 'subscriptions-help') | + + .grid_8#subscription + %h4 #{_("Current Subscriptions")} + %table + %thead + %th #{_("Name")} + %th #{_("Consumed Subscriptions")} + %th #{_("Quantity Available")} + - @subscriptions.each do |sub| + %tr{:class => cycle(nil, 'alt')} + %td + = sub["productName"] + %td + = sub["consumed"] + %td + = sub["quantity"] + %h4 #{_("Upload Subscription Manifest")} + = form_for @provider, :html => {:multipart => true, :method => :post, :id => :upload_manifest}, :remote => true, :url => subscriptions_provider_path do |f| + %fieldset + = f.label :upload, _("Specify Local Manifest") + = f.file_field :contents + .actions + = f.submit _("Upload") diff --git a/app/views/providers/index.html.haml b/app/views/providers/index.html.haml new file mode 100644 index 00000000000..49c4dd48c51 --- /dev/null +++ b/app/views/providers/index.html.haml @@ -0,0 +1,15 @@ += include_javascripts :katello_client += include_javascripts :edit += include_javascripts :form += include_common_i18n += include_editable_i18n += include_javascripts :provider + +.grid_16 + = help_tip_button + = help_tip(_("Providers provide many types of content such as packages, errata, " + | + "kickstart trees, and installation disc images. A provider may be delivering " + | + "all of your paid content or it could simply be a local yum repostory providing a few yum repos.")) | + +.grid_16#main + = two_panel(@providers, @panel_options) diff --git a/app/views/providers/schedule.html.haml b/app/views/providers/schedule.html.haml new file mode 100644 index 00000000000..9b8bc4decf8 --- /dev/null +++ b/app/views/providers/schedule.html.haml @@ -0,0 +1,4 @@ +.grid_16 + %h3 #{_("Manage Providers")} + + #{_("Schedule")} diff --git a/app/views/puppetclasses/index.html.haml b/app/views/puppetclasses/index.html.haml new file mode 100644 index 00000000000..4d10fd2698b --- /dev/null +++ b/app/views/puppetclasses/index.html.haml @@ -0,0 +1,9 @@ +%table + %th Module + %th Classes + - @klasses.sort.each do |pmodule, pclasses| + %tr + %td + = pmodule + %td + = pclasses.collect{|klass| name_without_module klass}.sort.join(", ") diff --git a/app/views/repositories/_edit.html.haml b/app/views/repositories/_edit.html.haml new file mode 100644 index 00000000000..ab17ebdbcfd --- /dev/null +++ b/app/views/repositories/_edit.html.haml @@ -0,0 +1,24 @@ += include_javascripts :provider_edit + +%h2 + = _("Product: ") + @product.name +%h3 + = _("Edit Repository") + +%fieldset + .grid_2.ra + %label #{_("Name")}: + .grid_5.la.editable.edit_providername#repo_name{'name' => 'repo[name]', :url => provider_path(@provider.id)} #{@repository[:name]} + +%fieldset + .grid_2.ra + %label #{_("URL")}: + .grid_5.la.editable.edit_textfield{'name' => 'repo[feed]', :url => provider_path(@provider.id)} #{@repository[:source][:url]} + +%fieldset + .grid_2.ra + %label #{_("Type")}: + .grid_5.la #{@provider[:provider_type]} + +%a.remove_item.repo_delete{"data-url"=>provider_product_repository_path(@provider.id, @product.id, @repository[:name]), "data-forward"=>products_repos_provider_path(@provider.id), "data-confirm-text"=>_('Are you sure?')} + = _("Remove Repository") diff --git a/app/views/repositories/_new.html.haml b/app/views/repositories/_new.html.haml new file mode 100644 index 00000000000..9893986df66 --- /dev/null +++ b/app/views/repositories/_new.html.haml @@ -0,0 +1,20 @@ +%h2 + = _("Product: ") + @product.name +%h3 + = _("Create Repository") +.clear +   += form_tag provider_product_repositories_path(@provider.id, @product.id), :method => "post" do |f| + %fieldset.clearfix + .grid_2.ra + = label :repo, :name, _("Name") + .grid_5.la + = text_field :repo, :name, :id=>"repo_name_field" + %fieldset.clearfix + .grid_2.ra + = label :repo, :feed, _("URL") + .grid_5.la + = text_field :repo, :feed, :id=>"repo_url_field" + .grid_6.ra + .button.dialogbutton.repo_create#save_repository_button{:style=>"float:right;", 'data-url'=>products_repos_provider_path(@provider.id), "data-product_id" => @product.id} + #{_("Create")} diff --git a/app/views/roles/_closed_permission.html.haml b/app/views/roles/_closed_permission.html.haml new file mode 100644 index 00000000000..5aa9a1232ae --- /dev/null +++ b/app/views/roles/_closed_permission.html.haml @@ -0,0 +1,20 @@ +.clear +.grid_1.ra + = _("Type") +.grid_6.la + - if perm.resource_type + = perm.resource_type.name.capitalize +.grid_1.ra + = _("Scope") +.grid_6.la + - if perm.all_tags? + #{_("All")} + - else + = perm.tags.collect{|tag| tag.name}.join(", ") +.grid_1.ra + = _("Verbs") +.grid_6.la + - if perm.all_verbs? + #{_("All")} + - else + = perm.verbs.collect{|verb| verb.verb}.join(", ") diff --git a/app/views/roles/_edit.html.haml b/app/views/roles/_edit.html.haml new file mode 100644 index 00000000000..4b488d8d01a --- /dev/null +++ b/app/views/roles/_edit.html.haml @@ -0,0 +1,25 @@ + += include_javascripts :role_edit + +.grid_8 + %h2 #{_("Role")} +#role + .grid_8#role + = form_for role, :url => role_path(role) do |f| + .grid_1.ra.fieldset + = label :role, :name, _("Name") + .grid_6.la.editable.edit_rolename#role_name{'name' => 'role[name]', :url=>role_path(@role.id)} #{@role[:name]} + .grid_7 +   + #permissions.grid_8 + - role.permissions.each do |perm| + = render "permission", :perm=>perm, :data_new=>false, :role=>role + / Chrome bug fix, need the %nbsp; below or add permission does not work correctly in chrome +   + #add_permission{:data_id=>role.id, :data_url=>roles_show_permission_path(), :class=>"button"} + = _("Add Permission") +.grid_8 +   + += link_to _("Remove Role"), {:action => "destroy", :controller => "roles"}, :method => :delete, :confirm => _('Are you sure?'), :class => "remove_item", :remote=>true + diff --git a/app/views/roles/_new.html.haml b/app/views/roles/_new.html.haml new file mode 100644 index 00000000000..34974c0bf49 --- /dev/null +++ b/app/views/roles/_new.html.haml @@ -0,0 +1,13 @@ +%h3 #{_("New Role")} +#new_role + .grid_8#new_role + %fieldset + .grid_1.ra + = label :role, :name, _("Name") + .grid_6.la + = text_field :role, :name, :id=>"role_name_field", :tabindex => 1 + + .grid_7.ra + .button#save_role_button{:tabindex => 2} + #{("Save Role")} + \ No newline at end of file diff --git a/app/views/roles/_permission.html.haml b/app/views/roles/_permission.html.haml new file mode 100644 index 00000000000..b37d72bcbe6 --- /dev/null +++ b/app/views/roles/_permission.html.haml @@ -0,0 +1,47 @@ +%div{:class=>"permission", :id=>"permission_#{perm_id(perm)}"} + = form_for perm,:url => perm.new_record? ? role_create_permission_path(role) : permission_update_path(role, perm), :html => {:data_type => "forms"} do |f| + .grid_6.la + %h6 #{_("Permission")} + .grid_1.la + - if !perm.new_record? + #delete_permission{:data_role_id=>role.id, :data_perm_id=>perm.id} + = image_tag("/images/icons/close.png") + %div{:id=>opened_id(f), :style=> (f.object.new_record? ? "" : "display: none;")} + .clear + = f.fields_for :resource_type do |res| + .grid_1.ra.fielditem + = f.label :type, _("Type") + .grid_6.la.fielditem + = res.select :name, @resource_type_names.collect {|name| [name.capitalize(), name]}, {}, :data_type => "types" + + + + .grid_1.fielditem.ra + = f.label :scope, _("Scope") + .grid_6.fielditem + = f.radio_button("all_tags", "true", :data_type => "tags") + = f.label :all, _("All") + .grid_6.prefix_1.fielditem + = f.radio_button("all_tags", "false", :style=>"vertical-align: top;",:data_type => "tags") + = f.select :tag_names, get_scopes(f).collect {|t| [t.name, t.name]}, {}, {:multiple=>true, :data_type => "tags"} + + + .grid_1.ra.fielditem + = f.label :verbs, _("Verbs") + .grid_6.la.fielditem + = f.radio_button("all_verbs", "true", :data_type =>"verbs") + = f.label :all, _("All") + .grid_6.prefix_1.fielditem + = f.radio_button("all_verbs", "false", :style=>"vertical-align: top;", :data_type =>"verbs") + = f.select :verb_values, get_verbs(f).collect {|t| [t.verb, t.verb]}, {}, {:multiple=>true, :data_type => "verbs"} + .grid_5.ra + #save_permission{:class=>[perm.new_record? ? "new_permission_save" : "", "button"]} + = _("Save") + .grid_1.ra.suffix_1 + %div{:id=>"cancel_button_#{perm_id(f)}", :class=>"button", :data_is_new=>perm.new_record?.to_s, :data_role_id=>role.id, :data_perm_id=>perm.id, :data_url=>roles_show_permission_path()} + = _("Cancel") + - unless f.object.new_record? + %div{:id=>closed_id(f), :style=> (f.object.new_record? ? "display: none;" : "") } + = render "closed_permission", :perm => f.object +/ Chrome bug fix, need the %nbsp; below or add permission does not work correctly in chrome +  diff --git a/app/views/roles/index.html.haml b/app/views/roles/index.html.haml new file mode 100644 index 00000000000..71126e18f3d --- /dev/null +++ b/app/views/roles/index.html.haml @@ -0,0 +1,7 @@ += include_javascripts :katello_client += include_javascripts :edit += include_editable_i18n += include_javascripts :role + +.grid_16 + = two_panel(@roles, @panel_options) diff --git a/app/views/sync_management/_products.html.haml b/app/views/sync_management/_products.html.haml new file mode 100644 index 00000000000..237c8415d26 --- /dev/null +++ b/app/views/sync_management/_products.html.haml @@ -0,0 +1,75 @@ + +%h2 #{_("Products") } += form_tag("sync", :method => :post, :remote => true, :id => 'sync_product_form') do + %table.products + %thead + %th #{_("Product")} + %th #{_("Start Time")} + %th #{_("Finish Time")} + %th #{_("Est Size (Packages)")} + %th #{_("Progress")} + %tbody + :javascript + var product_ids = new Array(); + var repo_status = new Array(); + + -for p in @products + -for r in p.repos p.organization.locker + :javascript + var sync_status = new Array(3); + sync_status[0] = '#{r.id}'; + sync_status[1] = '#{@repo_status[r.id][:sync_id]}'; + sync_status[2] = '#{p.id.to_s}'; + repo_status.push(sync_status); + %tr + %td{:class=>'product'} + =check_box_tag "product[#{p.id}]" + .clickable + %a{ :href => "#", :onclick => ""} + /= image_tag ("icons/expander-collapsed.png", :alt => "Expand") + %img{:src => "/images/icons/expander-collapsed.png", :alt => "Expand"} + #{p.name} + %ul + -for r in p.repos(p.organization.locker) + %li{:class=>'repo'} + / put the product's id in the value field so we know what product is syncing + =check_box_tag "repo[#{r.id}]", value="#{p.id}" + #{r.name} + %td + %div{:id =>"#{'prod_sync_start_' + p.id.to_s}"} + #{@product_status[p.id][:start_time]} + %ul + -for r in p.repos(p.organization.locker) + %li{:id =>"#{'repo_sync_start_' + r.id.to_s}", :class=>'repo'} + #{@repo_status[r.id][:start_time]} + %td + %div{:id =>"#{'prod_sync_finish_' + p.id.to_s}"} + #{@product_status[p.id][:finish_time]} + %ul + -for r in p.repos(p.organization.locker) + %li{:id =>"#{'repo_sync_finish_' + r.id.to_s}", :class=>'repo'} + #{@repo_status[r.id][:finish_time]} + %td + %div{:id =>"#{'prod_size_' + p.id.to_s}"} + #{@product_size[p.id]} + %ul + -for r in p.repos(p.organization.locker) + %li{:id =>"#{'repo_sync_size_' + r.id.to_s}", :class=>'repo'} + #{@repo_status[r.id][:size]} + #{'(' + @repo_status[r.id][:packages].to_s + ')'} + %td{:id =>"#{'table_' + p.id.to_s}"} + .productstatus + #{@product_status[p.id][:state]} + %ul{:id =>"#{'prod_' + p.id.to_s}"} + -for r in p.repos(p.organization.locker) + %li{:id =>"#{'repo_bar_' + r.id}"} + #{@repo_status[r.id][:state]} + + .actions + .grid_2 + %a{ :href => "#", :id=>"select_none", :class=>"fl" } + #{_("Select None")} + .grid_2 + %a{ :href => "#", :id=>"select_all", :class=>"fl" } + #{_("Select All")} + = submit_tag _('Synchronize Now'), :class => 'dialogbutton fr', :id => 'sync_button' diff --git a/app/views/sync_management/index.html.haml b/app/views/sync_management/index.html.haml new file mode 100644 index 00000000000..065dbd8cb5c --- /dev/null +++ b/app/views/sync_management/index.html.haml @@ -0,0 +1,12 @@ += include_javascripts :content +:javascript + localize({ + "cancel": '#{_('Cancel')}', + "error": '#{_('Error')}', + "complete": '#{_('Sync complete.')}', + }); + +#main.grid_16 + %nav.subsubnav + = render_navigation(:expand_all => true, :level => 3) + = render "products" diff --git a/app/views/sync_plans/_edit.html.haml b/app/views/sync_plans/_edit.html.haml new file mode 100644 index 00000000000..3122363a6a2 --- /dev/null +++ b/app/views/sync_plans/_edit.html.haml @@ -0,0 +1,28 @@ += include_javascripts :plan_edit + +%input#plan_id{:name => @plan.id, :type => "hidden", :value => @plan.id, "data-ajax_url"=>url_for(:action=> 'update')} +.grid_8 + %h2 #{_("Edit Sync Plan")} +.grid_8#plan + %fieldset + .grid_2.ra + %label.fl.ra.sp #{_("Name")}: + .grid_5.la.editable.edit_planname#plan_name{'name' => 'plan[name]', :url => url_for(:action => 'update')} #{@plan[:name]} + %fieldset + .grid_2.ra + %label.fl.ra.sp #{_("Description")}: + .grid_5.la.editable.edit_textarea{:style => "word-wrap: break-word;", 'name' => 'plan[description]', :url => url_for(:action => 'update')}<> #{@plan[:description]} + %fieldset + .grid_2.ra + %label.fl.ra.sp #{_("Interval")}: + .grid_5.la.editable.edit_planinterval#plan_interval{'name' => 'plan[interval]', :url => url_for(:action => 'update')} #{@plan[:interval]} + %fieldset + .grid_2.ra + %label.fl.ra.sp #{_("Start Date")}: + .grid_5.la.editable.edit_datepicker#plan_date{'name' => 'plan[date]', :url => url_for(:action => 'update')} #{@plan.plan_date} + %fieldset + .grid_2.ra + %label.fl.ra.sp #{_("Time")}: + .grid_5.la.editable.edit_timepicker#plan_time{'name' => 'plan[time]', :url => url_for(:action => 'update')} #{@plan.plan_time} + += link_to _("Remove Sync Plan"), {:action => "destroy", :controller => "sync_plans"}, :method => :delete, :confirm => _('Are you sure?'), :class => "remove_item", :remote => true diff --git a/app/views/sync_plans/_form.html.haml b/app/views/sync_plans/_form.html.haml new file mode 100644 index 00000000000..b5fc159b6cd --- /dev/null +++ b/app/views/sync_plans/_form.html.haml @@ -0,0 +1,32 @@ +-# parameters: form +- raise ArgumentError, "Sync Plan form requires :form be passed in :locals" unless local_assigns[:form] + +%fieldset + %label.fl.ra.sp #{_("Name")}: + .grid_6.la + = form.text_field :name + +%fieldset + %label.fl.ra.sp #{_("Description")}: + .grid_6.la + = form.text_field :description + +%fieldset + %label.fl.ra.sp #{_("Interval")}: + .grid_6.la + = select_tag('sync_plan[interval]', options_for_select(SyncPlan::TYPES, @plan.interval)) + +%fieldset + %label.fl.ra.sp #{_("Start Date")}: + .grid_6.la + = form.text_field :plan_date, :id => 'datepicker' + +%fieldset + %label.fl.ra.sp #{_("Time")}: + .grid_6.la + = form.text_field :plan_time, :id => 'timepicker' + + +.grid_6.la.prefix_5 + + = button_to _("Save"), {:action => "create", :controller => "sync_plans"}, :method => :post, :id => :plan_save diff --git a/app/views/sync_plans/_new.html.haml b/app/views/sync_plans/_new.html.haml new file mode 100644 index 00000000000..df532cb66bb --- /dev/null +++ b/app/views/sync_plans/_new.html.haml @@ -0,0 +1,6 @@ +:javascript +.grid_16 + %h2 #{_("New Sync Plan")} + #plan + = form_for @plan, :html => {:method => :post, :id => 'new_sync_plan'}, :url => sync_plans_path do |f| + = render :partial => 'form', :locals => { :form =>f } diff --git a/app/views/sync_plans/index.html.haml b/app/views/sync_plans/index.html.haml new file mode 100644 index 00000000000..6cdb5a17af5 --- /dev/null +++ b/app/views/sync_plans/index.html.haml @@ -0,0 +1,13 @@ += include_javascripts :katello_client += include_javascripts :edit += include_javascripts :form += include_javascripts :plan += include_stylesheets :plan += include_common_i18n += include_editable_i18n + +#main.grid_16 + %nav.subsubnav + = render_navigation(:expand_all => true, :level => 3) +.grid_16 + = two_panel(@plans, @panel_options) diff --git a/app/views/sync_schedules/index.html.haml b/app/views/sync_schedules/index.html.haml new file mode 100644 index 00000000000..e2262e31c8f --- /dev/null +++ b/app/views/sync_schedules/index.html.haml @@ -0,0 +1,16 @@ += include_common_i18n += include_editable_i18n += include_javascripts :one_panel += include_javascripts :sync_schedule + +#main.container_16 + %nav.grid_16.subsubnav + = render_navigation(:expand_all => true, :level => 3) + .grid_8 + = one_panel('products', @products, @products_options) + .grid_8 + = one_panel('plans', @plans, @plans_options) + = form_tag sync_schedules_apply_path, :method => "post", :id => "sync_schedule_form" do |f| + = hidden_field_tag :data + = button_to _("Apply Selected Plan to Selected Products"), {:action => "apply", + :controller => "sync_schedules"}, :method => :post, :class => 'dialogbutton fr', :id => 'apply_button' diff --git a/app/views/systems/_edit.html.haml b/app/views/systems/_edit.html.haml new file mode 100644 index 00000000000..2c2fac99749 --- /dev/null +++ b/app/views/systems/_edit.html.haml @@ -0,0 +1,65 @@ += include_javascripts :system_edit + +%h2 #{_("System")} +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) + +#system + %input#system_id{:name => @system.id, :type => "hidden", :value => @system.id, "data-ajax_url"=>url_for(:action=> 'update')} + .grid_8 + %h5 #{_("System Info")} + .grid_8#system_info + %fieldset + .grid_2.ra.fieldset + = label :id, :id, _("ID") + .grid_5.la #{system.id} + %fieldset + .grid_2.ra.fieldset + = label :uuid, :uuid, _("UUID") + .grid_5.la #{system.uuid} + .clear + .grid_8 + %h5 #{_("System Properties")} + .grid_8#system_properties + %fieldset + .grid_2.ra.fieldset + = label :system, :name, _("Name") + .grid_5.la.editable.edit_textfield#system_name{'name' => 'system[name]', :url=>system_path(system.id)} #{system[:name]} + %fieldset + .grid_2.ra.fieldset + = label :system, :description, _("Description") + .grid_5.la.editable.edit_textfield#system_description{'name' => 'system[description]', :url=>system_path(system.id)} #{system[:description]} + %fieldset + .grid_2.ra.fieldset + = label :os, :os, _("OS") + .grid_5.la #{system.distro} + %fieldset + .grid_2.ra.fieldset + = label :release, :release, _("Release") + .grid_5.la #{system.kernel} + %fieldset + .grid_2.ra.fieldset + = label :arch, :arch, _("Arch") + .grid_5.la #{system.arch} + %fieldset + .grid_2.ra.fieldset + = label :location, :location, _("Location") + .grid_5.la.editable.edit_textfield#system_location{'name' => 'system[location]', :url=>system_path(system.id)} #{system[:location]} + + .clear + .grid_8 + %h5 #{_("System Events")} + .grid_8#system_events + %fieldset + .grid_2.ra.fieldset + = label :checked_in, :checked_in, _("Checked In") + .grid_5.la #{system.lastCheckin} + %fieldset + .grid_2.ra.fieldset + = label :registered_date, :registered_date, _("Registered") + .grid_5.la #{system.created} + %fieldset + .grid_2.ra.fieldset + = label :last_booted, :last_booted, _("Last Booted") + .grid_5.la #{_("None")} + \ No newline at end of file diff --git a/app/views/systems/_facts.html.haml b/app/views/systems/_facts.html.haml new file mode 100644 index 00000000000..90b44e1be6e --- /dev/null +++ b/app/views/systems/_facts.html.haml @@ -0,0 +1,25 @@ +%h2 #{_("System")} +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) + .grid_8#facts + :javascript + $("#factsTable").treeTable({initialState: "collapsed", clickableNodeNames: true}); + %table#factsTable + %thead + %th= _("Group") + %th= _("Fact") + %th= _("Value") + %tbody + - group = nil + - @system.facts.sort.each do |fact, value| + - new_group = fact.split(".", 2)[0] + - if (new_group != group) + - group = new_group + %tr{:id => group} + %td= new_group + %td + %td + %tr{:class => "child-of-#{group}", :id => fact} + %td + %td= fact + %td= value \ No newline at end of file diff --git a/app/views/systems/_packages.html.haml b/app/views/systems/_packages.html.haml new file mode 100644 index 00000000000..0705369f2fd --- /dev/null +++ b/app/views/systems/_packages.html.haml @@ -0,0 +1,19 @@ +%h2 #{_("System")} +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) + +%table.packages + %thead + %th #{_("Name")} + %th #{_("Arch")} + %tbody + -packages.each do |p| + %tr + %td{:class=>'package'} + #{p.name} + %td{:class=>"arch"} + #{p.arch} + + + + diff --git a/app/views/systems/_subscriptions.html.haml b/app/views/systems/_subscriptions.html.haml new file mode 100644 index 00000000000..2c025822f24 --- /dev/null +++ b/app/views/systems/_subscriptions.html.haml @@ -0,0 +1,11 @@ +%h2 #{_("System")} +%nav.subnav + = render_navigation(:expand_all => true, :level => 3) +%h5.grid_8 #{_("Subscriptions")} += form_tag update_subscriptions_system_path, :method => "post", :id => "update_subscriptions" do |f| + .grid_7 + = select_tag "system[consumed_pool_ids]", options_from_collection_for_select(all_subs, 'poolId', 'poolName', consumed), :multiple => true, :class => 'multiselect', :style=>"width:400px; height:200px" + .grid_2 + = button_to _("Save Subscriptions"), {:action => "update_subscriptions", :controller => "systems"}, :method => :post, :id => :subcription_save + += include_javascripts :system_subscriptions \ No newline at end of file diff --git a/app/views/systems/index.html.haml b/app/views/systems/index.html.haml new file mode 100644 index 00000000000..2e6a2bf94d2 --- /dev/null +++ b/app/views/systems/index.html.haml @@ -0,0 +1,9 @@ += include_javascripts :katello_client += include_javascripts :edit, :multiselect += include_editable_i18n += include_javascripts :system + += include_javascripts :form += include_javascripts :treetable +.grid_16#main + = two_panel(@systems, @panel_options) diff --git a/app/views/user_sessions/new.html.haml b/app/views/user_sessions/new.html.haml new file mode 100644 index 00000000000..16abdd09f92 --- /dev/null +++ b/app/views/user_sessions/new.html.haml @@ -0,0 +1,19 @@ += include_javascripts :login + + +.modalbox + %h2 #{_('Log In')} + .katello_form + = form_tag user_session_path, :id=>:login_form, :method => "post" do |f| + /= error_messages + %fieldset + = label_tag :username + = text_field_tag :username, params[:username] + %fieldset + = label_tag :password + = password_field_tag :password, params[:password] + %div.indented + = check_box_tag :remember_me + = label_tag :remember_me + = submit_tag _('Log In'), :class => 'submit dialogbutton' + diff --git a/app/views/users/_edit.html.haml b/app/views/users/_edit.html.haml new file mode 100644 index 00000000000..9564317e050 --- /dev/null +++ b/app/views/users/_edit.html.haml @@ -0,0 +1,50 @@ += include_javascripts :user_edit +%h3 #{_("Edit User")} +#users + .grid_8 + %fieldset + .grid_2.ra + = label :name, _("Username") + .grid_5.la + #{user.username} + %fieldset + .grid_2.ra + = label :helptips_enable, _("Enable inline help") + .grid_5.la + = check_box("user", "helptips_enabled", :id=>"helptips_enabled", :data_username=>@user.username, :checked=>@user.helptips_enabled ? "checked": "") + %fieldset + .grid_2.ra + = label :user, :username, _("Clear Disabled Helptips") + .grid_5.la + #clear_helptips{:username=>@user.username, :class=>"button"} + = _("Clear") + %fieldset + .grid_2.ra + = label :user, :password, _("Change Password") + .grid_5.la + = text_field :user, :password, :id=>"password_field", :value=>"", :type=>"password" + .grid_6.la.prefix_2 + #password_meter + %fieldset + .grid_2.ra + = label :user, :username, _("Confirm") + .grid_5.la + = text_field :user, :username, :id=>"confirm_field", :value=>"", :type=>"password" + .grid_6.la.prefix_2 + #save_password.verify_password.button{:data_username=>@user.username} + #{_("Save")} + .grid_6.la.prefix_2 + #password_conflict + + = form_for @user, :url => user_path(@user) do |f| + %fieldset + .grid_2.la + = label :user, :roles, _("Roles") + .grid_7 + = f.collection_select(:defined_role_ids, Role.non_self_roles, :id, :name, {}, {:name=>"user[role_ids][]", :id=>:user_role_ids, :multiple=>:multiple, :class=>"multiselect", :style=>"width:400px; height:200px"}) + %fieldset + .grid_2 + #save_roles{:data_username=>@user.username, :class=>"button"} + = _("Save Roles") + + = link_to _("Remove User"), { :controller => "users", :action => "destroy" }, :confirm => _('Are you sure?'), :method => :delete, :class=>"remove_item", :remote=>true \ No newline at end of file diff --git a/app/views/users/_new.html.haml b/app/views/users/_new.html.haml new file mode 100644 index 00000000000..c7f13d4ce64 --- /dev/null +++ b/app/views/users/_new.html.haml @@ -0,0 +1,28 @@ += include_javascripts :user_edit +%h3 #{_("New User")} +#new_user + .grid_8#new_user + %fieldset + .grid_2.ra + = label :user, :username, _("Username") + .grid_5.la + = text_field :user, :username, :id=>"username_field", :tabindex => 1 + %fieldset + .grid_2.ra + = label :user, :username, _("Password") + .grid_5.la + = text_field :user, :username, :id=>"password_field", :type=>"password", :tabindex => 2 + .grid_6.la.prefix_2 + #password_meter + %fieldset + .grid_2.ra + = label :user, :username, _("Confirm") + .grid_5.la + = text_field :user, :username, :id=>"confirm_field", :type=>"password", :tabindex => 3 + .grid_2.ra + .grid_5.la + #password_conflict + + .grid_6.la.prefix_2 + #save_user.verify_password.button{:tabindex => 4} + #{_("Save User")} diff --git a/app/views/users/index.html.haml b/app/views/users/index.html.haml new file mode 100644 index 00000000000..348d4823deb --- /dev/null +++ b/app/views/users/index.html.haml @@ -0,0 +1,16 @@ += include_javascripts :user, :password, :katello_client, :edit, :multiselect +:javascript + var current_username = '#{_(user.username)}'; + //what button should be disabled when passwords don't match + + localize({ + "password_match": '#{_('The passwords do not match')}', + "very_weak": '#{_("Very Weak")}', + "weak": '#{_("Weak")}', + "good": '#{_("Good")}', + "strong": '#{_("Strong")}', + "meterText": '#{_("Password Strength")}' + }); + +.grid_16#main + = two_panel(@users, @panel_options) diff --git a/app/views/users/show.html.haml b/app/views/users/show.html.haml new file mode 100644 index 00000000000..fe68b2d7be3 --- /dev/null +++ b/app/views/users/show.html.haml @@ -0,0 +1,9 @@ += include_javascripts :password += include_javascripts :multiselect += include_javascripts :user += include_javascripts :user_edit + + += collection_select(:user, :roles, Role.all, :id, :name, {}, {:multiple=>:multiple, :class=>"multiselect", :style=>"width:500px; height:400px"}) + + diff --git a/app/views/welcome/show.html.haml b/app/views/welcome/show.html.haml new file mode 100644 index 00000000000..fbb87b369ba --- /dev/null +++ b/app/views/welcome/show.html.haml @@ -0,0 +1,15 @@ +- content_for :scripts do + :javascript + function async_get() { + $.ajax({ + url: "/examples", + dataType:"html", + success: function(msg){ + alert(msg); + } + }) + } + +- content_for :title, "Welcome Page" + += button_to_function "click me", "javascript:async_get()" diff --git a/autotest/discover.rb b/autotest/discover.rb new file mode 100644 index 00000000000..f421dc5ff9f --- /dev/null +++ b/autotest/discover.rb @@ -0,0 +1,2 @@ +Autotest.add_discovery { "rails" } +Autotest.add_discovery { "rspec2" } diff --git a/config.ru b/config.ru new file mode 100644 index 00000000000..b38f7a3b456 --- /dev/null +++ b/config.ru @@ -0,0 +1,4 @@ +# This file is used by Rack-based servers to start the application. + +require ::File.expand_path('../config/environment', __FILE__) +run Src::Application diff --git a/config/application.rb b/config/application.rb new file mode 100644 index 00000000000..7c6c6a69091 --- /dev/null +++ b/config/application.rb @@ -0,0 +1,56 @@ +require File.expand_path('../boot', __FILE__) + +require 'rails/all' +require "active_record/railtie" +require "action_controller/railtie" +require "action_mailer/railtie" +require "active_resource/railtie" +require "rails/test_unit/railtie" + +# If you have a Gemfile, require the gems listed there, including any gems +# you've limited to :test, :development, or :production. +Bundler.require(:default, Rails.env) if defined?(Bundler) + +module Src + class Application < Rails::Application + # Settings in config/environments/* take precedence over those specified here. + # Application configuration should go into files in config/initializers + # -- all .rb files in that directory are automatically loaded. + + # Custom directories with classes and modules you want to be autoloadable. + config.autoload_paths += %W(#{Rails.root}/lib) + + # Only load the plugins named here, in the order given (default is alphabetical). + # :all can be used as a placeholder for all plugins not explicitly named. + # config.plugins = [ :exception_notification, :ssl_requirement, :all ] + + # Activate observers that should always be running. + # config.active_record.observers = :cacher, :garbage_collector, :forum_observer + + # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone. + # Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC. + # config.time_zone = 'Central Time (US & Canada)' + + # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded. + #config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] + #config.i18n.default_locale = :en + + # JavaScript files you want as :defaults (application.js is always included). + # config.action_view.javascript_expansions[:defaults] = %w(jquery rails) + config.action_view.javascript_expansions[:defaults] = ['jquery-1.4.2', 'jquery.ui-1.8.1/jquery-ui-1.8.1.custom.min', 'jquery-ujs/rails'] + + # Configure the default encoding used in templates for Ruby 1.9. + config.encoding = "utf-8" + + # Configure sensitive parameters which will be filtered from the log file. + config.filter_parameters += [:password] + + config.generators do |g| + g.test_framework :rspec + g.template_engine :haml + end + end +end + +FastGettext.add_text_domain 'app', :path => 'locale' +FastGettext.default_text_domain = 'app' diff --git a/config/assets.yml b/config/assets.yml new file mode 100644 index 00000000000..e600bb3ad32 --- /dev/null +++ b/config/assets.yml @@ -0,0 +1,111 @@ +embed_assets: on +javascript_compressor: yui + +javascripts: + common: + - public/javascripts/jquery-1.5.2.js + - public/javascripts/jquery-ui-1.8.11.custom/js/jquery-ui-1.8.11.custom.min.js + - public/javascripts/jquery.hoverIntent.js + - public/javascripts/jquery.ui.totop.js + - public/javascripts/jquery-ujs/rails.js + - public/javascripts/jquery.jnotify.js + - public/javascripts/katello.js + - public/javascripts/jquery.linkHover.js + html5: + - public/javascripts/html5.js + content: + - public/javascripts/content.js + - public/javascripts/jquery.periodicalupdater.js + plan: + - public/javascripts/plan.js + - public/javascripts/jquery.timepickr.js + plan_edit: + - public/javascripts/plan_edit.js + env_select: + - public/javascripts/env_select.js + katello_client: + - public/javascripts/katello_client.js + login: + - public/javascripts/login.js + promotion: + - public/javascripts/promotion.js + - public/javascripts/jquery.sortElements.js + changeset: + - public/javascripts/changeset.js + changeset_edit: + - public/javascripts/changeset_edit.js + system: + - public/javascripts/systems.js + system_edit: + - public/javascripts/system_edit.js + system_subscriptions: + - public/javascripts/system_subscriptions.js + organization: + - public/javascripts/organization.js + environment_edit: + - public/javascripts/environment_edit.js + organization_edit: + - public/javascripts/organization_edit.js + one_panel: + - public/javascripts/one_panel.js + panel: + - public/javascripts/jquery.fancyqueries.js + - public/javascripts/jquery.ba-resize.js + - public/javascripts/panel.js + - public/javascripts/jquery.ba-bbq.js + products_repos: + - public/javascripts/products_repos.js + provider: + - public/javascripts/provider.js + provider_create: + - public/javascripts/provider_create.js + provider_edit: + - public/javascripts/provider_edit.js + notices: + - public/javascripts/notices.js + - public/javascripts/jquery.periodicalupdater.js + notices_list: + - public/javascripts/notices_list.js + password: + - public/javascripts/jquery.simplePassMeter.js + user: + - public/javascripts/user.js + user_edit: + - public/javascripts/user_edit.js + role: + - public/javascripts/role.js + role_edit: + - public/javascripts/role_edit.js + sync_schedule: + - public/javascripts/sync_schedule.js + + edit: + - public/javascripts/jquery.jeditable.js + - public/javascripts/jquery.jeditable.ajaxupload.js + - public/javascripts/jquery.ajaxfileupload.js + - public/javascripts/jeditable_helpers.js + form: + - public/javascripts/jquery.form.js + treetable: + - public/javascripts/jquery.treeTable.js + multiselect: + - public/javascripts/jquery.ui.multiselect.js + bbq: + - public/javascripts/jquery.ba-bbq.js + fancyqueries: + - public/javascripts/jquery.fancyqueries.js + - public/javascripts/search.js +stylesheets: + common: + - public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/jquery-ui-1.8.11.custom.css + - public/stylesheets/compiled/screen.css + - public/stylesheets/compiled/katello.css + - public/stylesheets/jquery.loadmask.css + - public/stylesheets/compiled/ie.css + - public/stylesheets/jquery.jnotify.css + - public/stylesheets/jquery.treeTable.css + plan: + - public/stylesheets/jquery.timepickr.css + fancyqueries: + - public/stylesheets/compiled/fancyqueries.css + empty: diff --git a/config/boot.rb b/config/boot.rb new file mode 100644 index 00000000000..ab6cb374de2 --- /dev/null +++ b/config/boot.rb @@ -0,0 +1,13 @@ +require 'rubygems' + +# Set up gems listed in the Gemfile. +gemfile = File.expand_path('../../Gemfile', __FILE__) +begin + ENV['BUNDLE_GEMFILE'] = gemfile + require 'bundler' + Bundler.setup +rescue Bundler::GemNotFound => e + STDERR.puts e.message + STDERR.puts "Try running `bundle install`." + exit! +end if File.exist?(gemfile) diff --git a/config/candlepin-ca.crt b/config/candlepin-ca.crt new file mode 100644 index 00000000000..84fcd959aca --- /dev/null +++ b/config/candlepin-ca.crt @@ -0,0 +1,15 @@ +-----BEGIN CERTIFICATE----- +MIICZjCCAc+gAwIBAgIJAPqyzn4xaSHdMA0GCSqGSIb3DQEBBQUAMEwxKzApBgNV +BAMMInNhdC1wZXJmLTAzLmlkbS5sYWIuYm9zLnJlZGhhdC5jb20xCzAJBgNVBAYT +AlVTMRAwDgYDVQQHDAdSYWxlaWdoMB4XDTExMDQxNTE1MDQyNVoXDTEyMDQxNDE1 +MDQyNVowTDErMCkGA1UEAwwic2F0LXBlcmYtMDMuaWRtLmxhYi5ib3MucmVkaGF0 +LmNvbTELMAkGA1UEBhMCVVMxEDAOBgNVBAcMB1JhbGVpZ2gwgZ8wDQYJKoZIhvcN +AQEBBQADgY0AMIGJAoGBAJ/yMFq93EcHO+SBnAmTL0uBzAAMkiA1MF5B+uZgjq3A +o7RBTwme1LKZ8+jof8oAzIgj4rBgojxKCsCcMg/X2c9e6LsRMaFsLVysdDWDHqQb +IBUlfeSaczl9Cf3xZwdGx0jlzx51Apiuna7ME0ltIMIbiWfM4PPscxHBhEre0593 +AgMBAAGjUDBOMB0GA1UdDgQWBBSTfPQkDcmUDaXHeKD2RctKf/VFmTAfBgNVHSME +GDAWgBSTfPQkDcmUDaXHeKD2RctKf/VFmTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3 +DQEBBQUAA4GBAE/cfnGY94q8IN9m5cqToRKZGLU8kDqrgicKF+u+lGYfCukpFq+1 +VEJtzmBp21QPq7rcCdDPf/nccrEqXv5Mhess3fk43n80gU7kO7kXVBHMKxYJL0qX +2Bwgrws4JX3AFOxjBYA0oEyMK/69pMnJ2lN1Z8NqPtraMU/U2AcbUnTu +-----END CERTIFICATE----- diff --git a/config/compass.rb b/config/compass.rb new file mode 100644 index 00000000000..04df3ca8968 --- /dev/null +++ b/config/compass.rb @@ -0,0 +1,13 @@ +# This configuration file works with both the Compass command line tool and within Rails. +require 'ninesixty' +# Require any additional compass plugins here. + +project_type = :rails +project_path = Compass::AppIntegration::Rails.root +# Set this to the root of your project when deployed: +http_path = "/" +css_dir = "public/stylesheets/compiled" +sass_dir = "app/stylesheets" +environment = Compass::AppIntegration::Rails.env +# To enable relative paths to assets via compass helper functions. Uncomment: +# relative_assets = true diff --git a/config/database.yml b/config/database.yml new file mode 100644 index 00000000000..a2b54b624f2 --- /dev/null +++ b/config/database.yml @@ -0,0 +1,30 @@ +# SQLite version 3.x +# gem install sqlite3-ruby (not necessary on OS X Leopard) +development: + adapter: sqlite3 + database: db/development.sqlite3 + pool: 5 + timeout: 5000 + +#development: +# adapter: postgresql +# username: katello +# password: katello +# database: katello +# host: localhost +# encoding: UTF8 + +# Warning: The database defined as "test" will be erased and +# re-generated from your development database when you run "rake". +# Do not set this db to the same as development or production. +test: + adapter: sqlite3 + database: db/test.sqlite3 + pool: 5 + timeout: 5000 + +production: + adapter: sqlite3 + database: db/production.sqlite3 + pool: 5 + timeout: 5000 diff --git a/config/environment.rb b/config/environment.rb new file mode 100644 index 00000000000..a765405689e --- /dev/null +++ b/config/environment.rb @@ -0,0 +1,7 @@ +# Load the rails application +require File.expand_path('../application', __FILE__) + +# Initialize the rails application +Src::Application.initialize! + +GettextI18nRails.translations_are_html_safe = true diff --git a/config/environments/development.rb b/config/environments/development.rb new file mode 100644 index 00000000000..e4b5a7b4206 --- /dev/null +++ b/config/environments/development.rb @@ -0,0 +1,27 @@ +Src::Application.configure do + # Settings specified here will take precedence over those in config/environment.rb + + # In the development environment your application's code is reloaded on + # every request. This slows down response time but is perfect for development + # since you don't have to restart the webserver when you make code changes. + config.cache_classes = false + + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_view.debug_rjs = true + config.action_controller.perform_caching = false + + # Don't care if the mailer can't send + config.action_mailer.raise_delivery_errors = false + # Print deprecation notices to the Rails logger + config.active_support.deprecation = :log + + # See everything in the log (default is :info) + config.log_level = :debug + config.colorize_logging = false + Dir.mkdir "#{Rails.root}/log" unless File.directory? "#{Rails.root}/log" + config.active_record.logger = Logger.new("#{Rails.root}/log/development_sql.log") +end diff --git a/config/environments/production.rb b/config/environments/production.rb new file mode 100644 index 00000000000..88a79ad8d59 --- /dev/null +++ b/config/environments/production.rb @@ -0,0 +1,49 @@ +Src::Application.configure do + # Settings specified here will take precedence over those in config/environment.rb + + # The production environment is meant for finished, "live" apps. + # Code is not reloaded between requests + config.cache_classes = true + + # Full error reports are disabled and caching is turned on + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Specifies the header that your server uses for sending files + config.action_dispatch.x_sendfile_header = "X-Sendfile" + + # For nginx: + # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' + + # If you have no front-end server that supports something like X-Sendfile, + # just comment this out and Rails will serve the files + + # See everything in the log (default is :info) + # config.log_level = :debug + + # Use a different logger for distributed setups + # config.logger = SyslogLogger.new + + # Use a different cache store in production + # config.cache_store = :mem_cache_store + + # Disable Rails's static asset server + # In production, Apache or nginx will already do this + config.serve_static_assets = true + + # Enable serving of images, stylesheets, and javascripts from an asset server + # config.action_controller.asset_host = "http://assets.example.com" + + # Disable delivery errors, bad email addresses will be ignored + # config.action_mailer.raise_delivery_errors = false + + # Enable threaded mode + # config.threadsafe! + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation can not be found) + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners + config.active_support.deprecation = :notify +end diff --git a/config/environments/test.rb b/config/environments/test.rb new file mode 100644 index 00000000000..52a7ac9c554 --- /dev/null +++ b/config/environments/test.rb @@ -0,0 +1,35 @@ +Src::Application.configure do + # Settings specified here will take precedence over those in config/environment.rb + + # The test environment is used exclusively to run your application's + # test suite. You never need to work with it otherwise. Remember that + # your test database is "scratch space" for the test suite and is wiped + # and recreated between test runs. Don't rely on the data there! + config.cache_classes = true + + # Log error messages when you accidentally call methods on nil. + config.whiny_nils = true + + # Show full error reports and disable caching + config.consider_all_requests_local = true + config.action_controller.perform_caching = false + + # Raise exceptions instead of rendering exception templates + config.action_dispatch.show_exceptions = false + + # Disable request forgery protection in test environment + config.action_controller.allow_forgery_protection = false + + # Tell Action Mailer not to deliver emails to the real world. + # The :test delivery method accumulates sent emails in the + # ActionMailer::Base.deliveries array. + config.action_mailer.delivery_method = :test + + # Use SQL instead of Active Record's schema dumper when creating the test database. + # This is necessary if your schema can't be completely dumped by the schema dumper, + # like if you have constraints or database-specific column types + # config.active_record.schema_format = :sql + + # Print deprecation notices to the stderr + config.active_support.deprecation = :stderr +end diff --git a/config/initializers/active_record.rb b/config/initializers/active_record.rb new file mode 100644 index 00000000000..cbe3b0158ba --- /dev/null +++ b/config/initializers/active_record.rb @@ -0,0 +1 @@ +ActiveRecord::Base.include_root_in_json = false \ No newline at end of file diff --git a/config/initializers/active_resource.rb b/config/initializers/active_resource.rb new file mode 100644 index 00000000000..0bca391b857 --- /dev/null +++ b/config/initializers/active_resource.rb @@ -0,0 +1 @@ +ActiveResource::Base.logger = Rails.logger \ No newline at end of file diff --git a/config/initializers/app_config.rb b/config/initializers/app_config.rb new file mode 100644 index 00000000000..7929cde9b37 --- /dev/null +++ b/config/initializers/app_config.rb @@ -0,0 +1,66 @@ +# Note: Rails 3 loads initializers in alphabetical order therefore configuration objects +# are not available in all initializers starting with 'a' letter. +require 'ostruct' +require 'yaml' + +module ApplicationConfiguration + + + class Config + include Singleton + + attr_reader :config_file + + def initialize + @config_file = "/etc/katello/katello.yml" + @config_file = "#{Rails.root}/config/katello.yml" unless File.exists? @config_file + + config = YAML::load_file(@config_file) || {} + @hash = config['common'] || {} + @hash.update(config[Rails.env] || {}) + @ostruct = hashes2ostruct(@hash) + + # candlepin and pulp are turned on by default + @ostruct.use_cp = true unless @ostruct.respond_to?(:use_cp) + @ostruct.use_pulp = true unless @ostruct.respond_to?(:use_pulp) + end + + # helper method that converts object to open struct recursively + def hashes2ostruct(object) + return case object + when Hash + object = object.clone + object.each do |key, value| + object[key] = hashes2ostruct(value) + end + OpenStruct.new(object) + when Array + object = object.clone + object.map! { |i| hashes2ostruct(i) } + else + object + end + end + + def to_os + @ostruct + end + + def to_hash + @hash + end + end +end + +# singleton object itself (to access custom methods) +::AppConfigObject = ApplicationConfiguration::Config.instance + +# config as hash structure +::AppConfigHash = ApplicationConfiguration::Config.instance.to_hash + +# config as open struct +::AppConfig = ApplicationConfiguration::Config.instance.to_os + +# add a default format for date... without this, rendering a datetime included "UTC" as +# of the string +Time::DATE_FORMATS[:default] = "%Y-%m-%d %H:%M:%S" diff --git a/config/initializers/backtrace_silencers.rb b/config/initializers/backtrace_silencers.rb new file mode 100644 index 00000000000..59385cdf379 --- /dev/null +++ b/config/initializers/backtrace_silencers.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. +# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } + +# You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. +# Rails.backtrace_cleaner.remove_silencers! diff --git a/config/initializers/compass.rb b/config/initializers/compass.rb new file mode 100644 index 00000000000..1dc4a9f83f9 --- /dev/null +++ b/config/initializers/compass.rb @@ -0,0 +1,7 @@ +require 'compass' +require 'compass/app_integration/rails' + +# Just add this line to stop sass from compiling in production mode +# Sass::Plugin.options[:never_update] = true + +Compass::AppIntegration::Rails.initialize! diff --git a/config/initializers/inflections.rb b/config/initializers/inflections.rb new file mode 100644 index 00000000000..9e8b0131f8f --- /dev/null +++ b/config/initializers/inflections.rb @@ -0,0 +1,10 @@ +# Be sure to restart your server when you modify this file. + +# Add new inflection rules using the following format +# (all these examples are active by default): +# ActiveSupport::Inflector.inflections do |inflect| +# inflect.plural /^(ox)$/i, '\1en' +# inflect.singular /^(ox)en/i, '\1' +# inflect.irregular 'person', 'people' +# inflect.uncountable %w( fish sheep ) +# end diff --git a/config/initializers/mime_types.rb b/config/initializers/mime_types.rb new file mode 100644 index 00000000000..c0feb58c7bf --- /dev/null +++ b/config/initializers/mime_types.rb @@ -0,0 +1,6 @@ +# Be sure to restart your server when you modify this file. + +# Add new mime types for use in respond_to blocks: +# Mime::Type.register "text/richtext", :rtf +# Mime::Type.register_alias "text/html", :iphone +Mime::Type.register "image/svg+xml", :svg diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb new file mode 100644 index 00000000000..fa5d278b208 --- /dev/null +++ b/config/initializers/secret_token.rb @@ -0,0 +1,7 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +Src::Application.config.secret_token = 'f466b184ef680822293d7130f57593a7087a34b5de0607c64d1ceb66fcac4dce6810a6f176feba3fbbf2489de93c0918397c0c275996eb476b2fa6079ab849c1' diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb new file mode 100644 index 00000000000..e028fca9ee7 --- /dev/null +++ b/config/initializers/session_store.rb @@ -0,0 +1,8 @@ +# Be sure to restart your server when you modify this file. + +Src::Application.config.session_store :cookie_store, :key => '_src_session' + +# Use the database for sessions instead of the cookie-based default, +# which shouldn't be used to store highly confidential information +# (create the session table with "rake db:sessions:create") +# Src::Application.config.session_store :active_record_store diff --git a/config/initializers/simple_navigation.rb b/config/initializers/simple_navigation.rb new file mode 100644 index 00000000000..f13fcb073f9 --- /dev/null +++ b/config/initializers/simple_navigation.rb @@ -0,0 +1 @@ +require 'simple_navigation/rails_controller_methods' diff --git a/config/initializers/warden.rb b/config/initializers/warden.rb new file mode 100644 index 00000000000..db6c0353ebd --- /dev/null +++ b/config/initializers/warden.rb @@ -0,0 +1,107 @@ +require 'net/ldap' + +Rails.configuration.middleware.use RailsWarden::Manager do |config| + config.failure_app = FailedAuthenticationController + config.default_scope = :user + + # all UI requests are handled in the default scope + config.scope_defaults( + :user, + :strategies => AppConfig.warden.to_sym, + :store => true, + :action => 'unauthenticated_ui' + ) + + # API requests are handled in the :api scope + config.scope_defaults( + :api, + :strategies => [:certificate, AppConfig.warden.to_sym], + :store => false, + :action => 'unauthenticated_api' + ) +end + +class Warden::SessionSerializer + def serialize(user) + raise ArgumentError, "Cannot serialize invalid user object: #{user}" if not user.is_a? User and user.id.is_a? Integer + user.id + end + + def deserialize(id) + raise ArgumentError, "Cannot deserialize non-integer id: #{id}" unless id.is_a? Integer + User.find(id) rescue nil + end +end + +# authenticate against database +Warden::Strategies.add(:database) do + + # relevant only when username and password params are set + def valid? + params[:username] && params[:password] + end + + def authenticate! + Rails.logger.debug("Warden is authenticating #{params[:username]} against database") + u = User.authenticate!(params[:username], params[:password]) + u ? success!(u) : fail!("Username or password is not correct - could not log in") + end +end + +# authenticate against LDAP +Warden::Strategies.add(:ldap) do + + # relevant only when username and password params are set + def valid? + params[:username] && params[:password] + end + + def authenticate! + Rails.logger.debug("Warden is authenticating #{params[:username]} against ldap") + u = User.authenticate_using_ldap!(params[:username], params[:password]) + u ? success!(u) : fail!("Could not log in") + end +end + +Warden::Strategies.add(:certificate) do + + def valid? + true + end + + def authenticate! + return fail('No ssl client certificate, skipping ssl-certificate authentication') if request.env['SSL_CLIENT_CERT'].blank? + + consumer_cert = OpenSSL::X509::Certificate.new(request.env['SSL_CLIENT_CERT']) + u = CpConsumerUser.new(:uuid => uuid(consumer_cert), :username => uuid(consumer_cert)) + success!(u) + end + + def uuid(cert) + drop_cn_prefix_from_subject(cert.subject.to_s) + end + + def drop_cn_prefix_from_subject(subject_string) + subject_string.sub(/\/CN=/i, '') + end +end + +# bypass authentication and return the first user (admin) +Warden::Strategies.add(:bypass) do + + # accept everything + def valid? + true + end + + def authenticate! + #return fail!("Testing authentication") + + # try to find provided username and ignore the password + Rails.logger.debug("Warden is authenticating #{params[:username]} against bypass") + user = User.where({:username => params[:username]}).first + # if none found get the first user (admin) + user = User.find(1) if user.nil? + user ? success!(user) : fail!("Cannot bypass authentication - you need at least one user in the Katello database") + end +end diff --git a/config/locales/en.yml b/config/locales/en.yml new file mode 100644 index 00000000000..e46aabd029c --- /dev/null +++ b/config/locales/en.yml @@ -0,0 +1,181 @@ +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +en: + date: + formats: + default: "%Y-%m-%d" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] + abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] + + month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + order: + - :year + - :month + - :day + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "am" + pm: "pm" + + support: + array: + words_connector: ", " + two_words_connector: " and " + last_word_connector: ", and " + + select: + prompt: "Please select" + + number: + format: + separator: "." + delimiter: "," + precision: 3 + significant: false + strip_insignificant_zeros: false + + currency: + format: + format: "%u%n" + unit: "$" + separator: "." + delimiter: "," + precision: 2 + significant: false + strip_insignificant_zeros: false + + percentage: + format: + delimiter: "" + + precision: + format: + delimiter: "" + + human: + format: + delimiter: "" + precision: 3 + significant: true + strip_insignificant_zeros: true + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + decimal_units: + format: "%n %u" + units: + unit: "" + thousand: Thousand + million: Million + billion: Billion + trillion: Trillion + quadrillion: Quadrillion + + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "less than 1 second" + other: "less than %{count} seconds" + x_seconds: + one: "1 second" + other: "%{count} seconds" + less_than_x_minutes: + one: "less than a minute" + other: "less than %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "about 1 hour" + other: "about %{count} hours" + x_days: + one: "1 day" + other: "%{count} days" + about_x_months: + one: "about 1 month" + other: "about %{count} months" + x_months: + one: "1 month" + other: "%{count} months" + about_x_years: + one: "about 1 year" + other: "about %{count} years" + over_x_years: + one: "over 1 year" + other: "over %{count} years" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + prompts: + year: "Year" + month: "Month" + day: "Day" + hour: "Hour" + minute: "Minute" + second: "Seconds" + + helpers: + select: + prompt: "Please select" + + submit: + create: 'Create %{model}' + update: 'Update %{model}' + submit: 'Save %{model}' + + errors: + format: "%{attribute} %{message}" + + messages: &errors_messages + inclusion: "is not included in the list" + exclusion: "is reserved" + invalid: "is invalid" + confirmation: "doesn't match confirmation" + accepted: "must be accepted" + empty: "can't be empty" + blank: "can't be blank" + too_long: "is too long (maximum is %{count} characters)" + too_short: "is too short (minimum is %{count} characters)" + wrong_length: "is the wrong length (should be %{count} characters)" + not_a_number: "is not a number" + not_an_integer: "must be an integer" + greater_than: "must be greater than %{count}" + greater_than_or_equal_to: "must be greater than or equal to %{count}" + equal_to: "must be equal to %{count}" + less_than: "must be less than %{count}" + less_than_or_equal_to: "must be less than or equal to %{count}" + odd: "must be odd" + even: "must be even" + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + body: "There were problems with the following fields:" + + messages: + taken: "has already been taken" + record_invalid: "Validation failed: %{errors}" + <<: *errors_messages + + full_messages: + format: "%{attribute}%{message}" diff --git a/config/locales/fr.yml b/config/locales/fr.yml new file mode 100644 index 00000000000..2cab33f99d8 --- /dev/null +++ b/config/locales/fr.yml @@ -0,0 +1,181 @@ +# French translations for Ruby on Rails +# by Christian Lescuyer (christian@flyingcoders.com) +# contributors: +# - Sebastien Grosjean - ZenCocoon.com +# - Bruno Michel - http://github.com/nono +# - Tsutomu Kuroda - http://github.com/kuroda (t-kuroda@oiax.jp) + +fr: + date: + formats: + default: "%d/%m/%Y" + short: "%e %b" + long: "%e %B %Y" + day_names: [dimanche, lundi, mardi, mercredi, jeudi, vendredi, samedi] + abbr_day_names: [dim, lun, mar, mer, jeu, ven, sam] + month_names: [~, janvier, février, mars, avril, mai, juin, juillet, août, septembre, octobre, novembre, décembre] + abbr_month_names: [~, jan., fév., mar., avr., mai, juin, juil., août, sept., oct., nov., déc.] + order: [ :day, :month, :year ] + + time: + formats: + default: "%d %B %Y %H:%M:%S" + short: "%d %b %H:%M" + long: "%A %d %B %Y %H:%M" + am: 'am' + pm: 'pm' + + datetime: + distance_in_words: + half_a_minute: "une demi-minute" + less_than_x_seconds: + zero: "moins d'une seconde" + one: "moins d'une seconde" + other: "moins de %{count} secondes" + x_seconds: + one: "1 seconde" + other: "%{count} secondes" + less_than_x_minutes: + zero: "moins d'une minute" + one: "moins d'une minute" + other: "moins de %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "environ une heure" + other: "environ %{count} heures" + x_days: + one: "1 jour" + other: "%{count} jours" + about_x_months: + one: "environ un mois" + other: "environ %{count} mois" + x_months: + one: "1 mois" + other: "%{count} mois" + about_x_years: + one: "environ un an" + other: "environ %{count} ans" + over_x_years: + one: "plus d'un an" + other: "plus de %{count} ans" + almost_x_years: + one: "presqu'un an" + other: "presque %{count} ans" + prompts: + year: "Année" + month: "Mois" + day: "Jour" + hour: "Heure" + minute: "Minute" + second: "Seconde" + + number: + format: + separator: "," + delimiter: " " + precision: 3 + significant: false + strip_insignificant_zeros: false + currency: + format: + format: "%n %u" + unit: "€" + separator: "," + delimiter: " " + precision: 2 + significant: false + strip_insignificant_zeros: false + percentage: + format: + delimiter: "" + precision: + format: + delimiter: "" + human: + format: + delimiter: "" + precision: 2 + significant: true + strip_insignificant_zeros: true + storage_units: + format: "%n %u" + units: + byte: + one: "octet" + other: "octets" + kb: "ko" + mb: "Mo" + gb: "Go" + tb: "To" + decimal_units: + format: "%n %u" + units: + unit: "" + thousand: "millier" + million: "million" + billion: "milliard" + trillion: "billion" + quadrillion: "million de milliards" + + support: + array: + words_connector: ", " + two_words_connector: " et " + last_word_connector: " et " + select: + prompt: "Veuillez sélectionner" + + helpers: + select: + prompt: "Veuillez sélectionner" + submit: + create: "Créer un %{model}" + update: "Modifier ce %{model}" + submit: "Enregistrer ce %{model}" + + errors: + template: &errors_template + header: + one: "Impossible d'enregistrer ce %{model} : 1 erreur" + other: "Impossible d'enregistrer ce %{model} : %{count} erreurs" + body: "Veuillez vérifier les champs suivants : " + + attributes: + created_at: "Créé le" + updated_at: "Modifié le" + + errors: + format: "Le %{attribute} %{message}" + messages: &errors_messages + inclusion: "n'est pas inclus(e) dans la liste" + exclusion: "n'est pas disponible" + invalid: "n'est pas valide" + confirmation: "ne concorde pas avec la confirmation" + accepted: "doit être accepté(e)" + empty: "doit être rempli(e)" + blank: "doit être rempli(e)" + too_long: "est trop long (pas plus de %{count} caractères)" + too_short: "est trop court (au moins %{count} caractères)" + wrong_length: "ne fait pas la bonne longueur (doit comporter %{count} caractères)" + not_a_number: "n'est pas un nombre" + not_an_integer: "doit être un nombre entier" + greater_than: "doit être supérieur à %{count}" + greater_than_or_equal_to: "doit être supérieur ou égal à %{count}" + equal_to: "doit être égal à %{count}" + less_than: "doit être inférieur à %{count}" + less_than_or_equal_to: "doit être inférieur ou égal à %{count}" + odd: "doit être impair" + even: "doit être pair" + + activerecord: + errors: + messages: + taken: "n'est pas disponible" + record_invalid: "La validation a échoué : %{errors}" + <<: *errors_messages + template: + <<: *errors_template + full_messages: + format: "%{attribute} %{message}" diff --git a/config/locales/ja.yml b/config/locales/ja.yml new file mode 100644 index 00000000000..36569d067a9 --- /dev/null +++ b/config/locales/ja.yml @@ -0,0 +1,243 @@ +# Sample localization file for English. Add more files in this directory for other locales. +# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. + +ja: + date: + formats: + default: "%Y-%m-%d" + short: "%b %d" + long: "%B %d, %Y" + + day_names: [Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday] + abbr_day_names: [Sun, Mon, Tue, Wed, Thu, Fri, Sat] + + month_names: [~, January, February, March, April, May, June, July, August, September, October, November, December] + abbr_month_names: [~, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec] + order: + - :year + - :month + - :day + + time: + formats: + default: "%a, %d %b %Y %H:%M:%S %z" + short: "%d %b %H:%M" + long: "%B %d, %Y %H:%M" + am: "am" + pm: "pm" + + support: + array: + words_connector: ", " + two_words_connector: " and " + last_word_connector: ", and " + + select: + prompt: "Please select" + + number: + format: + separator: "." + delimiter: "," + precision: 3 + significant: false + strip_insignificant_zeros: false + + currency: + format: + format: "%u%n" + unit: "$" + separator: "." + delimiter: "," + precision: 2 + significant: false + strip_insignificant_zeros: false + + percentage: + format: + delimiter: "" + + precision: + format: + delimiter: "" + + human: + format: + delimiter: "" + precision: 3 + significant: true + strip_insignificant_zeros: true + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + decimal_units: + format: "%n %u" + units: + unit: "" + thousand: Thousand + million: Million + billion: Billion + trillion: Trillion + quadrillion: Quadrillion + + datetime: + distance_in_words: + half_a_minute: "half a minute" + less_than_x_seconds: + one: "less than 1 second" + other: "less than %{count} seconds" + x_seconds: + one: "1 second" + other: "%{count} seconds" + less_than_x_minutes: + one: "less than a minute" + other: "less than %{count} minutes" + x_minutes: + one: "1 minute" + other: "%{count} minutes" + about_x_hours: + one: "about 1 hour" + other: "about %{count} hours" + x_days: + one: "1 day" + other: "%{count} days" + about_x_months: + one: "about 1 month" + other: "about %{count} months" + x_months: + one: "1 month" + other: "%{count} months" + about_x_years: + one: "about 1 year" + other: "about %{count} years" + over_x_years: + one: "over 1 year" + other: "over %{count} years" + almost_x_years: + one: "almost 1 year" + other: "almost %{count} years" + prompts: + year: "Year" + month: "Month" + day: "Day" + hour: "Hour" + minute: "Minute" + second: "Seconds" + + helpers: + select: + prompt: "Please select" + + submit: + create: 'Create %{model}' + update: 'Update %{model}' + submit: 'Save %{model}' + + errors: + format: "%{attribute} %{message}" + + messages: &errors_messages + inclusion: "is not included in the list" + exclusion: "is reserved" + invalid: "is invalid" + confirmation: "doesn't match confirmation" + accepted: "must be accepted" + empty: "can't be empty" + blank: "can't be blank" + too_long: "is too long (maximum is %{count} characters)" + too_short: "is too short (minimum is %{count} characters)" + wrong_length: "is the wrong length (should be %{count} characters)" + not_a_number: "is not a number" + not_an_integer: "must be an integer" + greater_than: "must be greater than %{count}" + greater_than_or_equal_to: "must be greater than or equal to %{count}" + equal_to: "must be equal to %{count}" + less_than: "must be less than %{count}" + less_than_or_equal_to: "must be less than or equal to %{count}" + odd: "must be odd" + even: "must be even" + + activerecord: + errors: + template: + header: + one: "1 error prohibited this %{model} from being saved" + other: "%{count} errors prohibited this %{model} from being saved" + body: "There were problems with the following fields:" + + messages: + taken: "has already been taken" + record_invalid: "Validation failed: %{errors}" + <<: *errors_messages + + full_messages: + format: "%{attribute}%{message}" + plural: "s" + hello: "username" + configure: "Configure" + logout: "Logout" + logout_successful: "Logout Successful!" + login_successful: "Login Successful!" + must_be_logged_in: "You must be logged in to access that page." + welcome_back: "Welcome back" + incorrect_u_p: "Incorrect username/password combination, please try again." + username: "Username" + password: "Password" + remember_me: "Remember Me" + log_in: "Log in" + about: "About" + search: "Search" + advanced_search: "ãå¾´åŽã—" + nav: "Navigation" + dashboard: "Dashboard" + monitors: "Monitors" + reports: "Reports" + notifications: "Notifications" + workflow: "Workflow" + sync: "Sync" + content: "Content" + configuration: "Configuration" + providers: "Providers" + subscription: "Subscription" + locker: "Locker" + bundle: "Bundle" + template: "Template" + systems: "Systems" + registration: "Registration" + groups: "Groups" + manage: "Manage" + management: "Management" + environments: "Environments" + operations: "Administration" + users: "Users" + owner: "Owner" + proxies: "Proxies/Mirrors" + name: "Name" + description: "Description" + default_environment: "Default Environment Name" + new: "New" + create: "Create" + update: "Update" + reset: "Reset" + edit: "Edit" + delete: "Delete" + select: "Select" + actions: "Actions" + none: "None" + sub: "Sub" + organization: "ã®åˆ¸å£²æ©Ÿã§ç™ºåˆ¸ã•" + organizations: "ã®åˆ¸å£²æ©Ÿã§ç™ºåˆ¸ã•" + create_org: "ãå¾´åŽã— ãå¾´åŽã—" + new_organization: "New Organization" + new_environment: "New Environment" + environment: "Environment" + create_environment: "Create Environment" + yes_answer: "Yes" + no_answer: "No" diff --git a/config/locales/ko.yml b/config/locales/ko.yml new file mode 100644 index 00000000000..929b22c7b1d --- /dev/null +++ b/config/locales/ko.yml @@ -0,0 +1,186 @@ +# Korean (한글) translations for Ruby on Rails +# by John Hwang (jhwang@tavon.org) +# http://github.com/tavon +# and Sunghee Kang(paranoiase@gmail.com) +# http://www.twitter.com/paranoiase + +ko: + date: + formats: + default: "%Y/%m/%d" + short: "%m/%d" + long: "%Yë…„ %mì›” %dì¼ (%a)" + + day_names: [ì¼ìš”ì¼, 월요ì¼, 화요ì¼, 수요ì¼, 목요ì¼, 금요ì¼, 토요ì¼] + abbr_day_names: [ì¼, ì›”, í™”, 수, 목, 금, 토] + + month_names: [~, 1ì›”, 2ì›”, 3ì›”, 4ì›”, 5ì›”, 6ì›”, 7ì›”, 8ì›”, 9ì›”, 10ì›”, 11ì›”, 12ì›”] + abbr_month_names: [~, 1ì›”, 2ì›”, 3ì›”, 4ì›”, 5ì›”, 6ì›”, 7ì›”, 8ì›”, 9ì›”, 10ì›”, 11ì›”, 12ì›”] + order: + - :year + - :month + - :day + + time: + formats: + default: "%Y/%m/%d %H:%M:%S" + short: "%y/%m/%d %H:%M" + long: "%Yë…„ %Bì›” %dì¼, %Hì‹œ %M분 %Sì´ˆ %Z" + am: "오전" + pm: "오후" + + support: + array: + sentence_connector: ", " + words_connector: ", " + two_words_connector: "와(ê³¼) " + last_word_connector: ", " + + select: + prompt: "ì„ íƒí•´ 주세요" + + number: + format: + separator: "." + delimiter: "," + precision: 3 + significant: false + strip_insignificant_zeros: false + + currency: + format: + format: "%n%u" + unit: "ì›" + separator: "." + delimiter: "," + precision: 0 + significant: false + strip_insignificant_zeros: false + + percentage: + format: + delimiter: "" + + precision: + format: + delimiter: "" + + human: + format: + delimiter: "" + precision: 3 + significant: true + strip_insignificant_zeros: true + + storage_units: + format: "%n%u" + units: + byte: "ë°”ì´íŠ¸" + kb: "킬로바ì´íŠ¸" + mb: "메가바ì´íŠ¸" + gb: "기가바ì´íŠ¸" + tb: "í…Œë¼ë°”ì´íŠ¸" + + decimal_units: + format: "%n%u" + units: + unit: "" + thousand: "천" + million: "백만" + billion: "ì‹­ì–µ" + trillion: "ì¡°" + quadrillion: "ê²½" + + datetime: + distance_in_words: + half_a_minute: "30ì´ˆ" + less_than_x_seconds: + one: "ì¼ ì´ˆ ì´í•˜" + other: "%{count}ì´ˆ ì´í•˜" + x_seconds: + one: "ì¼ ì´ˆ" + other: "%{count}ì´ˆ" + less_than_x_minutes: + one: "ì¼ ë¶„ ì´í•˜" + other: "%{count}분 ì´í•˜" + x_minutes: + one: "ì¼ ë¶„" + other: "%{count}분" + about_x_hours: + one: "약 í•œ 시간" + other: "약 %{count}시간" + x_days: + one: "하루" + other: "%{count}ì¼" + about_x_months: + one: "약 í•œ 달" + other: "약 %{count}달" + x_months: + one: "í•œ 달" + other: "%{count}달" + about_x_years: + one: "약 ì¼ ë…„" + other: "약 %{count}ë…„" + over_x_years: + one: "ì¼ ë…„ ì´ìƒ" + other: "%{count}ë…„ ì´ìƒ" + almost_x_years: + one: "ì¼ ë…„ ì´í•˜" + other: "%{count}ë…„ ì´í•˜" + + prompts: + year: "ë…„" + month: "ì›”" + day: "ì¼" + hour: "ì‹œ" + minute: "분" + second: "ì´ˆ" + + helpers: + select: + prompt: "ì„ íƒí•´ì£¼ì„¸ìš”" + + submit: + create: "등ë¡" + update: "갱신" + submit: "제출" + + errors: + format: "%{attribute}%{message}" + + messages: &errors_messages + inclusion: "ì€(는) 목ë¡ì— í¬í•¨ë˜ì–´ 있습니다" + exclusion: "ì€(는) 목ë¡ì— í¬í•¨ë˜ì–´ 있습니다" + invalid: "ì€(는) 무효입니다" + confirmation: "ì€(는) 확ì¸ë˜ì—ˆìŠµë‹ˆë‹¤" + accepted: "ì€(는) 확ì¸ë˜ì—ˆìŠµë‹ˆë‹¤" + empty: "ì€(는) 비어ë‘ë©´ 안 ë©ë‹ˆë‹¤" + blank: "ì€(는) 비어ë‘ë©´ 안 ë©ë‹ˆë‹¤" + too_long: "ì€(는) 너무 ê¹ë‹ˆë‹¤ (최대 %{count}ìž ê¹Œì§€)" + too_short: "ì€(는) 너무 짧습니다 (최소 %{count}ìž ê¹Œì§€)" + wrong_length: "ì€(는) 길ì´ê°€ 틀렸습니다 (%{count}ìžë¥¼ 필요합니다)" + not_a_number: "ì€(는) 숫ìžê°€ 아닙니다" + not_an_integer: "ì€(는) 정수가 아닙니다" + greater_than: "ì€(는) %{count}ì´ìƒì„ 요구합니다" + greater_than_or_equal_to: "ì€(는) %{count}ê³¼ 같거나 ì´ìƒì„ 요구합니다" + equal_to: "ì€(는) %{count}ê³¼ 같아야 합니다" + less_than: "ì€(는) %{count}ì´í•˜ë¥¼ 요구합니다" + less_than_or_equal_to: "ì€(는) %{count}ê³¼ 같거나 ì´í•˜ì„ 요구합니다" + odd: "ì€(는) 홀수를 요구합니다" + even: "ì€(는) ì§ìˆ˜ë¥¼ 요구합니다" + + activerecord: + errors: + template: + header: + one: "í•œ ê°œì˜ ì˜¤ë¥˜ê°€ ë°œìƒí•´ %{model}를 저장 í•  수 없습니다" + other: "%{count}ê°œì˜ ì˜¤ë¥˜ê°€ ë°œìƒí•´ %{model}를 저장 í•  수 없습니다" + body: "ë‹¤ìŒ í•­ëª©ì— ë¬¸ì œê°€ 발견ë˜ì—ˆìŠµë‹ˆë‹¤:" + + messages: + taken: "ì€(는) ì´ë¯¸ 존재합니다." + record_invalid: "ë°ì´í„° ê²€ì¦ì— 실패하였습니다. %{errors}" + <<: *errors_messages + + full_messages: + format: "%{attribute}%{message}" \ No newline at end of file diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml new file mode 100644 index 00000000000..8ed6b602d98 --- /dev/null +++ b/config/locales/pt-BR.yml @@ -0,0 +1,171 @@ +pt-BR: + # formatos de data e hora + date: + formats: + default: "%d/%m/%Y" + short: "%d de %B" + long: "%d de %B de %Y" + + day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado] + abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb] + month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro] + abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez] + order: [:day, :month, :year] + + time: + formats: + default: "%A, %d de %B de %Y, %H:%M h" + short: "%d/%m, %H:%M h" + long: "%A, %d de %B de %Y, %H:%M h" + am: '' + pm: '' + + # distancia do tempo em palavras + datetime: + distance_in_words: + half_a_minute: 'meio minuto' + less_than_x_seconds: + one: 'menos de 1 segundo' + other: 'menos de %{count} segundos' + + x_seconds: + one: '1 segundo' + other: '%{count} segundos' + + less_than_x_minutes: + one: 'menos de um minuto' + other: 'menos de %{count} minutos' + + x_minutes: + one: '1 minuto' + other: '%{count} minutos' + + about_x_hours: + one: 'aproximadamente 1 hora' + other: 'aproximadamente %{count} horas' + + x_days: + one: '1 dia' + other: '%{count} dias' + + about_x_months: + one: 'aproximadamente 1 mês' + other: 'aproximadamente %{count} meses' + + x_months: + one: '1 mês' + other: '%{count} meses' + + about_x_years: + one: 'aproximadamente 1 ano' + other: 'aproximadamente %{count} anos' + + over_x_years: + one: 'mais de 1 ano' + other: 'mais de %{count} anos' + + almost_x_years: + one: 'quase 1 ano' + other: 'quase %{count} anos' + + prompts: + year: "Ano" + month: "Mês" + day: "Dia" + hour: "Hora" + minute: "Minuto" + second: "Segundos" + + # numeros + number: + format: + precision: 3 + separator: ',' + delimiter: '.' + currency: + format: + unit: 'R$' + precision: 2 + format: '%u %n' + separator: ',' + delimiter: '.' + percentage: + format: + delimiter: '.' + precision: + format: + delimiter: '.' + human: + format: + precision: 2 + delimiter: '.' + significant: true + strip_unsignificant_zeros: true + # number_to_human_size() + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + # number_to_human() + # new in rails 3: please add to other locales + decimal_units: + format: "%n %u" + units: + unit: "" + thousand: "mil" + million: + one: milhão + other: milhões + billion: + one: bilhão + other: bilhões + trillion: + one: trilhão + other: trilhões + quadrillion: + one: quatrilhão + other: quatrilhões + + # Usado no Array.to_sentence + support: + array: + words_connector: ", " + two_words_connector: " e " + last_word_connector: " e " + + # ActiveRecord + activerecord: + errors: + template: + header: + one: "Não foi possível gravar %{model}: 1 erro" + other: "Não foi possível gravar %{model}: %{count} erros." + body: "Por favor, verifique o(s) seguinte(s) campo(s):" + messages: + inclusion: "não está incluído na lista" + exclusion: "não está disponível" + invalid: "não é válido" + confirmation: "não está de acordo com a confirmação" + accepted: "deve ser aceito" + empty: "não pode ficar vazio" + blank: "não pode ficar em branco" + too_long: "é muito longo (máximo: %{count} caracteres)" + too_short: "é muito curto (mínimo: %{count} caracteres)" + wrong_length: "não possui o tamanho esperado (%{count} caracteres)" + taken: "já está em uso" + not_a_number: "não é um número" + not_an_integer: "não é um número inteiro" + greater_than: "deve ser maior do que %{count}" + greater_than_or_equal_to: "deve ser maior ou igual a %{count}" + equal_to: "deve ser igual a %{count}" + less_than: "deve ser menor do que %{count}" + less_than_or_equal_to: "deve ser menor ou igual a %{count}" + odd: "deve ser ímpar" + even: "deve ser par" + record_invalid: "A validação falhou: %{errors}" diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml new file mode 100644 index 00000000000..392b0ef74e1 --- /dev/null +++ b/config/locales/pt-PT.yml @@ -0,0 +1,190 @@ +# European Portuguese translations for Ruby on Rails +# +# + +"pt-PT": + date: + formats: + default: "%d/%m/%Y" + short: "%d de %B" + long: "%d de %B de %Y" + + day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado] + abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb] + + month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro] + abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez] + order: + - :day + - :month + - :year + + time: + formats: + default: "%A, %d de %B de %Y, %H:%Mh" + short: "%d/%m, %H:%M hs" + long: "%A, %d de %B de %Y, %H:%Mh" + am: "am" + pm: "pm" + + support: + array: + words_connector: ", " + two_words_connector: " e " + last_word_connector: ", e" + + select: + prompt: "Por favor seleccione" + + number: + format: + separator: "," + delimiter: "." + precision: 3 + significant: false + strip_insignificant_zeros: false + + currency: + format: + format: "%u%n" + unit: "€" + separator: "," + delimiter: "." + precision: 2 + significant: false + strip_insignificant_zeros: false + + percentage: + format: + delimiter: "" + + precision: + format: + delimiter: "" + + human: + format: + delimiter: "" + precision: 1 + significant: true + strip_insignificant_zeros: true + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + decimal_units: + format: "%n %u" + units: + unit: "" + thousand: mil + million: + one: milhão + other: milhões + billion: + one: mil milhões + other: mil milhões + trillion: + one: bilião + other: biliões + quadrillion: + one: mil biliões + other: mil biliões + + datetime: + distance_in_words: + half_a_minute: "meio minuto" + less_than_x_seconds: + one: "menos de 1 segundo" + other: "menos de %{count} segundos" + x_seconds: + one: "1 segundo" + other: "%{count} segundos" + less_than_x_minutes: + one: "menos de um minuto" + other: "menos de %{count} minutos" + x_minutes: + one: "1 minuto" + other: "%{count} minutos" + about_x_hours: + one: "aproximadamente 1 hora" + other: "aproximadamente %{count} horas" + x_days: + one: "1 dia" + other: "%{count} dias" + about_x_months: + one: "aproximadamente 1 mês" + other: "aproximadamente %{count} meses" + x_months: + one: "1 mês" + other: "%{count} meses" + about_x_years: + one: "aproximadamente 1 ano" + other: "aproximadamente %{count} anos" + over_x_years: + one: "mais de 1 ano" + other: "mais de %{count} anos" + almost_x_years: + one: "quase 1 ano" + other: "quase %{count} years" + prompts: + year: "Ano" + month: "Mês" + day: "Dia" + hour: "Hora" + minute: "Minuto" + second: "Segundo" + + helpers: + select: + prompt: "Por favor seleccione" + + submit: + create: 'Criar %{model}' + update: 'Actualizar %{model}' + submit: 'Salvar %{model}' + + errors: + format: "%{attribute} %{message}" + + messages: &errors_messages + inclusion: "não está incluído na lista" + exclusion: "é reservado" + invalid: "é inválido" + confirmation: "não coincide com a confirmação" + accepted: "tem de ser aceite" + empty: "não pode estar vazio" + blank: "não pode estar em branco" + too_long: "é demasiado grande (o mínimo é de %{count} characters)" + too_short: "é demasiado pequeno (o mínimo é de %{count} caracteres)" + wrong_length: "comprimento errado (deve ter %{count} caracteres)" + not_a_number: "não é um número" + not_an_integer: "tem de ser um inteiro" + greater_than: "tem de ser maior que %{count}" + greater_than_or_equal_to: "tem de ser maior ou igual a %{count}" + equal_to: "tem de ser igual a %{count}" + less_than: "tem de ser menor que %{count}" + less_than_or_equal_to: "tem de ser menor ou igual a %{count}" + odd: "tem de ser ímpar" + even: "tem de ser par" + + activerecord: + errors: + template: + header: + one: "Não foi possível guardar %{model}: 1 erro" + other: "Não foi possível guardar %{model}: %{count} erros" + body: "Por favor, verifique os seguintes campos:" + + messages: + taken: "não está disponível" + record_invalid: "A validação falhou: %{errors}" + <<: *errors_messages + + full_messages: + format: "%{attribute}%{message}" diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml new file mode 100644 index 00000000000..7e253adffb9 --- /dev/null +++ b/config/locales/zh-CN.yml @@ -0,0 +1,207 @@ +# Chinese (China) translations for Ruby on Rails +# by tsechingho (http://github.com/tsechingho) + +zh-CN: + date: + formats: + default: "%Y-%m-%d" + short: "%b%dæ—¥" + long: "%Yå¹´%b%dæ—¥" + day_names: [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六] + abbr_day_names: [æ—¥, 一, 二, 三, å››, 五, å…­] + month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, ä¹æœˆ, å月, å一月, å二月] + abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] + order: [ :year, :month, :day ] + + time: + formats: + default: "%Yå¹´%b%dæ—¥ %A %H:%M:%S %Z" + short: "%b%dæ—¥ %H:%M" + long: "%Yå¹´%b%dæ—¥ %H:%M" + am: "上åˆ" + pm: "下åˆ" + + datetime: + distance_in_words: + half_a_minute: "åŠåˆ†é’Ÿ" + less_than_x_seconds: + one: "ä¸åˆ°ä¸€ç§’" + other: "ä¸åˆ° %{count} 秒" + x_seconds: + one: "一秒" + other: "%{count} 秒" + less_than_x_minutes: + one: "ä¸åˆ°ä¸€åˆ†é’Ÿ" + other: "ä¸åˆ° %{count} 分钟" + x_minutes: + one: "一分钟" + other: "%{count} 分钟" + about_x_hours: + one: "大约一å°æ—¶" + other: "大约 %{count} å°æ—¶" + x_days: + one: "一天" + other: "%{count} 天" + about_x_months: + one: "大约一个月" + other: "大约 %{count} 个月" + x_months: + one: "一个月" + other: "%{count} 个月" + about_x_years: + one: "大约一年" + other: "大约 %{count} å¹´" + over_x_years: + one: "一年多" + other: "%{count} 年多" + almost_x_years: + one: "接近一年" + other: "接近 %{count} å¹´" + prompts: + year: "å¹´" + month: "月" + day: "æ—¥" + hour: "æ—¶" + minute: "分" + second: "秒" + + number: + format: + separator: "." + delimiter: "," + precision: 3 + significant: false + strip_insignificant_zeros: false + currency: + format: + format: "%u %n" + unit: "CNÂ¥" + separator: "." + delimiter: "," + precision: 2 + significant: false + strip_insignificant_zeros: false + percentage: + format: + delimiter: "" + precision: + format: + delimiter: "" + human: + format: + delimiter: "" + precision: 1 + significant: false + strip_insignificant_zeros: false + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + decimal_units: + format: "%n %u" + units: + # 10^-21 zepto, 10^-24 yocto + atto: "渺" # 10^-18 + femto: "飞" # 10^-15 毫微微 + pico: "æ¼ " # 10^-12 微微 + nano: "奈" # 10^-9 毫微 + micro: "å¾®" # 10^-6 + mili: "毫" # 10^-3 milli + centi: "厘" # 10^-2 + deci: "分" # 10^-1 + unit: "" + ten: + one: "å" + other: "å" # 10^1 + hundred: "百" # 10^2 + thousand: "åƒ" # 10^3 kilo + million: "百万" # 10^6 mega + billion: "å亿" # 10^9 giga + trillion: "å…†" # 10^12 tera + quadrillion: "åƒå…†" # 10^15 peta + # 10^18 exa, 10^21 zetta, 10^24 yotta + + support: + array: + words_connector: ", " + two_words_connector: " å’Œ " + last_word_connector: ", å’Œ " + select: + prompt: "请选择" + + activerecord: + errors: + template: # ~ 2.3.5 backward compatible + header: + one: "有 1 个错误å‘生导致「%{model}ã€æ— æ³•è¢«ä¿å­˜ã€‚" + other: "有 %{count} 个错误å‘生导致「%{model}ã€æ— æ³•è¢«ä¿å­˜ã€‚" + body: "如下字段出现错误:" + full_messages: + format: "%{attribute} %{message}" + messages: + inclusion: "ä¸åŒ…å«äºŽåˆ—表中" + exclusion: "是ä¿ç•™å…³é”®å­—" + invalid: "是无效的" + confirmation: "与确认值ä¸åŒ¹é…" + accepted: "必须是å¯è¢«æŽ¥å—çš„" + empty: "ä¸èƒ½ç•™ç©º" + blank: "ä¸èƒ½ä¸ºç©ºå­—符" + too_long: "过长(最长为 %{count} 个字符)" + too_short: "过短(最短为 %{count} 个字符)" + wrong_length: "长度éžæ³•ï¼ˆå¿…须为 %{count} 个字符)" + not_a_number: "ä¸æ˜¯æ•°å­—" + not_an_integer: "必须是整数" + greater_than: "必须大于 %{count}" + greater_than_or_equal_to: "必须大于或等于 %{count}" + equal_to: "必须等于 %{count}" + less_than: "å¿…é¡»å°äºŽ %{count}" + less_than_or_equal_to: "å¿…é¡»å°äºŽæˆ–等于 %{count}" + odd: "必须为å•æ•°" + even: "必须为åŒæ•°" + taken: "å·²ç»è¢«ä½¿ç”¨" + record_invalid: "校验失败: %{errors}" + + activemodel: + errors: + template: + header: + one: "有 1 个错误å‘生导致「%{model}ã€æ— æ³•è¢«ä¿å­˜ã€‚" + other: "有 %{count} 个错误å‘生导致「%{model}ã€æ— æ³•è¢«ä¿å­˜ã€‚" + body: "如下字段出现错误:" + + errors: + format: "%{attribute} %{message}" + messages: + inclusion: "ä¸åŒ…å«äºŽåˆ—表中" + exclusion: "是ä¿ç•™å…³é”®å­—" + invalid: "是无效的" + confirmation: "与确认值ä¸åŒ¹é…" + accepted: "必须是å¯è¢«æŽ¥å—çš„" + empty: "ä¸èƒ½ç•™ç©º" + blank: "ä¸èƒ½ä¸ºç©ºå­—符" + too_long: "过长(最长为 %{count} 个字符)" + too_short: "过短(最短为 %{count} 个字符)" + wrong_length: "长度éžæ³•ï¼ˆå¿…须为 %{count} 个字符)" + not_a_number: "ä¸æ˜¯æ•°å­—" + not_an_integer: "必须是整数" + greater_than: "必须大于 %{count}" + greater_than_or_equal_to: "必须大于或等于 %{count}" + equal_to: "必须等于 %{count}" + less_than: "å¿…é¡»å°äºŽ %{count}" + less_than_or_equal_to: "å¿…é¡»å°äºŽæˆ–等于 %{count}" + odd: "必须为å•æ•°" + even: "必须为åŒæ•°" + + helpers: + select: + prompt: "请选择" + submit: + create: "新增%{model}" + update: "æ›´æ–°%{model}" + submit: "储存%{model}" diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml new file mode 100644 index 00000000000..c0099425f20 --- /dev/null +++ b/config/locales/zh-TW.yml @@ -0,0 +1,207 @@ +# Chinese (Taiwan) translations for Ruby on Rails +# by tsechingho (http://github.com/tsechingho) + +zh-TW: + date: + formats: + default: "%Y-%m-%d" + short: "%b%dæ—¥" + long: "%Yå¹´%b%dæ—¥" + day_names: [星期日, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六] + abbr_day_names: [æ—¥, 一, 二, 三, å››, 五, å…­] + month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, ä¹æœˆ, å月, å一月, å二月] + abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] + order: [ :year, :month, :day ] + + time: + formats: + default: "%Yå¹´%b%dæ—¥ %A %H:%M:%S %Z" + short: "%b%dæ—¥ %H:%M" + long: "%Yå¹´%b%dæ—¥ %H:%M" + am: "上åˆ" + pm: "下åˆ" + + datetime: + distance_in_words: + half_a_minute: "åŠåˆ†é˜" + less_than_x_seconds: + one: "ä¸åˆ°ä¸€ç§’" + other: "ä¸åˆ° %{count} 秒" + x_seconds: + one: "一秒" + other: "%{count} 秒" + less_than_x_minutes: + one: "ä¸åˆ°ä¸€åˆ†é˜" + other: "ä¸åˆ° %{count} 分é˜" + x_minutes: + one: "一分é˜" + other: "%{count} 分é˜" + about_x_hours: + one: "大約一å°æ™‚" + other: "大約 %{count} å°æ™‚" + x_days: + one: "一天" + other: "%{count} 天" + about_x_months: + one: "大約一個月" + other: "大約 %{count} 個月" + x_months: + one: "一個月" + other: "%{count} 個月" + about_x_years: + one: "大約一年" + other: "大約 %{count} å¹´" + over_x_years: + one: "一年多" + other: "%{count} 年多" + almost_x_years: + one: "接近一年" + other: "接近 %{count} å¹´" + prompts: + year: "å¹´" + month: "月" + day: "æ—¥" + hour: "時" + minute: "分" + second: "秒" + + number: + format: + separator: "." + delimiter: "," + precision: 3 + significant: false + strip_insignificant_zeros: false + currency: + format: + format: "%u %n" + unit: "NT$" + separator: "." + delimiter: "," + precision: 2 + significant: false + strip_insignificant_zeros: false + percentage: + format: + delimiter: "" + precision: + format: + delimiter: "" + human: + format: + delimiter: "" + precision: 1 + significant: false + strip_insignificant_zeros: false + storage_units: + format: "%n %u" + units: + byte: + one: "Byte" + other: "Bytes" + kb: "KB" + mb: "MB" + gb: "GB" + tb: "TB" + decimal_units: + format: "%n %u" + units: + # 10^-21 zepto, 10^-24 yocto + atto: "渺" # 10^-18 + femto: "飛" # 10^-15 毫微微 + pico: "æ¼ " # 10^-12 微微 + nano: "奈" # 10^-9 毫微 + micro: "å¾®" # 10^-6 + mili: "毫" # 10^-3 milli + centi: "厘" # 10^-2 + deci: "分" # 10^-1 + unit: "" + ten: + one: "å" + other: "å" # 10^1 + hundred: "百" # 10^2 + thousand: "åƒ" # 10^3 kilo + million: "百è¬" # 10^6 mega + billion: "åå„„" # 10^9 giga + trillion: "å…†" # 10^12 tera + quadrillion: "åƒå…†" # 10^15 peta + # 10^18 exa, 10^21 zetta, 10^24 yotta + + support: + array: + words_connector: ", " + two_words_connector: " å’Œ " + last_word_connector: ", å’Œ " + select: + prompt: "è«‹é¸æ“‡" + + activerecord: + errors: + template: # ~ 2.3.5 backward compatible + header: + one: "有 1 個錯誤發生使得「%{model}ã€ç„¡æ³•è¢«å„²å­˜ã€‚" + other: "有 %{count} 個錯誤發生使得「%{model}ã€ç„¡æ³•è¢«å„²å­˜ã€‚" + body: "以下欄ä½ç™¼ç”Ÿå•é¡Œï¼š" + full_messages: + format: "%{attribute} %{message}" + messages: + inclusion: "沒有包å«åœ¨åˆ—表中" + exclusion: "是被ä¿ç•™çš„é—œéµå­—" + invalid: "是無效的" + confirmation: "ä¸ç¬¦åˆç¢ºèªå€¼" + accepted: "必須是å¯è¢«æŽ¥å—çš„" + empty: "ä¸èƒ½ç•™ç©º" + blank: "ä¸èƒ½æ˜¯ç©ºç™½å­—å…ƒ" + too_long: "éŽé•·ï¼ˆæœ€é•·æ˜¯ %{count} 個字)" + too_short: "éŽçŸ­ï¼ˆæœ€çŸ­æ˜¯ %{count} 個字)" + wrong_length: "字數錯誤(必須是 %{count} 個字)" + not_a_number: "ä¸æ˜¯æ•¸å­—" + not_an_integer: "必須是整數" + greater_than: "必須大於 %{count}" + greater_than_or_equal_to: "必須大於或等於 %{count}" + equal_to: "必須等於 %{count}" + less_than: "å¿…é ˆå°æ–¼ %{count}" + less_than_or_equal_to: "å¿…é ˆå°æ–¼æˆ–等於 %{count}" + odd: "必須是奇數" + even: "必須是å¶æ•¸" + taken: "已經被使用" + record_invalid: "校驗失敗: %{errors}" + + activemodel: + errors: + template: + header: + one: "有 1 個錯誤發生使得「%{model}ã€ç„¡æ³•è¢«å„²å­˜ã€‚" + other: "有 %{count} 個錯誤發生使得「%{model}ã€ç„¡æ³•è¢«å„²å­˜ã€‚" + body: "以下欄ä½ç™¼ç”Ÿå•é¡Œï¼š" + + errors: + format: "%{attribute} %{message}" + messages: + inclusion: "沒有包å«åœ¨åˆ—表中" + exclusion: "是被ä¿ç•™çš„é—œéµå­—" + invalid: "是無效的" + confirmation: "ä¸ç¬¦åˆç¢ºèªå€¼" + accepted: "必須是å¯è¢«æŽ¥å—çš„" + empty: "ä¸èƒ½ç•™ç©º" + blank: "ä¸èƒ½æ˜¯ç©ºç™½å­—å…ƒ" + too_long: "éŽé•·ï¼ˆæœ€é•·æ˜¯ %{count} 個字)" + too_short: "éŽçŸ­ï¼ˆæœ€çŸ­æ˜¯ %{count} 個字)" + wrong_length: "字數錯誤(必須是 %{count} 個字)" + not_a_number: "ä¸æ˜¯æ•¸å­—" + not_an_integer: "必須是整數" + greater_than: "必須大於 %{count}" + greater_than_or_equal_to: "必須大於或等於 %{count}" + equal_to: "必須等於 %{count}" + less_than: "å¿…é ˆå°æ–¼ %{count}" + less_than_or_equal_to: "å¿…é ˆå°æ–¼æˆ–等於 %{count}" + odd: "必須是奇數" + even: "必須是å¶æ•¸" + + helpers: + select: + prompt: "è«‹é¸æ“‡" + submit: + create: "新增%{model}" + update: "æ›´æ–°%{model}" + submit: "儲存%{model}" diff --git a/config/navigation.rb b/config/navigation.rb new file mode 100644 index 00000000000..2598aee5825 --- /dev/null +++ b/config/navigation.rb @@ -0,0 +1,93 @@ +# Configures your navigation +SimpleNavigation::Configuration.run do |navigation| + + navigation.autogenerate_item_ids = false + navigation.id_generator = Proc.new {|key| "kp-#{key}"} + + navigation.items do |top_level| + top_level.item :dashboard, _("Dashboard"), {:controller => 'dashboard'}, :class=>'dashboard' do |dashboard_sub| + #TODO: tie in monitors page/link (if in dashboard page) + dashboard_sub.item :monitors, _("Monitors"), '#', :class => 'disabled' + #TODO: tie in reports page/link (if in dashboard page) + dashboard_sub.item :reports, _("Reports"), '#', :class => 'disabled' + #TODO: tie in notifications page/link (if in dashboard page) + dashboard_sub.item :notifications, _("Notifications"), '#', :class => 'disabled' + #TODO: tie in workflow page/link (if in dashboard page) + dashboard_sub.item :workflow, _("Workflow"), '#', :class => 'disabled' + end #end dashboard_sub + + #top_level.item :content, _("Providers"), {:controller => 'providers'}, :class=>'content', :highlights_on => /\/providers/ do |content_sub| + #end + + top_level.item :content, _("Content Management"), organization_providers_path(current_organization()), :class=>'content' do |content_sub| + content_sub.item :providers, _("Providers"), organization_providers_path(current_organization()), :highlights_on => /(\/organizations\/.*\/providers)|(\/providers\/.*\/(products|repos))/ do |providers_sub| + providers_sub.item :new, _("Create"), new_provider_path(), + :if => Proc.new { @provider.nil? || (!@provider.nil? && @provider.new_record?)}, + :controller => 'providers' + providers_sub.item :edit, _("Basics"), (@provider.nil? || @provider.new_record?) ? "" : edit_provider_path(@provider.id), :class => 'navigation_element', + :if => Proc.new { !@provider.nil? && !@provider.new_record? } + providers_sub.item :subscriptions, _("Subscriptions"),(@provider.nil? || @provider.new_record?) ? "" : subscriptions_provider_path(@provider.id), :class => 'navigation_element', + :if => Proc.new { !@provider.nil? && !@provider.new_record? && @provider.has_subscriptions?} + providers_sub.item :products_repos, _("Products & Repositories"),(@provider.nil? || @provider.new_record?) ? "" : products_repos_provider_path(@provider.id), :class => 'navigation_element', + :if => Proc.new { !@provider.nil? && !@provider.new_record? && !@provider.has_subscriptions?} + # providers_sub.item :subscriptions, _("Schedule"), (@provider.nil? || @provider.new_record?) ? "" : schedule_provider_path(@provider.id), :class => 'disabled' + end + content_sub.item :sync_mgmt, _("Sync Management"), :controller => 'sync_management' do |sync_sub| + sync_sub.item :status, _("Sync Status"), :controller => 'sync_management' + sync_sub.item :plans, _("Sync Plans"), :controller => 'sync_plans' + sync_sub.item :schedule, _("Sync Schedule"), :controller => 'sync_schedules' + end + #TODO: tie in Content Locker page + content_sub.item :promotions, _("Promotions"), promotions_path(current_organization().name, 'locker'), :highlights_on =>/\/organizations\/.*\/environments\/.*\/promotions/ ,:class => 'content' do |package_sub| + if !@package.nil? + package_sub.item :details, _("Details"), package_path(@package.id), :class=>"navigation_element" + package_sub.item :details, _("Dependencies"), dependencies_package_path(@package.id), :class=>"navigation_element" + package_sub.item :details, _("Changelog"), changelog_package_path(@package.id), :class=>"navigation_element" + package_sub.item :details, _("Filelist"), filelist_package_path(@package.id), :class=>"navigation_element" + end + if !@errata.nil? + package_sub.item :details, _("Details"), erratum_path(@errata.id), :class=>"navigation_element" + package_sub.item :details, _("Packages"), packages_erratum_path(@errata.id), :class=>"navigation_element" + end + end + content_sub.item :changeset, _("Changeset History"), :controller => 'changesets' + content_sub.item :updates_bundle, _("Updates Bundle"), '#', :class => 'disabled', :if => Proc.new { false } + + end #end content + + #TODO: Add correct Systems subnav items + top_level.item :systems, _("Systems"), {:controller => 'systems'}, :class=>'systems' do |systems_sub| + #TODO: tie in Registration Page (if applicable) + systems_sub.item :registered, _("Registered"), systems_path(), :controller =>"systems" do |system_sub| + if !@system.nil? + system_sub.item :general, _("General"), edit_system_path(@system.id), :class => "navigation_element", + :controller => "systems" + system_sub.item :subscriptions, _("Subscriptions"), subscriptions_system_path(@system.id), :class => "navigation_element", + :controller => "systems" + + system_sub.item :facts, _("Facts"), facts_system_path(@system.id), :class => 'navigation_element', + :controller => "systems" + + system_sub.item :packages, _("Packages"), packages_system_path(@system.id), :class => "navigation_element", + :controller => "systems" + end + end + #TODO: tie in Groups Page (if applicable) + systems_sub.item :groups, _("Groups"), '#', :class => 'disabled' + end #end systems + + top_level.item :organizations, _("Organizations"), {:controller => 'organizations'}, :class=>'organizations' do |orgs_sub| + orgs_sub.item :index, _("List"), organizations_path + + end #end organization + + top_level.item :operations, _("Administration"), {:controller => 'operations'}, :class=>'operations' do |operations_sub| + operations_sub.item :users, _("Users"), users_path + operations_sub.item :users, _("Roles"), roles_path + operations_sub.item :proxies, _("Proxies"), '#', :class => 'disabled', :if => Proc.new { false } + end #end operations + + + end #end top_level + +end #end navigation diff --git a/config/routes.rb b/config/routes.rb new file mode 100644 index 00000000000..98003cd62fe --- /dev/null +++ b/config/routes.rb @@ -0,0 +1,275 @@ +Src::Application.routes.draw do + + get "sync_plans/auto_complete_search" + resources :sync_plans, :only => [:index, :create, :new, :edit, :update, :show, :destroy] do + collection do + get :items + end + end + + get "sync_schedules/index" + post "sync_schedules/apply" + + get "sync_management/index" + post "sync_management/sync" + get "sync_management/status" + get "sync_management/product_status" + resources :sync_management, :only => [:destroy] + + get "notices/note_count" + get "notices/get_new" + get "notices/auto_complete_search" + match 'notices/:id/details' => 'notices#details', :via => :get + match 'notices' => 'notices#show', :via => :get + match 'notices' => 'notices#destroy_all', :via => :delete + + resources :dashboard do + end + resources :content do + end + resources :systems do + get 'auto_complete_search' , :on => :collection + member do + get :packages + get :subscriptions + post :update_subscriptions + get :facts + end + collection do + get :items + end + end + resources :operations do + end + + resources :packages do + member do + get :changelog + get :filelist + get :dependencies + end + end + + resources :errata do + member do + get :packages + end + end + + resources :products do + member do + get :sync + end + end + + resources :owners do + member do + post :import + get :import_status + end + end + match '/consumers/export_status' => 'consumers#export_status', :via => :get + + resources :consumers do + member do + get :export + end + resources :entitlements + resources :certificates do + collection do + get :serials + end + end + end + match '/consumers/:id' => 'consumers#re_register', :via => :post + + resources :entitlements + resources :pools + resources :users do + get 'auto_complete_search' , :on => :collection + collection do + get :items + end + end + resources :nodes, :constraints => {:id => /[^\/]+/}, :only => [:index, :show] + resources :puppetclasses, :only => [:index] + resources :providers do + resources :products do + resources :repositories + end + collection do + get :items + end + member do + get :products_repos + get :subscriptions + post :subscriptions + get :schedule + end + end + match '/providers/:id' => 'providers#update', :via => :put + match '/providers/:id' => 'providers#update', :via => :post + + match '/organizations/:org_id/environments/:env_id/promotions' => 'promotions#show', :via=>:get, :as=>'promotions' + match '/organizations/:org_id/environments/:env_id/promotions/products' => 'promotions#products', :via=>:get, :as=>'promotion_products' + match '/organizations/:org_id/environments/:env_id/promotions/packages' => 'promotions#packages', :via=>:get, :as=>'promotion_packages' + match '/organizations/:org_id/environments/:env_id/promotions/errata' => 'promotions#errata', :via=>:get, :as=>'promotion_errata' + match '/organizations/:org_id/environments/:env_id/promotions/repos' => 'promotions#repos', :via=>:get, :as=>'promotion_repos' + match '/organizations/:org_id/environments/:env_id/promotions/detail' => 'promotions#detail', :via=>:get, :as=>'promotion_details' + match '/organizations/:org_id/environments/:env_id/edit' => 'environments#update', :via => :put + + resources :organizations do + get 'auto_complete_search' , :on => :collection + + resources :environments + resources :providers do + get 'auto_complete_search', :on => :collection + end + resources :providers + collection do + get :items + end + end + match '/organizations/:id/edit' => 'organizations#update', :via => :put + + resources :changesets, :only => [:update, :index, :show, :create, :edit, :show, :auto_complete_search] do + get 'auto_complete_search', :on => :collection + + member do + put :name + get :dependency_size + get :dependency_list + post :promote + end + collection do + get :list + get :items + end + end + + + resources :environments + + resource :user + match '/users/:id/edit' => 'users#update', :via => :put + match 'users/:id/delete' => 'users#delete', :via=> :post + match '/users/:id/clear_helptips' => 'users#clear_helptips', :via => :post + match '/users/enable_helptip' => 'users#enable_helptip', :via=>:post + match '/users/disable_helptip' => 'users#disable_helptip', :via=>:post + + match '/roles/show_permission' => 'roles#show_permission', :via=>:get + resources :roles do + get 'auto_complete_search' , :on => :collection + post "create_permission" => "roles#create_permission" + + resources :permission, :only => {} do + put "update_permission" => "roles#update_permission", :as => "update" + end + collection do + get :items + end + end + match '/roles/resource_type/:resource_type/verbs_and_scopes' => 'roles#verbs_and_scopes', :via=>:get, :as=>'verbs_and_scopes' + + resources :search, :only => {} do + get 'show', :on => :collection + + get 'history', :on => :collection + delete 'history' => 'search#destroy_history', :on => :collection + + get 'favorite', :on => :collection + post 'favorite' => 'search#create_favorite', :on => :collection + delete 'favorite/:id' => 'search#destroy_favorite', :on => :collection, :as => 'destroy_favorite' + end + + resource :user_session + resource :account + root :to => "user_sessions#new" + + match '/login' => 'user_sessions#new' + match '/logout' => 'user_sessions#destroy' + match '/user_session/logout' => 'user_sessions#destroy' + + namespace :api do + + resources :systems, :only => [:show, :destroy, :create] + resources :providers do + resources :sync, :only => [:index, :show, :create] do + delete :index, :on => :collection, :action => :cancel + end + member do + post :import_products + post :import_manifest + post :product_create + get :products + end + end + + resources :templates do + post :promote, :on => :member + get :export, :on => :member + end + + #match '/organizations/:organization_id/locker/repos' => 'environments#repos', :via => :get + resources :organizations do + resources :products, :only => [:index] + resources :environments do + resources :products, :only => [:index], :constraints => { :id => /[0-9\.]*/ } do + get :repositories, :on => :member + resources :sync, :only => [:index, :show, :create] do + delete :index, :on => :collection, :action => :cancel + end + end + member do + get :repositories + end + end + resources :systems, :only => [:index] + member do + get :providers + end + end + resources :puppetclasses, :only => [:index] + resources :ping, :only => [:index] + + resources :repositories, :only => [:index, :show, :create], :constraints => { :id => /[0-9a-zA-Z\-_.]*/ } do + resources :sync, :only => [:index, :show, :create] do + delete :index, :on => :collection, :action => :cancel + end + resources :packages, :only => [:index] + resources :errata, :only => [:index] + resources :distributions, :only => [:index] + end + + resources :packages, :only => [:show] + resources :errata, :only => [:show] + resources :distributions, :only => [:show] + + # some paths conflicts with rhsm + scope 'katello' do + + # routes for non-ActiveRecord-based resources + match '/products/:id/repositories' => 'products#repo_create', :via => :post, :constraints => { :id => /[0-9\.]*/ } + + end + + # support for rhsm + resources :consumers, :controller => 'systems' + match '/consumers/:id' => 'systems#regenerate_identity_certificates', :via => :post + match '/consumers/:id/certificates' => 'proxies#get', :via => :get + match '/consumers/:id/certificates/serials' => 'proxies#get', :via => :get + match '/consumers/:id/entitlements' => 'proxies#get', :via => :get + match '/consumers/:id/entitlements' => 'proxies#post', :via => :post + match '/consumers/:id/entitlements' => 'proxies#delete', :via => :delete + match '/consumers/:consumer_id/certificates/:id' => 'proxies#delete', :via => :delete + match '/pools' => 'proxies#get', :via => :get + match '/products' => 'proxies#get', :via => :get + match '/products/:id' => 'proxies#get', :via => :get + match '/entitlements/:id' => 'proxies#get', :via => :get + match '/subscriptions' => 'proxies#post', :via => :post + + # development / debugging support + get 'status/memory' + + end +end diff --git a/config/subsystems.yml b/config/subsystems.yml new file mode 100644 index 00000000000..e8532a14e3b --- /dev/null +++ b/config/subsystems.yml @@ -0,0 +1 @@ +candlepin: 0.3.9-1 diff --git a/db/migrate/20110216102335_create_organizations.rb b/db/migrate/20110216102335_create_organizations.rb new file mode 100644 index 00000000000..04a5feac60d --- /dev/null +++ b/db/migrate/20110216102335_create_organizations.rb @@ -0,0 +1,14 @@ +class CreateOrganizations < ActiveRecord::Migration + def self.up + create_table :organizations do |t| + t.string :name + t.string :description + t.string :cp_key + t.timestamps + end + end + + def self.down + drop_table :organizations + end +end diff --git a/db/migrate/20110216105056_create_environments.rb b/db/migrate/20110216105056_create_environments.rb new file mode 100644 index 00000000000..1da12530806 --- /dev/null +++ b/db/migrate/20110216105056_create_environments.rb @@ -0,0 +1,15 @@ +class CreateEnvironments < ActiveRecord::Migration + def self.up + create_table :environments do |t| + t.string :name, :null => false + t.string :description + t.boolean :locker, :null => false, :default => false + t.integer :organization_id, :null => false + t.timestamps + end + end + + def self.down + drop_table :environments + end +end diff --git a/db/migrate/20110216171120_add_environment_priors.rb b/db/migrate/20110216171120_add_environment_priors.rb new file mode 100644 index 00000000000..1ed0596d304 --- /dev/null +++ b/db/migrate/20110216171120_add_environment_priors.rb @@ -0,0 +1,12 @@ +class AddEnvironmentPriors < ActiveRecord::Migration + def self.up + create_table :environment_priors, :id => false do |t| + t.references :environment + t.integer :prior_id, :null => false + end + end + + def self.down + drop_table :environment_priors + end +end diff --git a/db/migrate/20110303031905_create_products.rb b/db/migrate/20110303031905_create_products.rb new file mode 100644 index 00000000000..67fc3f55a18 --- /dev/null +++ b/db/migrate/20110303031905_create_products.rb @@ -0,0 +1,16 @@ +class CreateProducts < ActiveRecord::Migration + def self.up + create_table :products do |t| + t.string :name + t.string :description + t.string :cp_id + t.integer :multiplier + t.references :provider, :null => false + t.timestamps + end + end + + def self.down + drop_table :products + end +end diff --git a/db/migrate/20110303032320_environments_products.rb b/db/migrate/20110303032320_environments_products.rb new file mode 100644 index 00000000000..998c47520cd --- /dev/null +++ b/db/migrate/20110303032320_environments_products.rb @@ -0,0 +1,12 @@ +class EnvironmentsProducts < ActiveRecord::Migration + def self.up + create_table :kp_environments_products, :id => false do |t| + t.integer :kp_environment_id + t.integer :product_id + end + end + + def self.down + drop_table :kp_environments_products + end +end diff --git a/db/migrate/20110303154949_create_providers.rb b/db/migrate/20110303154949_create_providers.rb new file mode 100644 index 00000000000..846860feaa8 --- /dev/null +++ b/db/migrate/20110303154949_create_providers.rb @@ -0,0 +1,16 @@ +class CreateProviders < ActiveRecord::Migration + def self.up + create_table :providers do |t| + t.string :name + t.string :description + t.string :repository_url + t.string :provider_type + t.references :organization, :null => true + t.timestamps + end + end + + def self.down + drop_table :providers + end +end diff --git a/db/migrate/20110303161104_create_changesets.rb b/db/migrate/20110303161104_create_changesets.rb new file mode 100644 index 00000000000..eedab27717b --- /dev/null +++ b/db/migrate/20110303161104_create_changesets.rb @@ -0,0 +1,14 @@ +class CreateChangesets < ActiveRecord::Migration + def self.up + create_table :changesets do |t| + t.references :environment + t.string :name + t.boolean :published, :default=>false + t.timestamps + end + end + + def self.down + drop_table :changesets + end +end diff --git a/db/migrate/20110304121337_create_users.rb b/db/migrate/20110304121337_create_users.rb new file mode 100644 index 00000000000..68c5324f78b --- /dev/null +++ b/db/migrate/20110304121337_create_users.rb @@ -0,0 +1,14 @@ +class CreateUsers < ActiveRecord::Migration + def self.up + create_table :users do |t| + t.string :username + t.string :password + t.boolean :helptips_enabled, :default=>true + t.timestamps + end + end + + def self.down + drop_table :users + end +end diff --git a/db/migrate/20110304121603_create_roles.rb b/db/migrate/20110304121603_create_roles.rb new file mode 100644 index 00000000000..e0d18475df2 --- /dev/null +++ b/db/migrate/20110304121603_create_roles.rb @@ -0,0 +1,13 @@ +class CreateRoles < ActiveRecord::Migration + def self.up + create_table :roles do |t| + t.string :name + + t.timestamps + end + end + + def self.down + drop_table :roles + end +end diff --git a/db/migrate/20110304121750_create_verbs.rb b/db/migrate/20110304121750_create_verbs.rb new file mode 100644 index 00000000000..75bba0fe6c2 --- /dev/null +++ b/db/migrate/20110304121750_create_verbs.rb @@ -0,0 +1,13 @@ +class CreateVerbs < ActiveRecord::Migration + def self.up + create_table :verbs do |t| + t.string :verb + + t.timestamps + end + end + + def self.down + drop_table :verbs + end +end diff --git a/db/migrate/20110304121831_create_resource_types.rb b/db/migrate/20110304121831_create_resource_types.rb new file mode 100644 index 00000000000..9266ddaf06f --- /dev/null +++ b/db/migrate/20110304121831_create_resource_types.rb @@ -0,0 +1,13 @@ +class CreateResourceTypes < ActiveRecord::Migration + def self.up + create_table :resource_types do |t| + t.string :name + + t.timestamps + end + end + + def self.down + drop_table :resource_types + end +end diff --git a/db/migrate/20110304122059_create_tags.rb b/db/migrate/20110304122059_create_tags.rb new file mode 100644 index 00000000000..44c9fda09d6 --- /dev/null +++ b/db/migrate/20110304122059_create_tags.rb @@ -0,0 +1,13 @@ +class CreateTags < ActiveRecord::Migration + def self.up + create_table :tags do |t| + t.string :name + + t.timestamps + end + end + + def self.down + drop_table :tags + end +end diff --git a/db/migrate/20110304123436_create_permissions.rb b/db/migrate/20110304123436_create_permissions.rb new file mode 100644 index 00000000000..087020368c7 --- /dev/null +++ b/db/migrate/20110304123436_create_permissions.rb @@ -0,0 +1,18 @@ +class CreatePermissions < ActiveRecord::Migration + def self.up + create_table :permissions do |t| + t.belongs_to :role, :resource_type + t.boolean :all_tags, :default => false + t.boolean :all_verbs, :default => false + t.timestamps + end + add_index :permissions, :role_id + add_index :permissions, :resource_type_id + end + + def self.down + remove_index :permissions, :role_id + remove_index :permissions, :resource_type_id + drop_table :permissions + end +end diff --git a/db/migrate/20110307082628_create_permission_verb.rb b/db/migrate/20110307082628_create_permission_verb.rb new file mode 100644 index 00000000000..453e1855768 --- /dev/null +++ b/db/migrate/20110307082628_create_permission_verb.rb @@ -0,0 +1,15 @@ +class CreatePermissionVerb < ActiveRecord::Migration + def self.up + create_table :permissions_verbs, :id => false do |t| + t.belongs_to :permission, :verb + end + add_index :permissions_verbs, :permission_id + add_index :permissions_verbs, :verb_id + end + + def self.down + remove_index :permissions_verbs, :permission_id + remove_index :permissions_verbs, :verb_id + drop_table :permissions_verbs + end +end diff --git a/db/migrate/20110307082853_create_permission_tag.rb b/db/migrate/20110307082853_create_permission_tag.rb new file mode 100644 index 00000000000..920b987b3fa --- /dev/null +++ b/db/migrate/20110307082853_create_permission_tag.rb @@ -0,0 +1,15 @@ +class CreatePermissionTag < ActiveRecord::Migration + def self.up + create_table :permissions_tags, :id => false do |t| + t.belongs_to :permission, :tag + end + add_index :permissions_tags, :permission_id + add_index :permissions_tags, :tag_id + end + + def self.down + remove_index :permissions_tags, :tag_id + remove_index :permissions_tags, :permission_id + drop_table :permissions_tags + end +end diff --git a/db/migrate/20110307090341_create_role_user.rb b/db/migrate/20110307090341_create_role_user.rb new file mode 100644 index 00000000000..7fea19a26f7 --- /dev/null +++ b/db/migrate/20110307090341_create_role_user.rb @@ -0,0 +1,15 @@ +class CreateRoleUser < ActiveRecord::Migration + def self.up + create_table :roles_users, :id => false do |t| + t.belongs_to :role, :user + end + add_index :roles_users, :role_id + add_index :roles_users, :user_id + end + + def self.down + remove_index :roles_users, :role_id + remove_index :roles_users, :user_id + drop_table :roles_users + end +end diff --git a/db/migrate/20110308164810_changesets_products.rb b/db/migrate/20110308164810_changesets_products.rb new file mode 100644 index 00000000000..e08a9c42955 --- /dev/null +++ b/db/migrate/20110308164810_changesets_products.rb @@ -0,0 +1,12 @@ +class ChangesetsProducts < ActiveRecord::Migration + def self.up + create_table :changesets_products, :id => false do |t| + t.integer :changeset_id + t.integer :product_id + end + end + + def self.down + drop_table :changesets_products + end +end diff --git a/db/migrate/20110325212617_create_help_tips.rb b/db/migrate/20110325212617_create_help_tips.rb new file mode 100644 index 00000000000..313405cbaee --- /dev/null +++ b/db/migrate/20110325212617_create_help_tips.rb @@ -0,0 +1,14 @@ +class CreateHelpTips < ActiveRecord::Migration + def self.up + create_table :help_tips do |t| + t.string :key + t.references :user + + t.timestamps + end + end + + def self.down + drop_table :help_tips + end +end diff --git a/db/migrate/20110331084953_add_owner_to_role.rb b/db/migrate/20110331084953_add_owner_to_role.rb new file mode 100644 index 00000000000..80eb08de636 --- /dev/null +++ b/db/migrate/20110331084953_add_owner_to_role.rb @@ -0,0 +1,9 @@ +class AddOwnerToRole < ActiveRecord::Migration + def self.up + add_column :users, :own_role_id, :integer + end + + def self.down + remove_column :users, :own_role_id + end +end diff --git a/db/migrate/20110405175601_create_notices.rb b/db/migrate/20110405175601_create_notices.rb new file mode 100644 index 00000000000..a7530c3ed96 --- /dev/null +++ b/db/migrate/20110405175601_create_notices.rb @@ -0,0 +1,23 @@ +class CreateNotices < ActiveRecord::Migration + def self.up + # These are notice messages + create_table :notices do |t| + t.string :text, :null => false, :limit => 1024 + t.text :details + t.boolean :global, :null => false, :default => false + t.string :level, :null => false + t.timestamps + end + # Global messages have to be acknowledged by every user individually + create_table :user_notices do |t| + t.references :user + t.references :notice + t.boolean :viewed, :null => false, :default => false + end + end + + def self.down + drop_table :user_notices + drop_table :notices + end +end diff --git a/db/migrate/20110414142344_create_systems.rb b/db/migrate/20110414142344_create_systems.rb new file mode 100644 index 00000000000..190424d71c9 --- /dev/null +++ b/db/migrate/20110414142344_create_systems.rb @@ -0,0 +1,16 @@ +class CreateSystems < ActiveRecord::Migration + def self.up + create_table :systems do |t| + t.string :uuid + t.string :name + t.string :description + t.string :location + t.references :organization + t.timestamps + end + end + + def self.down + drop_table :systems + end +end diff --git a/db/migrate/20110427180336_changeset_packages.rb b/db/migrate/20110427180336_changeset_packages.rb new file mode 100644 index 00000000000..cc09fdbb49b --- /dev/null +++ b/db/migrate/20110427180336_changeset_packages.rb @@ -0,0 +1,13 @@ +class ChangesetPackages < ActiveRecord::Migration + def self.up + create_table :changeset_packages do |t| + t.integer :changeset_id + t.string :package_id + t.string :display_name + end + end + + def self.down + drop_table :changesets_packages + end +end diff --git a/db/migrate/20110429140623_changeset_errata.rb b/db/migrate/20110429140623_changeset_errata.rb new file mode 100644 index 00000000000..d767aab75a4 --- /dev/null +++ b/db/migrate/20110429140623_changeset_errata.rb @@ -0,0 +1,13 @@ +class ChangesetErrata < ActiveRecord::Migration + def self.up + create_table :changeset_errata do |t| + t.integer :changeset_id + t.string :errata_id + t.string :display_name + end + end + + def self.down + drop_table :changesets_errata + end +end diff --git a/db/migrate/20110506182638_create_sync_plans.rb b/db/migrate/20110506182638_create_sync_plans.rb new file mode 100644 index 00000000000..23d38fc9242 --- /dev/null +++ b/db/migrate/20110506182638_create_sync_plans.rb @@ -0,0 +1,17 @@ +class CreateSyncPlans < ActiveRecord::Migration + def self.up + create_table :sync_plans do |t| + t.string :name + t.text :description + t.datetime :sync_date + t.string :interval + t.references :organization, :null => false + t.timestamps + end + end + + def self.down + drop_table :sync_plans + end + +end diff --git a/db/migrate/20110517193547_add_changeset_promotion_date.rb b/db/migrate/20110517193547_add_changeset_promotion_date.rb new file mode 100644 index 00000000000..37edec1e87d --- /dev/null +++ b/db/migrate/20110517193547_add_changeset_promotion_date.rb @@ -0,0 +1,9 @@ +class AddChangesetPromotionDate < ActiveRecord::Migration + def self.up + add_column :changesets, :promotion_date, :datetime + end + + def self.down + drop_column :changesets, :promotion_date + end +end diff --git a/db/migrate/20110525133106_changeset_repos.rb b/db/migrate/20110525133106_changeset_repos.rb new file mode 100644 index 00000000000..1adf9ddb2b4 --- /dev/null +++ b/db/migrate/20110525133106_changeset_repos.rb @@ -0,0 +1,13 @@ +class ChangesetRepos < ActiveRecord::Migration + def self.up + create_table :changeset_repos do |t| + t.integer :changeset_id + t.string :repo_id + t.string :display_name + end + end + + def self.down + drop_table :changeset_repos + end +end diff --git a/db/migrate/20110527155402_create_search_histories.rb b/db/migrate/20110527155402_create_search_histories.rb new file mode 100644 index 00000000000..6d0e0686e59 --- /dev/null +++ b/db/migrate/20110527155402_create_search_histories.rb @@ -0,0 +1,15 @@ +class CreateSearchHistories < ActiveRecord::Migration + def self.up + create_table :search_histories do |t| + t.string :params + t.string :path + t.references :user + + t.timestamps + end + end + + def self.down + drop_table :search_histories + end +end diff --git a/db/migrate/20110527155434_create_search_favorites.rb b/db/migrate/20110527155434_create_search_favorites.rb new file mode 100644 index 00000000000..31241643e30 --- /dev/null +++ b/db/migrate/20110527155434_create_search_favorites.rb @@ -0,0 +1,15 @@ +class CreateSearchFavorites < ActiveRecord::Migration + def self.up + create_table :search_favorites do |t| + t.string :params + t.string :path + t.references :user + + t.timestamps + end + end + + def self.down + drop_table :search_favorites + end +end diff --git a/db/migrate/20110602143210_add_changeset_status.rb b/db/migrate/20110602143210_add_changeset_status.rb new file mode 100644 index 00000000000..7db2e99c8bb --- /dev/null +++ b/db/migrate/20110602143210_add_changeset_status.rb @@ -0,0 +1,11 @@ +class AddChangesetStatus < ActiveRecord::Migration + def self.up + add_column :changesets, :state, :string, :default=>"new", :null=>false + remove_column :changesets, :published + end + + def self.down + remove_column :changesets, :state + add_column :changesets, :published, :default=>false + end +end diff --git a/db/migrate/20110607191922_add_plan_to_product.rb b/db/migrate/20110607191922_add_plan_to_product.rb new file mode 100644 index 00000000000..6d866371ae1 --- /dev/null +++ b/db/migrate/20110607191922_add_plan_to_product.rb @@ -0,0 +1,9 @@ +class AddPlanToProduct < ActiveRecord::Migration + def self.up + add_column :products, :sync_plan_id, :integer, :default=>25, :null=>false + end + + def self.down + remove_column :products, :sync_plan_id + end +end diff --git a/db/migrate/20110609101438_create_templates.rb b/db/migrate/20110609101438_create_templates.rb new file mode 100644 index 00000000000..dcd277d0423 --- /dev/null +++ b/db/migrate/20110609101438_create_templates.rb @@ -0,0 +1,20 @@ +class CreateTemplates < ActiveRecord::Migration + def self.up + create_table :system_templates do |t| + t.integer :revision + t.string :name + t.string :description + t.string :products_json + t.string :packages_json + t.string :errata_json + t.string :host_group_json + t.string :kickstart_attrs_json + t.references :environment, :null => false + t.timestamps + end + end + + def self.down + drop_table :system_templates + end +end diff --git a/db/migrate/20110609190603_add_user_page_size.rb b/db/migrate/20110609190603_add_user_page_size.rb new file mode 100644 index 00000000000..a8f192d62be --- /dev/null +++ b/db/migrate/20110609190603_add_user_page_size.rb @@ -0,0 +1,9 @@ +class AddUserPageSize < ActiveRecord::Migration + def self.up + add_column :users, :page_size, :integer, :null=>false, :default=>25 + end + + def self.down + remove_column :users, :page_size + end +end diff --git a/db/products.json b/db/products.json new file mode 100644 index 00000000000..4ae107abb70 --- /dev/null +++ b/db/products.json @@ -0,0 +1,118 @@ +[ + { + "name": "Cluster_Storage_41111ZZ", + "cp_id": "41111ZZ", + "attributes": [ + { + "name": "version", + "value": "1.0", + "updated": "2011-01-04T18:47:46.998+0000", + "created": "2011-01-04T18:47:46.998+0000" + }, + { + "name": "variant", + "value": "ALL", + "updated": "2011-01-04T18:47:46.998+0000", + "created": "2011-01-04T18:47:46.998+0000" + }, + { + "name": "sockets", + "value": "2", + "updated": "2011-01-04T18:47:46.998+0000", + "created": "2011-01-04T18:47:46.998+0000" + }, + { + "name": "arch", + "value": "ALL", + "updated": "2011-01-04T18:47:46.998+0000", + "created": "2011-01-04T18:47:46.998+0000" + }, + { + "name": "type", + "value": "SVC", + "updated": "2011-01-04T18:47:46.998+0000", + "created": "2011-01-04T18:47:46.998+0000" + } + ], + "multiplier": 1, + "productContent": [ + { + "content": { + "name": "some-name33", + "id": "1234999", + "type": "yum", + "label": "some-label", + "vendor": "redhat", + "contentUrl": "/released-extra/RHEL-5-Server/U6-RC-1/i386/os/ClusterStorage/", + "gpgUrl": "/some/gpg/url/", + "updated": "2011-01-04T18:47:47.219+0000", + "created": "2011-01-04T18:47:47.219+0000" + }, + "enabled": true, + "flexEntitlement": 0, + "physicalEntitlement": 0 + } + ], + "href": "/products/41111ZZ", + "updated": "2011-01-04T18:47:46.995+0000", + "created": "2011-01-04T18:47:46.995+0000" + }, + { + "name": "RHEL_5_VT_41122ZZ", + "cp_id": "41122ZZ", + "attributes": [ + { + "name": "version", + "value": "1.0", + "updated": "2011-01-04T21:45:40.253+0000", + "created": "2011-01-04T21:45:40.253+0000" + }, + { + "name": "variant", + "value": "ALL", + "updated": "2011-01-04T21:45:40.253+0000", + "created": "2011-01-04T21:45:40.253+0000" + }, + { + "name": "sockets", + "value": "2", + "updated": "2011-01-04T21:45:40.254+0000", + "created": "2011-01-04T21:45:40.254+0000" + }, + { + "name": "arch", + "value": "ALL", + "updated": "2011-01-04T21:45:40.253+0000", + "created": "2011-01-04T21:45:40.253+0000" + }, + { + "name": "type", + "value": "SVC", + "updated": "2011-01-04T21:45:40.254+0000", + "created": "2011-01-04T21:45:40.254+0000" + } + ], + "multiplier": 1, + "productContent": [ + { + "content": { + "name": "some-name2222", + "id": "1234888", + "type": "yum", + "label": "some-label222", + "vendor": "redhat", + "contentUrl": "/released-extra/RHEL-5-Server/U6-RC-1/i386/os/VT/", + "gpgUrl": "/some/gpg/url/", + "updated": "2011-01-04T21:45:40.353+0000", + "created": "2011-01-04T21:45:40.353+0000" + }, + "enabled": true, + "flexEntitlement": 0, + "physicalEntitlement": 0 + } + ], + "href": "/products/41122ZZ", + "updated": "2011-01-04T21:45:40.253+0000", + "created": "2011-01-04T21:45:40.253+0000" + } +] diff --git a/db/seeds.rb b/db/seeds.rb new file mode 100644 index 00000000000..cc300a1462c --- /dev/null +++ b/db/seeds.rb @@ -0,0 +1,106 @@ +# This file should contain all the record creation needed to seed the database with its default values. +# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). + +# create the super admin if none exist - it must be created before any statement in the seed.rb script +User.current = user_admin = User.find_or_create_by_username(:username => 'admin', :password => 'password123') + +# "nobody" user +user_anonymous = User.find_or_create_by_username(:username => 'anonymous', :password => 'password123') + +# candlepin_role for RHSM +candlepin_role = Role.find_or_create_by_name(:name => 'candlepin_role') +throw "Unable to create candlepin_role: #{candlepin_role.errors}" if candlepin_role and candlepin_role.errors.size > 0 + +# create the default org = "admin" if none exist +first_org = Organization.find_or_create_by_name(:name => "ACME_Corporation", :description => "ACME Corporation Organization", :cp_key => 'ACME_Corporation') + +throw "Unable to create first org: #{first_org.errors}" if first_org and first_org.errors.size > 0 +throw "Are you sure you cleared candlepin! unable to create first org!" if first_org.environments.nil? + +#create a provider +if Provider.count == 0 + porkchop = Provider.create!({ + :name => 'porkchop', + :organization => first_org, + :repository_url => 'http://download.fedoraproject.org/pub/fedora/linux/releases/', + :provider_type => Provider::CUSTOM + }) + + Provider.create!({ + :name => 'red hat', + :organization => first_org, + :repository_url => 'https://somehost.example.com/content/', + :provider_type => Provider::REDHAT + }) +end + +#JSON(File.read("#{Rails.root}/db/products.json")).collect{|p| p.with_indifferent_access }.each do |p| +# p = Product.new(p) do |product| +# product.provider = porkchop +# product.organization = porkchop.organization +# end +# p.save! +#end + +# clean all permission and create new default set + +Permission.delete_all + +# configure limited permissions for the anonymous user +Role.allow 'anonymous_role', [:create, :update], :ar_notices +Role.allow 'anonymous_role', [:create, :update], :ar_user_notices + +# configure permissions for the super admin +Role.allow 'admin_role', { :sync_management => [:read, :delete, :sync] } +Role.allow 'admin_role', { :sync_schedules => [:read, :apply] } +Role.allow 'admin_role', { :sync_plans => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :dashboard => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :content => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :systems => [:create, :read, :update, :delete, + :packages, :subscriptions, :update_subscriptions, :facts] } +Role.allow 'admin_role', { :operations => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :products => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :owners => [:create, :read, :update, :delete, :import] } +Role.allow 'admin_role', { :consumers => [:create, :read, :update, :delete, + :export, :re_register] } +Role.allow 'admin_role', { :entitlements => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :certificates => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :pools => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :users => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :roles => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :nodes => [:read] } +Role.allow 'admin_role', { :puppetclasses => [:read] } +Role.allow 'admin_role', { :providers => [:create, :read, :update, :delete, + :subscriptions, :schedule, :repos, :products_repos, :repo_create, + :repo_update, :repo_destroy, :product_create, :product_update, :product_destroy] } +Role.allow 'admin_role', { :repositories => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :search => [:create, :read, :delete] } +Role.allow 'admin_role', { :environments => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :lockers => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :organizations => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :changesets => [:create, :read, :update, :delete, :changeset, :promote] } + +Role.allow 'admin_role', { :promotions => [:read, :products, :packages, :trees, :errata] } +Role.allow 'admin_role', { :user_sessions => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :accounts => [:create, :read, :update, :delete] } +Role.allow 'admin_role', { :jammit => [:package] } +Role.allow 'admin_role', { :notices => [:read, :delete] } + +# TODO protection of all /api controllers (currently all roles authorized by default) +#Role.allow 'admin_role', { :"api/xxx" => [:read] } + +Role.allow 'admin_role', { :packages => [:read]} +Role.allow 'admin_role', { :errata => [:read]} + + +Role.allow 'product_shopper', ["create", "read","delete"], "product", ["Fedora 14", "RHUI","Red Hat Enterprise Linux 6 Server"] +Role.allow 'environment_lord', ["create", "read", "update","delete"], "environment", ["root", "dev","qa","stage","prod"] +Role.allow 'organization_czar', ["create", "read", "update","delete"], "organization", ["HR", "QA","IT","Development"] + +# ActiveRecord protection - allow admin_role all actions for all models +ActiveRecord::Base.connection.tables.each do |t| + Role.allow 'admin_role', [:create, :update, :delete], "ar_#{t}" +end + +# candlepin_role permissions for RHSM +[:systems].each { |t| Role.allow 'candlepin_role', [:create, :update, :delete], "ar_#{t}" } diff --git a/doc/README_FOR_APP b/doc/README_FOR_APP new file mode 100644 index 00000000000..fe41f5cc24d --- /dev/null +++ b/doc/README_FOR_APP @@ -0,0 +1,2 @@ +Use this README file to introduce your application and point to useful places in the API for learning more. +Run "rake doc:app" to generate API documentation for your models, controllers, helpers, and libraries. diff --git a/extras/bundle-config b/extras/bundle-config new file mode 100644 index 00000000000..6f2f1fb4e2a --- /dev/null +++ b/extras/bundle-config @@ -0,0 +1,2 @@ +--- +BUNDLE_WITHOUT: development:test diff --git a/extras/fedora/katello.completion.sh b/extras/fedora/katello.completion.sh new file mode 100644 index 00000000000..a94544ac30f --- /dev/null +++ b/extras/fedora/katello.completion.sh @@ -0,0 +1,123 @@ +# +# Katello bash completion script +# +# vim:ts=2:sw=2:et: +# + +# options common to all subcommands (+ 3rd level opts for simplicity) +_katello_common_opts="-g -v --help +--id --repo --org --name --prior --product --repo_id --description --environment +--url --type --file" + +# complete functions for subcommands ($1 - current opt, $2 - previous opt) +_katello_distribution() +{ + local opts="info list + ${_katello_common_opts}" + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +_katello_environment() +{ + local opts="create info list update delete + ${_katello_common_opts}" + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +_katello_errata() +{ + local opts="info list + ${_katello_common_opts}" + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +_katello_org() +{ + local opts="create info list update delete + ${_katello_common_opts}" + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +_katello_package() +{ + local opts="info list + ${_katello_common_opts}" + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +_katello_product() +{ + local opts="create list + ${_katello_common_opts}" + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +_katello_provider() +{ + local opts="create info list update delete sync import_manifest + ${_katello_common_opts}" + case "${2}" in + --file) + opts=$(for F in "${1}*.zip"; do echo "$F"; done) + esac + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +_katello_repo() +{ + local opts="list status info + ${_katello_common_opts}" + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +_katello_system() +{ + local opts="list register + ${_katello_common_opts}" + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +_katello_template() +{ + local opts="create list info + ${_katello_common_opts}" + COMPREPLY=($(compgen -W "${opts}" -- ${1})) +} + +# main complete function +_katello() +{ + local first cur prev opts base + COMPREPLY=() + first=${COMP_WORDS[1]} + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + + # top-level commands and options + opts="-u -p -h --host --help + distribution environment errata org package ping product provider repo shell system template" + + case "${first}" in + distribution|\ + environment|\ + errata|\ + org|\ + package|\ + ping|\ + product|\ + provider|\ + repo|\ + system|\ + template) + "_katello_$first" "${cur}" "${prev}" + return 0 + ;; + *) + ;; + esac + + COMPREPLY=($(compgen -W "${opts}" -- ${cur})) + return 0 +} + +complete -F _katello katello diff --git a/extras/fedora/katello.init b/extras/fedora/katello.init new file mode 100755 index 00000000000..6244b25b1ed --- /dev/null +++ b/extras/fedora/katello.init @@ -0,0 +1,134 @@ +#!/bin/bash +# +# Init script for katello +# +# chkconfig: - 86 14 +# description: Init script for katello + + +# Source function library. +. /etc/rc.d/init.d/functions + +if [ -f /etc/sysconfig/katello ]; then + . /etc/sysconfig/katello +fi + +prog=katello +RETVAL=0 +KATELLO_PORT=${KATELLO_PORT:-3000} +KATELLO_USER=${KATELLO_USER:-katello} +KATELLO_HOME=${KATELLO_HOME:-/usr/lib/katello} +KATELLO_ENV=${KATELLO_ENV:-production} +KATELLO_PID=${KATELLO_PID:-${KATELLO_HOME}/tmp/pids/server.pid} + +check_privilege() { + runuser -s /bin/sh ${KATELLO_USER} -c "echo x > /dev/null" 2> /dev/null || RETVAL=4 + if [ $RETVAL = 4 ]; then + echo "User had insufficient privilege"; + exit $RETVAL + fi +} + +status() { + #check if pid file exists + if [ -f ${KATELLO_PID} ]; then + pid=`cat ${KATELLO_PID}` + #check if proces with pid from the file is running + if `ps -p $pid > /dev/null`; then + echo "$prog is running." + RETVAL=0 + else + echo "$prog is not running." + RETVAL=1 + fi + else + echo "$prog is not running." + RETVAL=3 + fi + + return $RETVAL +} + +status_q() { + status &> /dev/null + return $? +} + +start() { + check_privilege + + echo -n $"Starting $prog: " + if status_q; then + echo -n $"$prog is already running. " + RETVAL=0 + echo_success + else + cd ${KATELLO_HOME} #rails expects you to run from the root of the app + #daemon --user ${KATELLO_USER} /usr/bin/ruby ${KATELLO_HOME}/script/rails s -p ${KATELLO_PORT} -e ${KATELLO_ENV} -d > /dev/null + daemon --user ${KATELLO_USER} bundle exec /usr/bin/ruby ${KATELLO_HOME}/script/rails s -p ${KATELLO_PORT} -e ${KATELLO_ENV} -d > /dev/null + RETVAL=$? + if [ $RETVAL = 0 ]; then + echo_success + else + echo_failure + fi + fi + + echo + return $RETVAL +} + +stop() { + check_privilege + + echo -n $"Stopping $prog: " + if status_q; then + killproc -p ${KATELLO_PID} + RETVAL=$? + else + echo -n $"$prog was not running. " + RETVAL=0 + echo_success + fi + + echo + return $RETVAL +} + +restart() { + stop + start +} + +condrestart() { + if status_q; then + restart + else + RETVAL=0 + fi +} + + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + condrestart|try-restart) + condrestart + ;; + status) + status + ;; + *) + echo "Usage: {start|stop|restart|condrestart|status}" + exit 1 + ;; +esac + +exit $RETVAL diff --git a/extras/fedora/katello.logrotate b/extras/fedora/katello.logrotate new file mode 100644 index 00000000000..619bc901972 --- /dev/null +++ b/extras/fedora/katello.logrotate @@ -0,0 +1,12 @@ +/var/log/katello/*log { + missingok + notifempty + create 0644 katello katello + sharedscripts + rotate 5 + compress + weekly + postrotate + [ -e /etc/init.d/katello ] && /etc/init.d/katello restart >/dev/null 2>&1 || true + endscript +} diff --git a/extras/fedora/katello.sysconfig b/extras/fedora/katello.sysconfig new file mode 100644 index 00000000000..ffab5b28db3 --- /dev/null +++ b/extras/fedora/katello.sysconfig @@ -0,0 +1,12 @@ +# the location where katello is installed +#KATELLO_HOME=/usr/lib/katello + +# the port which katello web server is running at +# note that if the katello user is not root, it has to be a > 1024 +#KATELLO_PORT=3000 + +# the user which runs the web interface +#KATELLO_USER=katello + +# the rails environment in which katello runs +#KATELLO_ENV=production diff --git a/katello.spec b/katello.spec new file mode 100644 index 00000000000..9d945353dd4 --- /dev/null +++ b/katello.spec @@ -0,0 +1,168 @@ +%define ruby_sitelib %(ruby -rrbconfig -e "puts Config::CONFIG['sitelibdir']") +%define gemdir %(ruby -rubygems -e 'puts Gem::dir' 2>/dev/null) + +%global homedir %{_prefix}/lib/%{name} +%global datadir %{_sharedstatedir}/%{name} +%global confdir extras/fedora + +Name: katello +Version: 0.1.46 +Release: 1%{?dist} +Summary: A package for managing application lifecycle for Linux systems + +Group: Internet/Applications +License: GPLv2 +URL: http://redhat.com +Source0: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + +Requires: pulp +Requires: openssl +Requires: candlepin-tomcat6 +Requires: rubygems +Requires: rubygem(rails) >= 3.0.5 +Requires: rubygem(multimap) +Requires: rubygem(haml) +Requires: rubygem(haml-rails) +Requires: rubygem(json) +Requires: rubygem(rest-client) +Requires: rubygem(jammit) +Requires: rubygem(rails_warden) +Requires: rubygem(net-ldap) +Requires: rubygem(compass) +Requires: rubygem(compass-960-plugin) +Requires: rubygem(capistrano) +Requires: rubygem(oauth) +Requires: rubygem(i18n_data) >= 0.2.6 +Requires: rubygem(gettext_i18n_rails) +Requires: rubygem(simple-navigation) >= 3.1.0 +Requires(pre): shadow-utils +Requires(preun): chkconfig +Requires(preun): initscripts +Requires(post): chkconfig +Requires(postun): initscripts +Requires: rubygem(sqlite3) +Requires: rubygem(pg) +Requires: rubygem(scoped_search) +BuildRequires: coreutils findutils sed +BuildRequires: rubygems +BuildRequires: rubygem-rake +BuildRequires: rubygem(gettext) +BuildArch: noarch + +%description +Provides a package for managing application lifecycle for Linux systems + +%prep +%setup -q + +%build +#create mo-files for L10n (since we miss build dependencies we can't use #rake gettext:pack) +echo Generating gettext files... +ruby -e 'require "rubygems"; require "gettext/tools"; GetText.create_mofiles(:po_root => "locale", :mo_root => "locale")' + +%install +rm -rf %{buildroot} +#prepare dir structure +install -d -m0755 %{buildroot}%{homedir} +install -d -m0755 %{buildroot}%{datadir} +install -d -m0755 %{buildroot}%{datadir}/public-assets +install -d -m0755 %{buildroot}%{datadir}/public-compiled-stylesheets +install -d -m0755 %{buildroot}%{_sysconfdir}/%{name} +install -d -m0750 %{buildroot}%{_localstatedir}/log/%{name} + +#copy the application to the target directory +mkdir .bundle +mv ./extras/bundle-config .bundle/config +cp -R .bundle * %{buildroot}%{homedir} + +#copy configs (will be all overwriten with symlinks) +install -m 644 config/%{name}.yml %{buildroot}%{_sysconfdir}/%{name}/%{name}.yml +install -m 644 config/database.yml %{buildroot}%{_sysconfdir}/%{name}/database.yml +install -m 644 config/environments/production.rb %{buildroot}%{_sysconfdir}/%{name}/prod_env.rb +install -m 644 config/environments/development.rb %{buildroot}%{_sysconfdir}/%{name}/dev_env.rb + +#copy init scripts and sysconfigs +install -Dp -m0644 %{confdir}/%{name}.sysconfig %{buildroot}%{_sysconfdir}/sysconfig/%{name} +install -Dp -m0755 %{confdir}/%{name}.init %{buildroot}%{_initrddir}/%{name} +install -Dp -m0644 %{confdir}/%{name}.completion.sh %{buildroot}%{_sysconfdir}/bash_completion.d/%{name} +install -Dp -m0644 %{confdir}/%{name}.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/%{name} + +#overwrite config files with symlinks to /etc/katello +ln -svf %{_sysconfdir}/%{name}/katello.yml %{buildroot}%{homedir}/config/katello.yml +ln -svf %{_sysconfdir}/%{name}/database.yml %{buildroot}%{homedir}/config/database.yml +ln -svf %{_sysconfdir}/%{name}/prod_env.rb %{buildroot}%{homedir}/config/environments/production.rb +ln -svf %{_sysconfdir}/%{name}/dev_env.rb %{buildroot}%{homedir}/config/environments/development.rb + +#create symlinks for data +ln -sv %{_localstatedir}/log/%{name} %{buildroot}%{homedir}/log +ln -sv %{_tmppath} %{buildroot}%{homedir}/tmp +ln -sv %{datadir}/public-assets %{buildroot}%{homedir}/public/assets +ln -sv %{datadir}/public-compiled-stylesheets %{buildroot}%{homedir}/public/stylesheets/compiled + +#re-configure database to the /var/lib/katello directory +sed -Ei 's/\s*database:\s+db\/(.*)$/ database: \/var\/lib\/katello\/\1/g' %{buildroot}%{_sysconfdir}/%{name}/database.yml + +#remove files which are not needed in the homedir +rm -rf %{buildroot}%{homedir}/README +rm -rf %{buildroot}%{homedir}/LICENSE +rm -rf %{buildroot}%{homedir}/doc +rm -rf %{buildroot}%{homedir}/extras +rm -rf %{buildroot}%{homedir}/%{name}.spec + +#remove development tasks +rm %{buildroot}%{homedir}/lib/tasks/rcov.rake +rm %{buildroot}%{homedir}/lib/tasks/yard.rake + +#correct permissions +find %{buildroot}%{homedir} -type d -print0 | xargs -0 chmod 755 +find %{buildroot}%{homedir} -type f -print0 | xargs -0 chmod 644 +chmod +x %{buildroot}%{homedir}/script/* + +%clean +rm -rf %{buildroot} + +%post +%{homedir}/script/reset-oauth + +#Add /etc/rc*.d links for the script +/sbin/chkconfig --add %{name} + +%postun +if [ "$1" -ge "1" ] ; then + /sbin/service %{name} condrestart >/dev/null 2>&1 || : +fi + +%files +%defattr(-,root,root) +%doc README LICENSE doc/ +%config(noreplace) %{_sysconfdir}/%{name}/%{name}.yml +%config(noreplace) %{_sysconfdir}/%{name}/database.yml +%config(noreplace) %{_sysconfdir}/%{name}/prod_env.rb +%config(noreplace) %{_sysconfdir}/%{name}/dev_env.rb +%config(noreplace) %{_sysconfdir}/logrotate.d/%{name} +%config(noreplace) %{_sysconfdir}/sysconfig/%{name} +%{_initddir}/%{name} +%{_sysconfdir}/bash_completion.d/%{name} +%{homedir} + +%defattr(-, katello, katello) +%{_localstatedir}/log/%{name} +%{datadir} + +%pre +# Add the "katello" user and group +getent group %{name} >/dev/null || groupadd -r %{name} +getent passwd %{name} >/dev/null || \ + useradd -r -g %{name} -d %{homedir} -s /sbin/nologin -c "Katello" %{name} +exit 0 + +%preun +if [ $1 -eq 0 ] ; then + /sbin/service %{name} stop >/dev/null 2>&1 + /sbin/chkconfig --del %{name} +fi + +%changelog +* Tue Jun 14 2011 Mike McCune 0.1.46-1 +- initial changelog diff --git a/lib/http_resource.rb b/lib/http_resource.rb new file mode 100644 index 00000000000..4b94b840959 --- /dev/null +++ b/lib/http_resource.rb @@ -0,0 +1,165 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'rubygems' +require 'oauth' +require 'cgi' +require 'resource_permissions' + +class RestClientException < RuntimeError + attr_reader :service_code, :code + def initialize params + super params[:message] + @service_code = params[:service_code] + @code = params[:code] + end +end + +class RemoteServerException < RuntimeError +end + +class NetworkException < RuntimeError +end + +class HttpResource + + class_inheritable_accessor :consumer_secret, :consumer_key, :ca_cert_file, :prefix, :site, :default_headers, :resource_permissions + + attr_reader :json + + def initialize(json={}) + @json = json + end + + def [](key) + @json[key] + end + + def []=(key, value) + @json[key] = value + end + + class << self + def resource_permissions + ResourcePermissions + end + + def process_response(resp) + Rails.logger.debug "Processing response: #{resp.code}" + return resp unless resp.code.to_i >= 400 + parsed = {} + message = "Rest exception while processing the call" + service_code = "" + status_code = resp.code.to_s + begin + parsed = JSON.parse resp.body + message = parsed["displayMessage"] if parsed["displayMessage"] + service_code = parsed["code"] if parsed["code"] + rescue Exception => error + Rails.logger.error "Error parsing the body: " << error.backtrace.join("\n") + if ["404", "500", "502", "503", "504"].member? resp.code.to_s + Rails.logger.error "Remote server status code " << resp.code.to_s + raise RestClientException,{:message => error.to_s, :service_code => service_code, :code => status_code}, caller + else + raise NetworkException, [resp.code.to_s, resp.body].reject{|s| s.nil? or s.empty?}.join(' ') + end + end + raise RestClientException,{:message => message, :service_code => service_code, :code => status_code}, caller + end + + def get(a_path, headers={}) + Rails.logger.debug "Resource GET request: #{a_path}" + resource_permissions.before_get_callback(a_path, headers) + client = rest_client(Net::HTTP::Get, :get, a_path) + result = process_response(client.get(headers)) + resource_permissions.after_get_callback(a_path, headers, result) + result + end + + def post(a_path, payload={}, headers={}) + Rails.logger.debug "Resource POST request: #{a_path}, #{payload}" + resource_permissions.before_post_callback(a_path, payload, headers) + client = rest_client(Net::HTTP::Post, :post, a_path) + result = process_response(client.post(payload, headers)) + resource_permissions.after_post_callback(a_path, payload, headers, result) + result + end + + def put(a_path, payload={}, headers={}) + Rails.logger.debug "Resource PUT request: #{a_path}, #{payload}" + resource_permissions.before_put_callback(a_path, payload, headers) + client = rest_client(Net::HTTP::Put, :put, a_path) + result = process_response(client.put(payload, headers)) + resource_permissions.after_put_callback(a_path, payload, headers, result) + result + end + + def delete(a_path=nil, headers={}) + Rails.logger.debug "Resource DELETE request: #{a_path}" + Rails.logger.debug "Headers: #{headers.to_json}" + resource_permissions.before_delete_callback(a_path, headers) + client = rest_client(Net::HTTP::Delete, :delete, a_path) + result = process_response(client.delete(headers)) + Rails.logger.info "delete result: "+result + resource_permissions.after_delete_callback(a_path, headers, result) + result + end + + def join_path(*args) + args.inject("") do |so_far, current| + so_far << '/' if (!so_far.empty? && so_far[so_far.length-1].chr != '/') || current[0].chr != '/' + so_far << current.strip + end + end + + def create_thing(request_type) + request_type.new() + end + + # Creates a RestClient::Resource class with a signed OAuth style + # Authentication header added to the request headers. + def rest_client(http_type, method, path) + # Need full path to properly generate the signature + url = self.site + path + params = { :site => self.site, + :http_method => method, + :request_token_path => "", + :authorize_path => "", + :access_token_path => ""} + + params[:ca_file] = self.ca_cert_file unless self.ca_cert_file.nil? + # New OAuth consumer to setup signing the request + consumer = OAuth::Consumer.new(self.consumer_key, + self.consumer_secret, + params) + # The type is passed in, GET/POST/PUT/DELETE + request = http_type.new(url) + # Sign the request with OAuth + consumer.sign!(request) + # Extract the header and add it to the RestClient + added_header = {'Authorization' => request['Authorization']} + RestClient::Resource.new url, { + :headers => added_header, + :open_timeout => AppConfig.rest_client_timeout, + :timeout => AppConfig.rest_client_timeout + } + end + + # Encode url element if its not nil. This helper method is used mainly in resource path methods. + # + # @param [String] element to encode + # @return [String] encoded element or nil + def url_encode(element) + CGI::escape element.to_s unless element.nil? + end + end +end diff --git a/lib/ldap.rb b/lib/ldap.rb new file mode 100644 index 00000000000..ffb0eb4d2e4 --- /dev/null +++ b/lib/ldap.rb @@ -0,0 +1,35 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'net/ldap' + +module Ldap + def self.valid_ldap_authentication?(uid, password) + ldap = LdapConnection.new + ldap.bind? uid, password + end + + class LdapConnection + attr_reader :ldap, :host, :base + + def initialize(config={}) + @ldap = Net::LDAP.new + @ldap.host = @host = AppConfig.ldap.host + @base = AppConfig.ldap.base + end + + def bind?(uid=nil, password=nil) + @ldap.auth "uid=#{uid},#{@base}", password + @ldap.bind + end + end +end diff --git a/lib/queue.rb b/lib/queue.rb new file mode 100644 index 00000000000..485678c8602 --- /dev/null +++ b/lib/queue.rb @@ -0,0 +1,65 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'task' +# represents tasks queue for glue +class Queue + + attr_reader :items + STATUS = %w[ pending running failed completed rollbacked ] + + def initialize + @items = [] + end + + def create options + options[:status] ||= default_status + items << Task.new(options) + end + + def delete item + @items.delete item + end + + def find_by_name name + items.each {|task| return task if task.name == name} + end + + def all + items.sort + end + + def count + items.count + end + + def empty? + items.empty? + end + + def clear + @items = [] && true + end + + STATUS.each do |s| + define_method s do + all.delete_if {|t| t.status != s}.sort + end + end + + private + + def default_status + "pending" + end + +end diff --git a/lib/resource_permissions.rb b/lib/resource_permissions.rb new file mode 100644 index 00000000000..3bb16327ed3 --- /dev/null +++ b/lib/resource_permissions.rb @@ -0,0 +1,157 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'util/url_matcher' + +# Permission callback provider that are called before and after each HTTP call. +# It can be used for permission check (before) or creation (after). +# +# This implementation does nothing and is used when no provider is given. +# +class ResourcePermissions + class << self + def before_get_callback(a_path, headers={}) {} + end + + def after_get_callback(a_path, headers={}, result='') + end + + def before_post_callback(a_path, payload={}, headers={}) + end + + def after_post_callback(a_path, payload={}, headers={}, result='') + end + + def before_put_callback(a_path, payload={}, headers={}) + end + + def after_put_callback(a_path, payload={}, headers={}, result='') + end + + def before_delete_callback(a_path, headers={}) + end + + def after_delete_callback(a_path, headers={}, result='') + end + end +end + +# Permission callback provider that are called before and after each HTTP call. +# It can be used for permission check (before) or creation (after). +# +# This is the default provider allowing implementations to define sets of checks. +# +class DefaultResourcePermissions < ResourcePermissions + + class_inheritable_accessor :url_prefix + + # arrays of pairs pattern path + action proc + @@after_get_actions = [] + @@after_post_actions = [] + @@after_put_actions = [] + @@after_delete_actions = [] + @@before_get_actions = [] + @@before_post_actions = [] + @@before_put_actions = [] + @@before_delete_actions = [] + + class << self + def call_actions(actions, a_path, payload, result) + matched = false + actions.each do |regexp_action| + pattern = regexp_action[0] + action = regexp_action[1] + Rails.logger.debug "Checking permission rule #{a_path} == #{url_prefix}#{pattern}" + match = UrlMatcher.match a_path, url_prefix + pattern + if match[0] + if action.arity == 3 + action.call match, payload, result + elsif action.arity == 2 + action.call match, payload + else + raise 'Resource permission provider callback must have 2 or 3 parameters' + end + matched = true + end + end + matched + end + + def before_get_callback(a_path, headers) + was_called = call_actions @@before_get_actions, a_path, nil, nil + Rails.logger.warn "WARNING unprotected REST call: GET #{a_path}" unless was_called + end + + def after_get_callback(a_path, headers, result) + call_actions @@after_get_actions, a_path, nil, result + end + + def before_post_callback(a_path, payload, headers) + was_called = call_actions @@before_post_actions, a_path, payload, nil + Rails.logger.warn "WARNING unprotected REST call: POST #{a_path}" unless was_called + end + + def after_post_callback(a_path, payload, headers, result) + call_actions @@after_post_actions, a_path, payload, result + end + + def before_put_callback(a_path, payload, headers) + was_called = call_actions @@before_put_actions, a_path, payload, nil + Rails.logger.warn "WARNING unprotected REST call: PUT #{a_path}" unless was_called + end + + def after_put_callback(a_path, payload, headers, result) + call_actions @@after_put_actions, a_path, payload, result + end + + def before_delete_callback(a_path, headers) + was_called = call_actions @@before_delete_actions, a_path, nil, nil + Rails.logger.warn "WARNING unprotected REST call: DELETE #{a_path}" unless was_called + end + + def after_delete_callback(a_path, headers, result) + call_actions @@after_delete_actions, a_path, nil, result + end + + def after_get(for_path, &action) + @@after_get_actions << [for_path, action] + end + + def after_post(for_path, &action) + @@after_post_actions << [for_path, action] + end + + def after_put(for_path, &action) + @@after_put_actions << [for_path, action] + end + + def after_delete(for_path, &action) + @@after_delete_actions << [for_path, action] + end + + def before_get(for_path, &action) + @@before_get_actions << [for_path, action] + end + + def before_post(for_path, &action) + @@before_post_actions << [for_path, action] + end + + def before_put(for_path, &action) + @@before_put_actions << [for_path, action] + end + + def before_delete(for_path, &action) + @@before_delete_actions << [for_path, action] + end + end +end diff --git a/lib/resources/candlepin.rb b/lib/resources/candlepin.rb new file mode 100644 index 00000000000..1d9abeb5082 --- /dev/null +++ b/lib/resources/candlepin.rb @@ -0,0 +1,380 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'rubygems' +require 'rest_client' +require 'resource_permissions' +require 'http_resource' + +module Candlepin + + class Proxy + def self.post path, body + Rails.logger.debug "Sending POST request to Candlepin: #{path}" + client = CandlepinResource.rest_client(Net::HTTP::Post, :post, path_with_cp_prefix(path)) + client.post body, {:accept => :json, :content_type => :json}.merge(User.current.oauth_header) + end + + def self.delete path + Rails.logger.debug "Sending DELETE request to Candlepin: #{path}" + client = CandlepinResource.rest_client(Net::HTTP::Delete, :delete, path_with_cp_prefix(path)) + client.delete({:accept => :json, :content_type => :json}.merge(User.current.oauth_header)) + end + + def self.get path + Rails.logger.debug "Sending GET request to Candlepin: #{path}" + client = CandlepinResource.rest_client(Net::HTTP::Get, :get, path_with_cp_prefix(path)) + client.get({:accept => :json}.merge(User.current.oauth_header)) + end + + def self.path_with_cp_prefix path + CandlepinResource.prefix + path + end + + end + + class CandlepinResourcePermissions < ::DefaultResourcePermissions + # /candlepin by default + self.url_prefix = URI.parse(AppConfig.candlepin.url).path + + # POST /candlepin/owners/ - create new owner + after_post('/owners/') do |match, request, reply| + name = JSON.parse(reply)['key'] + verbs = [:create, :read, :update, :delete] + User.current.allow(verbs, :owner, "owner_#{name}") + end + + # DELETE /candlepin/owners/ - delete owner + before_delete('/owners/:name') do |match, request, reply| + name = match[1] + User.allowed_to_or_error?(:destroy, :owner, "owner_#{name}") + end + + after_delete('/owners/:name') do |match, request, reply| + name = match[1] + verbs = [:create, :read, :update, :delete] + User.current.disallow(verbs, :owner, "owner_#{name}") + end + end + + class CandlepinResource < ::HttpResource + cfg = AppConfig.candlepin + url = cfg.url + self.prefix = URI.parse(url).path + self.site = url.gsub(self.prefix, "") + self.consumer_secret = cfg.oauth_secret + self.consumer_key = cfg.oauth_key + self.ca_cert_file = cfg.ca_cert_file + self.resource_permissions = CandlepinResourcePermissions + + def self.default_headers + {'accept' => 'application/json', 'content-type' => 'application/json'}.merge(User.current.oauth_header) + end + end + + class CandlepinPing < CandlepinResource + class << self + def ping + response = get('/candlepin/status').body + JSON.parse(response).with_indifferent_access + end + end + end + + class Consumer < CandlepinResource + class << self + def export + response = Candlepin::CandlepinResource.get(join_path(path(), 'export'), {:accept => '*/*'}) + filename = response.headers[:content_disposition] == nil ? "tmp_#{rand}.zip" : response.headers[:content_disposition].split("filename=")[1] + File.open(filename, 'w') { |f| f.write(response) } + end + + def path(id=nil) + "/candlepin/consumers/#{url_encode id}" + end + + def get uuid + JSON.parse(super(path(uuid), self.default_headers).body).with_indifferent_access + end + + def create name, type, facts + attrs = {:name => name, :type => type, :facts => facts} + response = self.post(path(), attrs.to_json, self.default_headers).body + JSON.parse(response).with_indifferent_access + end + + def update uuid, facts + attrs = {:facts => facts} + response = self.put(path(uuid), attrs.to_json, self.default_headers).body + # consumer update doesn't return any data atm + # JSON.parse(response).with_indifferent_access + end + + def destroy uuid + self.delete(path(uuid), User.current.oauth_header).code.to_i + end + + def available_pools(uuid) + url = Pool.path() + "?consumer=#{uuid}" + response = Candlepin::CandlepinResource.get(url,self.default_headers).body + JSON.parse(response) + end + + + def regenerate_identity_certificates uuid + response = self.post(path(uuid), {}, self.default_headers).body + JSON.parse(response).with_indifferent_access + end + + def entitlements uuid + response = Candlepin::CandlepinResource.get(join_path(path(uuid), 'entitlements'), self.default_headers).body + JSON.parse(response).collect { |e| e.with_indifferent_access } + end + + def consume_entitlement uuid, pool, quantity = nil + uri = join_path(path(uuid), 'entitlements') + "?pool=#{pool}" + uri += "&quantity=#{quantity}" if quantity + self.post(uri, "", self.default_headers).body + end + + def remove_entitlement uuid, ent_id + uri = join_path(path(uuid), 'entitlements') + "/#{ent_id}" + self.delete(uri, self.default_headers).code.to_i + end + end + end + + class Owner < CandlepinResource + + class << self + def name_to_key a_name + a_name.tr(' ', '_') + end + + # Set the contentPrefic at creation time so that the client will get + # content only for the org it has been subscribed to + def create key, description + attrs = {:key => key, :displayName => description, :contentPrefix => "/#{key}/$env/"} + owner_json = self.post(path(), attrs.to_json, self.default_headers).body + JSON.parse(owner_json).with_indifferent_access + end + + def create_user key, username, password + attrs = {:username => name_to_key(username), :password => name_to_key(password), :superAdmin => true} + self.post(join_path(path(key), 'users'), attrs.to_json, self.default_headers).body + end + + def destroy key + self.delete(path(key), { 'cp-user' => 'admin' }).code.to_i + end + + def find key + owner_json = self.get(path(key), {'cp-user' => 'admin', 'accept' => 'application/json'}).body + JSON.parse(owner_json).with_indifferent_access + end + + def update key, organization + owner = find key + owner['displayName'] = organization.name + if organization.parent_id + owner['parentOwner'] ||= {} + owner['parentOwner']['id'] = organization.parent_id + end + self.put(path(key), JSON.generate(owner), self.default_headers).body + end + + def import organization_name, path_to_file + self.post(join_path(path(organization_name), 'imports'), + {:import => File.new(path_to_file, 'rb')}, + self.default_headers) + end + + def pools key + if key + jsonStr = self.get(join_path(path(key), 'pools'), self.default_headers).body + else + jsonStr = self.get(join_path('candlepin', 'pools'), self.default_headers).body + end + JSON.parse(jsonStr).collect {|p| p.with_indifferent_access } + end + + def path(id=nil) + "/candlepin/owners/#{url_encode id}" + end + end + end + + class Pool < CandlepinResource + class << self + def get pool_id + pool_json = super(path(pool_id), self.default_headers).body + JSON.parse(pool_json).with_indifferent_access + end + + def path(id=nil) + "/candlepin/pools/#{url_encode id}" + end + end + end + + class Content < CandlepinResource + class << self + def create attrs + JSON.parse(self.post(path(), JSON.generate(attrs), self.default_headers).body).with_indifferent_access + end + + def get id=nil + content_json = super(path(id), self.default_headers).body + JSON.parse(content_json).with_indifferent_access + end + + def destroy id + raise ArgumentError, "content id has to be specified" unless id + self.delete(path(id), self.default_headers).code.to_i + end + + def path(id=nil) + "/candlepin/content/#{url_encode id}" + end + end + end + + class Subscription < CandlepinResource + class << self + + def destroy subscription_id + raise ArgumentError, "subscription id has to be specified" unless subscription_id + self.delete(path(subscription_id), self.default_headers).code.to_i + end + + def get id=nil + content_json = super(path(id), self.default_headers).body + content = JSON.parse(content_json) + end + + def create_for_owner owner_key, attrs + subscription = self.post("/candlepin/owners/#{owner_key}/subscriptions", attrs.to_json, self.default_headers).body + self.put("/candlepin/owners/#{owner_key}/subscriptions", {}.to_json, self.default_headers).body + subscription + end + + def get_for_owner owner_key + content_json = Candlepin::CandlepinResource.get("/candlepin/owners/#{owner_key}/subscriptions", self.default_headers).body + content = JSON.parse(content_json) + end + + def refresh_for_owner owner_key + self.put("/candlepin/owners/#{owner_key}/subscriptions", {}.to_json, self.default_headers).body + end + + def path(id=nil) + "/candlepin/subscriptions/#{url_encode id}" + end + end + end + + class Product < CandlepinResource + class << self + def create attr + JSON.parse(self.post(path(), attr.to_json, self.default_headers).body).with_indifferent_access + end + + def get id=nil + products_json = super(path(id), self.default_headers).body + products = JSON.parse(products_json) + products = [products] unless id.nil? + products.collect {|p| p.with_indifferent_access } + end + + + def _certificate_and_key id + subscriptions_json = Candlepin::CandlepinResource.get('/candlepin/subscriptions', self.default_headers).body + subscriptions = JSON.parse(subscriptions_json) + + for sub in subscriptions + if sub["product"]["id"] == id + return sub["certificate"] + end + + for provProds in sub["providedProducts"] + if provProds["id"] == id + return sub["certificate"] + end + end + end + nil + end + + def certificate id + self._certificate_and_key(id)["cert"] + end + + def key id + self._certificate_and_key(id)["key"] + end + + def destroy product_id + raise ArgumentError, "product id has to be specified" unless product_id + self.delete(path(product_id), self.default_headers).code.to_i + end + + def add_content product_id, content_id, enabled + self.post(join_path(path(product_id), "content/#{url_encode content_id}?enabled=#{enabled}"), nil, self.default_headers).code.to_i + end + + def create_unlimited_subscription owner_key, product_id + start_date ||= Date.today + # End it 100 years from now + end_date ||= start_date + 10950 + + subscription = { + 'startDate' => start_date, + 'endDate' => end_date, + 'quantity' => -1, + 'accountNumber' => '', + 'product' => { 'id' => product_id }, + 'providedProducts' => [], + 'contractNumber' => '' + } + Candlepin::Subscription.create_for_owner owner_key, subscription + end + + def delete_subscriptions owner_key, product_id + subscriptions = Candlepin::Subscription.get_for_owner owner_key + subscriptions.collect {|s| + Rails.logger.info "subsc: "+s.to_json + if s['product']['id'] == product_id + Candlepin::Subscription.destroy s['id'] + end + Candlepin::Subscription.refresh_for_owner owner_key + } + end + + def path(id=nil) + "/candlepin/products/#{url_encode id}" + end + end + end + + class Entitlement < CandlepinResource + class << self + def regenerate_entitlement_certificates_for_product(product_id) + self.put("/candlepin/entitlements/product/#{url_encode product_id}", nil, self.default_headers).code.to_i + end + + def path(id=nil) + "/candlepin/entitlements/#{url_encode id}" + end + end + end + +end diff --git a/lib/resources/foreman.rb b/lib/resources/foreman.rb new file mode 100644 index 00000000000..80100c7f40b --- /dev/null +++ b/lib/resources/foreman.rb @@ -0,0 +1,155 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'rubygems' +require 'rest_client' +require 'cgi' +require 'http_resource' + +module Foreman + + module REST + def get + JSON.parse(super(path(), :accept => :json).body) + end + end + + class ForemanResource + attr_reader :url, :username, :password + + def initialize options = {} + @url = AppConfig.foreman.url || raise("no foreman url was given") + @username = AppConfig.foreman.username || raise("no foreman username was given") + @password = AppConfig.foreman.password || raise("no foreman password was given") + + @resource = RestClient::Resource.new url, username, password + end + + def get(path, headers={}) + @resource[path].get headers + end + + def post(path, params = {}) + @resource[path].post headers + end + + def opts + {:url => url, :username => username, :password => password} + end + + # Encode url element if its not nil. This helper method is used mainly in resource path methods. + # + # @param [String] element to encode + # @return [String] encoded element or nil + def url_encode(element) + CGI::escape element unless element.nil? + end + end + + class Host < ForemanResource + include Foreman::REST + attr_reader :uuid + + def initialize options = {} + super options + # if no uuid is assign, we return all uuid's + @uuid = options[:uuid] + end + + def list + get.collect do |uuid| + Host.new(opts.merge({:uuid => uuid})) + end + end + + def path + "/hosts" + end + + end + + class Facts < ForemanResource + include Foreman::REST + attr_reader :uuid, :values + + def initialize options = {} + super options + @uuid = options[:uuid] + raise "no uuid was given" unless @uuid + @values = get[uuid] + end + + def [](key) + @values[key] + end + + def path + "/hosts/#{uuid}/facts" + end + + end + + class Environment < ForemanResource + include Foreman::REST + attr_reader :name + + def initialize options = {} + super options + @name = options[:name] + end + + def list + get.collect do |json| + json["environment"]["name"] + end + end + + def nodes + return nil unless name + get["environment"]["hosts"].collect do |json| + Host.new(opts.merge({:uuid => json["name"]})) + end + end + + def path + "/environments/#{url_encode name}" + end + end + + class Puppetclass < ForemanResource + include Foreman::REST + attr_reader :name, :id, :module + + def initialize(options = {}) + super(options) + @name = options[:name] + @module = options[:module] + @id = options[:id] + end + + # returns a hash of modules and their respective classes + def list + hash = {} + get.each_pair do |pmodule, pclasses| + hash[pmodule] = pclasses.collect do |klass| + {:module => pmodule, :name => klass["puppetclass"]["name"], :id => klass["puppetclass"]["id"]} + end + end + return hash + end + + def path + "/puppetclasses/#{url_encode name}" + end + end + +end diff --git a/lib/resources/pulp.rb b/lib/resources/pulp.rb new file mode 100644 index 00000000000..ec5ab66d2ae --- /dev/null +++ b/lib/resources/pulp.rb @@ -0,0 +1,246 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +require 'rubygems' +require 'rest_client' +require 'http_resource' + +module Pulp + + class Proxy + def self.post request + Rails.logger.debug "Sending POST request to Pulp: #{request.fullpath}" + Proxy.resource[request.fullpath].post request.body, :accept => :json, :content_type => :json + end + + def self.delete request + Rails.logger.debug "Sending DELETE request to Pulp: #{request.fullpath}" + Proxy.resource[request.fullpath].delete + end + + def self.get request + # Force the / at the end + path = request.fullpath + "/" + Rails.logger.debug "Sending GET request to Pulp: #{request.fullpath}" + ret = Proxy.resource[path].get :accept => :json + end + + def self.resource + cfg = AppConfig.pulp + RestClient::Resource.new(cfg.url, cfg.username, cfg.password) + end + end + + class PulpResource < HttpResource + cfg = AppConfig.pulp + url = cfg.url + self.site = url.gsub(URI.parse(url).path, "") + self.consumer_secret = cfg.oauth_secret + self.consumer_key = cfg.oauth_key + self.ca_cert_file = cfg.ca_cert_file + self.default_headers = {'pulp-user' => 'admin', + 'accept' => 'application/json', + 'content-type' => 'application/json'} + end + + class PulpPing < PulpResource + class << self + def ping + # For now we have to query repositories because there is no + # URL that is available in Pulp that returns something small + # but requires authentication. Please do not change this to + # /pulp/api/services/status/ because that path does *not* require + # auth and will not accurately report if Katello can talk + # to Pulp using OAuth. + response = get('/pulp/api/users/', self.default_headers).body + JSON.parse(response) + end + end + end + + class Package < PulpResource + + class << self + def find package_id + response = get(package_path + package_id + "/", self.default_headers) + JSON.parse(response.body).with_indifferent_access + end + + # Get all the Repositories known by Pulp + def all + response = get(package_path, self.default_headers).body + JSON.parse(response) + end + + def find id + response = get(package_path + id + "/", self.default_headers).body + JSON.parse(response) + end + + def package_path + "/pulp/api/packages/" + end + + def dep_solve pkgnames, repoids + path = "/pulp/api/services/dependencies/" + response = post(path, JSON.generate({:pkgnames=>pkgnames, :repoids=>repoids}), self.default_headers) + JSON.parse(response)["available_packages"] + end + + + end + end + + class Errata < PulpResource + + class << self + def find errata_id + response = get(errata_path + errata_id + "/", self.default_headers) + JSON.parse(response.body).with_indifferent_access + end + + def errata_path + "/pulp/api/errata/" + end + end + end + + class Distribution < PulpResource + + class << self + def find dist_id + response = get(dist_path + dist_id + "/", self.default_headers) + JSON.parse(response.body).with_indifferent_access + end + + def dist_path + "/pulp/api/distribution/" + end + end + end + + class Repository < PulpResource + class << self + + def clone_repo from_repo, to_repo, feed = "parent" #clone is a built in method, hence redundant name + data = {:clone_id => to_repo.id, :feed =>feed, :clone_name => "clone:#{to_repo.name}", :groupid=>to_repo.groupid} + path = Repository.repository_path + from_repo.id + "/clone/" + post(path, JSON.generate(data), self.default_headers).body + nil #it seems that pulp can be slow to update repos + end + + def find repo_id, yell_on_404 = false + response = get(repository_path + repo_id + "/", self.default_headers) + body = response.body + JSON.parse(body).with_indifferent_access + rescue RestClientException => e + return nil if e.code.to_i == 404 && !yell_on_404 + raise e + end + + # Get all the Repositories known by Pulp + def all groupids=nil + custom = self.repository_path + if groupids + custom += "?" + groupids.collect{|id| "groupid=#{url_encode(id)}"}.join("&") + end + response = get(custom , self.default_headers) + body = response.body + JSON.parse(body) + rescue RestClientException => e + return nil if e.code.to_i == 404 && !yell_on_404 + raise e + end + + def repository_path + "/pulp/api/repositories/" + end + + # :id, :name, :arch, :groupid, :feed + def create attrs + body = put(Repository.repository_path, JSON.generate(attrs), self.default_headers).body + JSON.parse(body).with_indifferent_access + end + + # :id, :name, :arch, :groupid, :feed + def update repo_id, attrs + body = put(Repository.repository_path + repo_id +"/", JSON.generate(attrs), self.default_headers).body + find repo_id + end + + def add_packages repo_id, pkg_id_list + body = post(Repository.repository_path + repo_id +"/add_package/", {:packageid=>pkg_id_list}.to_json, self.default_headers).body + end + + def destroy repo_id + raise ArgumentError, "repo id has to be specified" unless repo_id + self.delete(repository_path + repo_id + "/", self.default_headers).code.to_i + end + + def sync (repo_id, data = {}) + path = Repository.repository_path + repo_id + "/sync/" + response = post(path, JSON.generate(data), self.default_headers) + JSON.parse(response.body).with_indifferent_access + end + + def sync_history repo_id + begin + response = get(Repository.repository_path + repo_id + "/sync/", self.default_headers) + json_history = JSON.parse(response.body) + json_history.collect {|jh| jh.with_indifferent_access } + rescue RestClient::ResourceNotFound => error + # Return nothing if there is a 404 which indicates there + # is no sync status for this repo. Not an error. + return + end + end + + def cancel(repo_id, sync_id) + path = Repository.repository_path + repo_id + "/sync/" + sync_id + "/" + response = delete(path, self.default_headers) + #JSON.parse(response.body).with_indifferent_access + end + + def sync_status(repo_id, sync_id) + path = Repository.repository_path + repo_id + "/sync/" + sync_id + "/" + response = get(path, self.default_headers) + JSON.parse(response.body).with_indifferent_access + end + + def destroy repo_id + raise ArgumentError, "repository id has to be specified" unless repo_id + path = Repository.repository_path + repo_id +"/" + self.delete(path, self.default_headers).code.to_i + end + + def packages repo_id + response = get(repository_path + repo_id + "/packages/", self.default_headers) + body = response.body + JSON.parse(body) + end + + def errata repo_id + response = get(repository_path + repo_id + "/errata/", self.default_headers) + body = response.body + JSON.parse(body) + end + + def distributions repo_id + response = get(repository_path + repo_id + "/distribution/", self.default_headers) + body = response.body + JSON.parse(body) + end + + end + end + +end diff --git a/lib/task.rb b/lib/task.rb new file mode 100644 index 00000000000..17f69f89b1e --- /dev/null +++ b/lib/task.rb @@ -0,0 +1,46 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +class Task + attr_reader :name, :status, :priority, :action, :timestamp + + def initialize opts + @name = opts[:name] + @status = opts[:status] + @priority = opts[:priority] || 0 + @action = opts[:action] + update_ts + end + + def status=s + if Queue::STATUS.include?(s) + update_ts + @status = s + else + raise "invalid STATE #{s}" + end + end + + def to_s + "#{name}\t #{priority}\t #{status}\t #{action}" + end + + private + def update_ts + @timestamp = Time.now + end + + # sort based on priority + def <=> other + self.priority <=> other.priority + end +end \ No newline at end of file diff --git a/lib/tasks/.gitkeep b/lib/tasks/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/lib/tasks/configuration.rake b/lib/tasks/configuration.rake new file mode 100644 index 00000000000..3b86f9518c1 --- /dev/null +++ b/lib/tasks/configuration.rake @@ -0,0 +1,6 @@ +desc "Create config files based on sample ones" +task :configuration do + Dir.entries('config/').select { |f| f =~ /.+-sample.+/ }.each do |f| + cp "config/#{f}", "config/#{f[/(.+)-sample.yml/, 1]}.yml" + end +end \ No newline at end of file diff --git a/lib/tasks/hudson.rake b/lib/tasks/hudson.rake new file mode 100644 index 00000000000..192cce42543 --- /dev/null +++ b/lib/tasks/hudson.rake @@ -0,0 +1,15 @@ +# Add your own tasks in files placed in lib/tasks ending in .rake, +# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake. +namespace :hudson do + task :spec => ["rake:configuration", "hudson:setup:rspec", 'rake:spec'] + + namespace :setup do + task :pre_ci do + ENV["CI_REPORTS"] = 'hudson/reports/spec/' + gem 'ci_reporter' + require 'ci/reporter/rake/rspec' + end + task :rspec => [:pre_ci, "ci:setup:rspec"] + end +end + diff --git a/lib/tasks/pretty_routes.rake b/lib/tasks/pretty_routes.rake new file mode 100644 index 00000000000..42e6d0da0aa --- /dev/null +++ b/lib/tasks/pretty_routes.rake @@ -0,0 +1,25 @@ +desc 'Pretty print out all defined routes in match order, with names. Target specific controller with CONTROLLER=x.' + +task :pretty_routes => :environment do + all_routes = ENV['CONTROLLER'] ? ActionController::Routing::Routes.routes.select { |route| route.defaults[:controller] == ENV['CONTROLLER'] } : ActionController::Routing::Routes.routes + routes = all_routes.collect do |route| + reqs = route.requirements.empty? ? "" : route.requirements[:controller] + '#' + route.requirements[:action] + {:name => route.name, :verb => route.verb, :path => route.path, :reqs => reqs} + end + if ENV['TEXT'] + File.open(File.join(RAILS_ROOT, "routes.txt"), "w") do |f| + routes.each do |r| + f.puts [r[:name], r[:verb], r[:path], r[:reqs]].compact.join(' | ') + end + end + else + File.open(File.join(RAILS_ROOT, "routes.html"), "w") do |f| + f.puts "Rails 3 Routes" + f.puts "" + routes.each do |r| + f.puts "" + end + f.puts "
NameVerbPathRequirements
#{r[:name]}#{r[:verb]}#{r[:path]}#{r[:reqs]}
" + end + end +end diff --git a/lib/tasks/rcov.rake b/lib/tasks/rcov.rake new file mode 100644 index 00000000000..52db46c093c --- /dev/null +++ b/lib/tasks/rcov.rake @@ -0,0 +1,8 @@ +desc "Run all specs with rcov" + +if Rails.env == 'test' || Rails.env == 'development' + RSpec::Core::RakeTask.new("rcov") do |t| + t.rcov = true + t.rcov_opts = %w{--rails --include views -Ispec --exclude gems\/,spec\/,features\/,seeds\/,usr\/,lib\/} + end +end diff --git a/lib/tasks/sass.rake b/lib/tasks/sass.rake new file mode 100644 index 00000000000..ca2274b40a0 --- /dev/null +++ b/lib/tasks/sass.rake @@ -0,0 +1,6 @@ +desc 'Updates stylesheets if necessary from their Sass templates.' +namespace :sass do + task :update => :environment do + Sass::Plugin.update_stylesheets + end +end diff --git a/lib/tasks/setup-check.rake b/lib/tasks/setup-check.rake new file mode 100644 index 00000000000..1c4daca0a09 --- /dev/null +++ b/lib/tasks/setup-check.rake @@ -0,0 +1,5 @@ +desc "Run development setup check script" + +task :check_setup do + sh %(../scripts/devsetup/check_setup.py) +end diff --git a/lib/tasks/setup.rake b/lib/tasks/setup.rake new file mode 100644 index 00000000000..9e13d613dae --- /dev/null +++ b/lib/tasks/setup.rake @@ -0,0 +1,4 @@ +#task to perform steps required for katello to work +task :setup => ["db:migrate:reset", "db:seed"] do + puts "Database sucessfully recreated in #{Rails.env}" +end diff --git a/lib/tasks/yard.rake b/lib/tasks/yard.rake new file mode 100644 index 00000000000..70c2b483324 --- /dev/null +++ b/lib/tasks/yard.rake @@ -0,0 +1,5 @@ +YARD::Rake::YardocTask.new do |t| + t.files = ['app/**/*.rb' ] # optional + t.options = ['--output-dir=yard'] +end + diff --git a/lib/util/model_util.rb b/lib/util/model_util.rb new file mode 100644 index 00000000000..9615d4c1c46 --- /dev/null +++ b/lib/util/model_util.rb @@ -0,0 +1,37 @@ +# +# Copyright © 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public License, +# version 2 (GPLv2). There is NO WARRANTY for this software, express or +# implied, including the implied warranties of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2 +# along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +# +# Red Hat trademarks are not licensed under GPLv2. No permission is +# granted to use or replicate Red Hat trademarks that are incorporated +# in this software or its documentation. + +module Katello + module ModelUtils + + @@table_to_model_hash = nil + + # hash in the form of "table_name" => ModelClass + def self.table_to_model_hash + return @@table_to_model_hash if @@table_to_model_hash + + # explicitly load all available model classes + Dir.foreach("#{Rails.root}/app/models") { |f| require f if f =~ /.*\.[rR][bB]/ } + + # create the hash + table_to_model_hash = Hash[ActiveRecord::Base.send(:descendants).collect{|c| [c.table_name, c]}] + + # in production mode we cache this + @@table_to_model_hash = table_to_model_hash if Rails.env.production? + + # return generated hash + table_to_model_hash + end + end +end diff --git a/lib/util/threadsession.rb b/lib/util/threadsession.rb new file mode 100644 index 00000000000..e00f99b46ca --- /dev/null +++ b/lib/util/threadsession.rb @@ -0,0 +1,87 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +# +# In several cases we want to break chain of responsibility in MVC a bit and provide +# a safe way to access current user (and maybe few more data items). Storing it as +# a global variable (or class member) is not thread-safe. Including ThreadSession:: +# UserModel in models and ThreadSession::Controller in the application controller +# allows this without any concurrent issues. +# +# Idea taken from sentinent_user rails plugin. +# +# http://github.com/bokmann/sentient_user +# http://github.com/astrails/let_my_controller_go +# http://rails-bestpractices.com/posts/47-fetch-current-user-in-models +# + +module Katello + module ThreadSession + + # include this in the User model + module UserModel + def self.included(base) + base.class_eval do + def self.current + Thread.current[:user] + end + + def self.current=(o) + unless (o.nil? || o.is_a?(self) || o.class.name == 'RSpec::Mocks::Mock') + raise(ArgumentError, "Unable to set current User, expected class '#{self}', got #{o.inspect}") + end + Rails.logger.debug "Setting current user thread-local variable to " + (o.is_a?(User) ? o.username : 'nil') + Thread.current[:user] = o + end + + # Executes given block on behalf of a different user. Example: + # + # User.as :admin do + # ... + # end + # + # Use with care! + # + # @param [String] username to find from the database + # @param [block] block to execute + def self.as(username, &do_block) + old_user = current + self.current = User.find_by_username(username) + do_block.call + self.current = old_user + end + end + end + end + + # include this in the application controller + module Controller + def self.included(base) + base.class_eval do + around_filter :thread_locals + end + end + + def thread_locals + u = current_user + User.current = u + yield + # reset the current user just for the case + User.current = nil + rescue => exception + # reset the current user just for the case + User.current = nil + raise + end + end + end +end diff --git a/lib/util/url_matcher.rb b/lib/util/url_matcher.rb new file mode 100644 index 00000000000..6c977cf35a2 --- /dev/null +++ b/lib/util/url_matcher.rb @@ -0,0 +1,104 @@ +# +# Copyright 2011 Red Hat, Inc. +# +# This software is licensed to you under the GNU General Public +# License as published by the Free Software Foundation; either version +# 2 of the License (GPLv2) or (at your option) any later version. +# There is NO WARRANTY for this software, express or implied, +# including the implied warranties of MERCHANTABILITY, +# NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should +# have received a copy of GPLv2 along with this software; if not, see +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + +# +# Finds a route definition that matches a path +# +# ===== Arguments +# * path: actual path to match +# * routes: array of 'routes' +# +# ===== Returns +# Array of two elements: +# +# * index 0: first matching route +# * index 1..n: values for the matched route's variables (in the order they were specified in the route) +# +# ===== Examples +# +# UrlMatcher.match('/foo', ['/', '/foo', '/bar/baz']) #=> ['/foo'] +# UrlMatcher.match('/80/07/01', ['/:year/:month/:day']) #=> ['/80/07/01', '80', '07', '01'] +# + +require 'pathname' + +module UrlMatcher + + def self.match(path, routes) + path = Path.new(path) + patterns = routes.map {|route| Pattern.new(Array(route).first) } + + patterns.each do |pattern| + return [pattern.to_s] + pattern.vars if pattern == path + end + + [nil] + end + + class Path + attr_accessor :parts, :ext + + def initialize(path) + self.parts, self.ext = split_path(path) + end + + def to_s + '/' + self.parts.join('/') + self.ext + end + + private + def split_path(path) + path = path.to_s + ext = Pathname(path).extname + path = path.sub(/#{ext}$/,'') + parts = path.split('/').reject {|part| part.empty? } + [parts, ext] + end + end + + class Pattern < Path + + def variables + return [] unless @match + + a = [] + self.parts.each_with_index do |part,i| + a << @match.parts[i] if part[0] == ?: + end + a << @match.ext[1..-1] if self.ext[1] == ?: + a + end + alias :vars :variables + + def ==(path) + is_match = size_match?(path) && ext_match?(path) && static_match?(path) + @match = path if is_match + is_match + end + + private + def size_match?(path) + self.parts.size == path.parts.size + end + + def ext_match?(path) + (self.ext == path.ext) || (self.ext[1] == ?: && !path.ext.empty?) + end + + def static_match?(path) + self.parts.each_with_index do |part,i| + return false unless part[0] == ?: || path.parts[i] == part + end + true + end + end +end diff --git a/locale/app.pot b/locale/app.pot new file mode 100644 index 00000000000..8791224e237 --- /dev/null +++ b/locale/app.pot @@ -0,0 +1,1190 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2011-06-01 15:16-0600\n" +"PO-Revision-Date: 2011-01-06 17:37-0700\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: app/views/layouts/_footer.haml:7 +msgid " Red Hat, Inc." +msgstr "" + +#: app/controllers/users_controller.rb:52 +msgid " created successfully." +msgstr "" + +#: app/models/kp_environment.rb:38 +msgid " environment cannot be set to an environment already on its path" +msgstr "" + +#: app/helpers/translation_helper.rb:15 +msgid "%{relative_time} ago" +msgstr "" + +#: app/views/common/_panel.html.haml:39 +msgid "+ New " +msgstr "" + +#: app/views/products/index.haml:4 +msgid "Actions" +msgstr "" + +#: app/views/promotions/_packages.html.haml:14 +#: app/views/promotions/_products.html.haml:11 +#: app/views/promotions/_errata.html.haml:13 +msgid "Add" +msgstr "" + +#: app/views/organizations/_edit.html.haml:36 +msgid "Add New Environment" +msgstr "" + +#: app/views/roles/_edit.html.haml:20 +msgid "Add Permission" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:23 +msgid "Add Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:85 +msgid "Add Repository" +msgstr "" + +#: app/views/operations/index.html.haml:2 config/navigation.rb:84 +msgid "Administration" +msgstr "" + +#: app/views/roles/_permission.html.haml:23 +#: app/views/roles/_permission.html.haml:33 +#: app/views/roles/_closed_permission.html.haml:11 +#: app/views/roles/_closed_permission.html.haml:18 +msgid "All" +msgstr "" + +#: app/helpers/promotions_helper.rb:33 +#: app/views/promotions/_detail.html.haml:8 +msgid "All Errata" +msgstr "" + +#: app/views/sync_schedules/index.html.haml:12 +msgid "Apply Selected Plans to Selected Products" +msgstr "" + +#: app/views/systems/_edit.html.haml:41 +#: app/views/systems/_packages.html.haml:8 +msgid "Arch" +msgstr "" + +#: app/views/packages/_show.html.haml:25 +msgid "Architecture" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +#: app/views/sync_plans/_edit.html.haml:28 +#: app/views/organizations/_edit.html.haml:38 +#: app/views/environments/_edit.html.haml:29 +#: app/views/roles/_edit.html.haml:24 app/views/notices/show.html.haml:37 +#: app/views/common/_common_i18n.html.haml:3 +#: app/views/users/_edit.html.haml:50 +msgid "Are you sure?" +msgstr "" + +#: app/views/errata/_show.html.haml:39 +msgid "Associated Bugs" +msgstr "" + +#: app/views/promotions/show.html.haml:59 +msgid "Available Content" +msgstr "" + +#: app/views/common/403.html.haml:7 +msgid "Back" +msgstr "" + +#: config/navigation.rb:27 +msgid "Basics" +msgstr "" + +#: app/views/packages/_show.html.haml:70 +msgid "Build Date" +msgstr "" + +#: app/views/packages/_show.html.haml:64 +msgid "Build Host" +msgstr "" + +#: app/controllers/api/environments_controller.rb:38 +msgid "Can't update locker environment" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:24 +#: app/views/providers/_products_repos.html.haml:59 +#: app/views/providers/_products_repos.html.haml:103 +#: app/views/providers/_edit_product.html.haml:34 +#: app/views/roles/_permission.html.haml:42 +#: app/views/sync_management/index.html.haml:3 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Cancel" +msgstr "" + +#: app/views/users/_edit.html.haml:23 +msgid "Change Password" +msgstr "" + +#: app/views/packages/_changelog.html.haml:9 config/navigation.rb:45 +msgid "Changelog" +msgstr "" + +#: config/navigation.rb:53 +msgid "Changeset History" +msgstr "" + +#: app/views/changesets/_changeset.html.haml:21 +msgid "Changeset Summary" +msgstr "" + +#: app/controllers/changesets_controller.rb:27 +msgid "Changeset storage errors" +msgstr "" + +#: app/controllers/changesets_controller.rb:37 +msgid "Changesets" +msgstr "" + +#: app/views/systems/_edit.html.haml:54 +msgid "Checked In" +msgstr "" + +#: app/views/users/_edit.html.haml:20 +msgid "Clear" +msgstr "" + +#: app/views/users/_edit.html.haml:17 +msgid "Clear Disabled Helptips" +msgstr "" + +#: app/controllers/users_controller.rb:103 +msgid "Cleared" +msgstr "" + +#: app/views/common/_panel.html.haml:7 +msgid "Click New to create a new" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:21 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Click to edit" +msgstr "" + +#: app/views/promotions/show.html.haml:51 app/views/common/_panel.html.haml:17 +#: app/views/common/_panel.html.haml:26 +msgid "Close" +msgstr "" + +#: app/views/common/_env_select.html.haml:7 +msgid "Collapse" +msgstr "" + +#: app/views/users/_edit.html.haml:30 app/views/users/_new.html.haml:19 +msgid "Confirm" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:22 +msgid "Consumed Subscriptions" +msgstr "" + +#: app/helpers/promotions_helper.rb:31 app/views/content/index.html.haml:1 +msgid "Content" +msgstr "" + +#: config/navigation.rb:22 +msgid "Content Management" +msgstr "" + +#: app/views/layouts/_footer.haml:7 +msgid "Copyright © " +msgstr "" + +#: app/views/environments/_new.html.haml:24 config/navigation.rb:24 +msgid "Create" +msgstr "" + +#: app/views/environments/_new.html.haml:2 +msgid "Create Environment" +msgstr "" + +#: app/views/notices/show.html.haml:19 +msgid "Created" +msgstr "" + +#: app/views/promotions/show.html.haml:40 +msgid "Current Changeset" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:18 +msgid "Current Subscriptions" +msgstr "" + +#: app/views/dashboard/index.html.haml:2 config/navigation.rb:8 +msgid "Dashboard" +msgstr "" + +#: app/views/notices/show.html.haml:37 +msgid "Delete All" +msgstr "" + +#: app/views/packages/_dependencies.html.haml:12 +#: app/views/changesets/_changeset.html.haml:45 config/navigation.rb:44 +msgid "Dependencies" +msgstr "" + +#: app/views/providers/_edit.html.haml:19 +#: app/views/providers/_form.html.haml:12 +#: app/views/providers/_products_repos.html.haml:34 +#: app/views/providers/_edit_product.html.haml:12 +#: app/views/sync_plans/_edit.html.haml:13 +#: app/views/sync_plans/_form.html.haml:10 +#: app/views/organizations/_edit.html.haml:12 +#: app/views/organizations/_new.html.haml:12 +#: app/views/environments/_edit.html.haml:18 +#: app/views/environments/_new.html.haml:14 +#: app/views/systems/_edit.html.haml:29 app/views/packages/_show.html.haml:19 +#: app/views/notices/show.html.haml:23 app/views/errata/_show.html.haml:45 +msgid "Description" +msgstr "" + +#: app/views/changesets/_edit.html.haml:9 config/navigation.rb:43 +#: config/navigation.rb:49 +msgid "Details" +msgstr "" + +#: app/controllers/users_controller.rb:102 +msgid "Disabled help tips have been re-enabled." +msgstr "" + +#: app/views/packages/_show.html.haml:89 +msgid "Download" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:3 +msgid "Edit Product" +msgstr "" + +#: app/views/providers/_edit.html.haml:4 +msgid "Edit Provider" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:3 +msgid "Edit Repository" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:5 +msgid "Edit Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:2 +msgid "Edit User" +msgstr "" + +#: app/views/users/_edit.html.haml:12 +msgid "Enable inline help" +msgstr "" + +#: app/views/environments/_edit.html.haml:6 +msgid "Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:16 +msgid "Environment Promotion Paths" +msgstr "" + +#: app/models/kp_environment.rb:15 +msgid "Environment cannot be in its own promotion path" +msgstr "" + +#: app/helpers/promotions_helper.rb:49 +#: app/views/promotions/_detail.html.haml:18 +#: app/views/changesets/_edit.html.haml:33 +#: app/views/changesets/_changeset.html.haml:30 +msgid "Errata" +msgstr "" + +#: app/views/sync_management/index.html.haml:3 +msgid "Error" +msgstr "" + +#: app/controllers/sync_management_controller.rb:25 +msgid "Error syncing!" +msgstr "" + +#: app/views/sync_management/_products.html.haml:9 +msgid "Est Size (Packages)" +msgstr "" + +#: app/views/common/_env_select.html.haml:5 +msgid "Expand" +msgstr "" + +#: app/views/systems/_facts.html.haml:10 +msgid "Fact" +msgstr "" + +#: config/navigation.rb:68 +msgid "Facts" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:52 +msgid "File" +msgstr "" + +#: app/views/packages/_filelist.html.haml:8 config/navigation.rb:46 +msgid "Filelist" +msgstr "" + +#: app/views/products/index.haml:8 +msgid "Filter" +msgstr "" + +#: app/views/sync_management/_products.html.haml:8 +msgid "Finish Time" +msgstr "" + +#: config/navigation.rb:63 +msgid "General" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Good" +msgstr "" + +#: app/views/systems/_facts.html.haml:9 +msgid "Group" +msgstr "" + +#: config/navigation.rb:76 +msgid "Groups" +msgstr "" + +#: app/views/systems/_edit.html.haml:13 +msgid "ID" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:17 +#: app/views/sync_plans/_form.html.haml:15 +msgid "Interval" +msgstr "" + +#: app/views/errata/_show.html.haml:19 +msgid "Issued" +msgstr "" + +#: app/helpers/application_helper.rb:19 +msgid "Katello" +msgstr "" + +#: app/views/systems/_edit.html.haml:62 +msgid "Last Booted" +msgstr "" + +#: app/views/notices/show.html.haml:21 +msgid "Level" +msgstr "" + +#: app/views/packages/_show.html.haml:77 +msgid "License" +msgstr "" + +#: config/navigation.rb:80 +msgid "List" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:16 +msgid "" +"Listed below are the products available from the selected provider, as well " +"as the related subscription information. If you have a subscription " +"manifest you may upload it below. This manifest may be obtained by visiting " +"the Red Hat Customer Portal or by contacting your support representative." +msgstr "" + +#: app/views/systems/_edit.html.haml:45 +msgid "Location" +msgstr "" + +#: app/controllers/environments_controller.rb:39 +#: app/controllers/environments_controller.rb:73 +#: app/views/environments/_new.html.haml:21 +#: app/views/common/_env_select.html.haml:14 +#: app/views/common/_env_select.html.haml:29 +msgid "Locker" +msgstr "" + +#: app/views/user_sessions/new.html.haml:5 +#: app/views/user_sessions/new.html.haml:18 +msgid "Log In" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:41 +msgid "Login Successful" +msgstr "" + +#: app/views/layouts/_footer.haml:5 app/views/layouts/_header.haml:23 +#: app/views/accounts/show.html.haml:6 +msgid "Logout" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:50 +msgid "Logout Successful" +msgstr "" + +#: app/views/providers/schedule.html.haml:2 +msgid "Manage Providers" +msgstr "" + +#: config/navigation.rb:10 +msgid "Monitors" +msgstr "" + +#: app/views/providers/_edit.html.haml:14 +#: app/views/providers/_edit_repository.html.haml:7 +#: app/views/providers/_form.html.haml:6 +#: app/views/providers/_products_repos.html.haml:29 +#: app/views/providers/_products_repos.html.haml:91 +#: app/views/providers/_edit_product.html.haml:7 +#: app/views/providers/_subscriptions.html.haml:21 +#: app/views/sync_plans/_edit.html.haml:9 +#: app/views/sync_plans/_form.html.haml:5 +#: app/views/organizations/_new.html.haml:7 +#: app/views/environments/_edit.html.haml:13 +#: app/views/environments/_new.html.haml:8 +#: app/views/systems/_edit.html.haml:25 +#: app/views/systems/_packages.html.haml:7 app/views/roles/_edit.html.haml:10 +#: app/views/roles/_new.html.haml:8 app/views/packages/_show.html.haml:11 +#: app/views/changesets/_edit.html.haml:14 +msgid "Name" +msgstr "" + +#: app/views/changesets/_name.html.haml:3 +msgid "Name:" +msgstr "" + +#: app/views/organizations/_new.html.haml:2 +msgid "New Organization" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:25 +msgid "New Product" +msgstr "" + +#: app/views/providers/_new.html.haml:4 +msgid "New Provider" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:87 +msgid "New Repository" +msgstr "" + +#: app/views/roles/_new.html.haml:3 +msgid "New Role" +msgstr "" + +#: app/views/sync_plans/_new.html.haml:4 +msgid "New Sync Plan" +msgstr "" + +#: app/views/users/_new.html.haml:2 +msgid "New User" +msgstr "" + +#: app/views/organizations/_edit.html.haml:31 +msgid "" +"No environments are available in this organization. Please add some " +"environments to be able register systems to this organization." +msgstr "" + +#: app/views/promotions/_errata.html.haml:3 +msgid "No errata available." +msgstr "" + +#: app/views/promotions/_packages.html.haml:3 +msgid "No packages available for promotion" +msgstr "" + +#: app/views/promotions/_products.html.haml:3 +msgid "No products" +msgstr "" + +#: app/views/systems/_edit.html.haml:63 +msgid "None" +msgstr "" + +#: app/controllers/providers_controller.rb:109 +msgid "None Imported" +msgstr "" + +#: app/controllers/sync_management_controller.rb:27 +msgid "Not synced." +msgstr "" + +#: config/navigation.rb:14 +msgid "Notifications" +msgstr "" + +#: app/views/systems/_edit.html.haml:33 +msgid "OS" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:18 +msgid "" +"On Products & Repositories you can add your own Products and Repositories to " +"your Provider. This allows you to synchronize content from any remote " +"repository to this server. Simply add a Product and then setup one or more " +"repositories to add to this Provider. This feature is only available for " +"Custom Providers." +msgstr "" + +#: app/models/provider.rb:46 +msgid "Only one Red Hat provider permitted for an Organization" +msgstr "" + +#: app/helpers/application_helper.rb:23 +msgid "Open Source Systems Management" +msgstr "" + +#: app/controllers/organizations_controller.rb:36 +msgid "Organization" +msgstr "" + +#: app/controllers/organizations_controller.rb:34 config/navigation.rb:79 +msgid "Organizations" +msgstr "" + +#: app/views/organizations/index.html.haml:14 +msgid "" +"Organizations allow content and systems to be separated by logical " +"divisions. To edit the environments within an organization, click on that " +"organization and then click on the desired environment." +msgstr "" + +#: app/views/promotions/show.html.haml:13 +msgid "Package Dependencies" +msgstr "" + +#: app/views/packages/_show.html.haml:83 +msgid "Package Group" +msgstr "" + +#: app/views/packages/_show.html.haml:51 +msgid "Package Size" +msgstr "" + +#: app/helpers/promotions_helper.rb:45 +#: app/views/promotions/_detail.html.haml:14 +#: app/views/changesets/_edit.html.haml:39 +#: app/views/changesets/_changeset.html.haml:36 +#: app/views/changesets/_changeset.html.haml:47 +#: app/views/errata/_packages.html.haml:10 config/navigation.rb:50 +#: config/navigation.rb:71 +msgid "Packages" +msgstr "" + +#: app/views/users/_new.html.haml:12 +msgid "Password" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Password Strength" +msgstr "" + +#: app/views/roles/_permission.html.haml:4 +msgid "Permission" +msgstr "" + +#: app/controllers/roles_controller.rb:116 +msgid "Permission created." +msgstr "" + +#: app/views/common/403.html.haml:1 +msgid "Permission denied" +msgstr "" + +#: app/controllers/roles_controller.rb:106 +msgid "Permission updated." +msgstr "" + +#: app/controllers/sync_plans_controller.rb:21 +#: app/controllers/sync_schedules_controller.rb:29 +#: app/controllers/sync_schedules_controller.rb:35 +msgid "Plan" +msgstr "" + +#: app/views/common/403.html.haml:4 +msgid "Please request the required privileges from an administrator." +msgstr "" + +#: app/views/environments/_new.html.haml:19 +msgid "Prior Environment" +msgstr "" + +#: app/views/environments/_edit.html.haml:24 +msgid "Prior Environments" +msgstr "" + +#: app/views/sync_management/_products.html.haml:6 +msgid "Product" +msgstr "" + +#: app/controllers/providers_controller.rb:71 +msgid "Product created." +msgstr "" + +#: app/controllers/providers_controller.rb:84 +msgid "Product removed." +msgstr "" + +#: app/helpers/promotions_helper.rb:35 app/views/products/index.haml:15 +#: app/views/promotions/_detail.html.haml:5 +#: app/views/sync_management/_products.html.haml:2 +#: app/views/changesets/_edit.html.haml:27 +#: app/views/changesets/_changeset.html.haml:25 +msgid "Products" +msgstr "" + +#: config/navigation.rb:31 +msgid "Products & Repositories" +msgstr "" + +#: app/views/sync_management/_products.html.haml:10 +msgid "Progress" +msgstr "" + +#: app/views/promotions/show.html.haml:46 +msgid "Promote to" +msgstr "" + +#: app/views/promotions/_packages.html.haml:8 +msgid "Promoted" +msgstr "" + +#: app/views/changesets/_edit.html.haml:19 +msgid "Promotion Date" +msgstr "" + +#: config/navigation.rb:41 +msgid "Promotions" +msgstr "" + +#: app/views/promotions/show.html.haml:36 +msgid "" +"Promotions allow you to promote content from one environment to the next " +"along a promotion path. Clicking \"Add\" next to one or more products will " +"add them to the change set. If products already exist in the next " +"environment, you may promote other types of content. Once you have created a " +"change set, click the \"Promote\" button to commit it to the next " +"environment." +msgstr "" + +#: app/controllers/providers_controller.rb:141 +msgid "Provider" +msgstr "" + +#: app/controllers/providers_controller.rb:139 config/navigation.rb:23 +msgid "Providers" +msgstr "" + +#: app/views/providers/index.html.haml:13 +msgid "" +"Providers provide many types of content such as packages, errata, kickstart " +"trees, and installation disc images. A provider may be delivering all of " +"your paid content or it could simply be a local yum repostory providing a " +"few yum repos." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:27 +msgid "Provides" +msgstr "" + +#: config/navigation.rb:87 +msgid "Proxies" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:23 +msgid "Quantity Available" +msgstr "" + +#: app/controllers/sync_management_controller.rb:23 +msgid "Queued." +msgstr "" + +#: app/views/systems/_edit.html.haml:58 config/navigation.rb:61 +msgid "Registered" +msgstr "" + +#: app/views/systems/_edit.html.haml:37 +msgid "Release" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:22 +#: app/views/providers/_edit_product.html.haml:32 +#: app/views/promotions/_packages.html.haml:11 +#: app/views/promotions/_products.html.haml:8 +#: app/views/promotions/_errata.html.haml:10 +msgid "Remove" +msgstr "" + +#: app/views/environments/_edit.html.haml:30 +msgid "Remove Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:39 +msgid "Remove Organization" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +msgid "Remove Provider" +msgstr "" + +#: app/views/roles/_edit.html.haml:24 +msgid "Remove Role" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:28 +msgid "Remove Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:50 +msgid "Remove User" +msgstr "" + +#: app/controllers/providers_controller.rb:57 +msgid "Repo removed." +msgstr "" + +#: config/navigation.rb:12 +msgid "Reports" +msgstr "" + +#: app/views/providers/_edit.html.haml:30 +#: app/views/providers/_form.html.haml:24 +msgid "Repository Url" +msgstr "" + +#: app/controllers/providers_controller.rb:49 +msgid "Repository created." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:19 +msgid "Requires" +msgstr "" + +#: app/controllers/roles_controller.rb:33 app/views/roles/_edit.html.haml:5 +msgid "Role" +msgstr "" + +#: app/controllers/roles_controller.rb:51 +msgid "Role created." +msgstr "" + +#: app/controllers/roles_controller.rb:65 +msgid "Role updated." +msgstr "" + +#: app/controllers/roles_controller.rb:31 app/views/users/_edit.html.haml:42 +#: config/navigation.rb:86 +msgid "Roles" +msgstr "" + +#: app/controllers/sync_management_controller.rb:26 +msgid "Running." +msgstr "" + +#: app/views/providers/_form.html.haml:29 +#: app/views/sync_plans/_form.html.haml:32 +#: app/views/organizations/_new.html.haml:16 +#: app/views/roles/_permission.html.haml:39 +#: app/views/common/_edit_i18n.html.haml:3 app/views/users/_edit.html.haml:35 +msgid "Save" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:57 +msgid "Save Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:101 +msgid "Save Repository" +msgstr "" + +#: app/views/users/_edit.html.haml:48 +msgid "Save Roles" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:9 +msgid "Save Subscriptions" +msgstr "" + +#: app/views/users/_new.html.haml:28 +msgid "Save User" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Saving..." +msgstr "" + +#: app/views/providers/schedule.html.haml:4 +msgid "Schedule" +msgstr "" + +#: app/views/roles/_permission.html.haml:20 +#: app/views/roles/_closed_permission.html.haml:8 +msgid "Scope" +msgstr "" + +#: app/views/notices/show.html.haml:8 app/views/common/_panel.html.haml:44 +msgid "Search" +msgstr "" + +#: app/views/sync_management/_products.html.haml:74 +msgid "Select All" +msgstr "" + +#: app/views/sync_management/_products.html.haml:71 +msgid "Select None" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:33 +msgid "Select Plans to apply to selected Products" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:27 +msgid "Select Products to schedule" +msgstr "" + +#: app/views/common/_panel.html.haml:11 +msgid "Select Result" +msgstr "" + +#: app/views/packages/_show.html.haml:42 +msgid "Signature" +msgstr "" + +#: app/views/packages/_show.html.haml:96 +msgid "Source Package" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:35 +msgid "Specify Local Manifest" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:21 +#: app/views/sync_plans/_form.html.haml:20 +msgid "Start Date" +msgstr "" + +#: app/views/sync_management/_products.html.haml:7 +msgid "Start Time" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Strong" +msgstr "" + +#: app/controllers/providers_controller.rb:96 +msgid "Subscription uploaded successfully" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:4 config/navigation.rb:29 +#: config/navigation.rb:65 +msgid "Subscriptions" +msgstr "" + +#: app/views/products/index.haml:21 +msgid "Sync" +msgstr "" + +#: config/navigation.rb:35 +msgid "Sync Management" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:19 config/navigation.rb:37 +msgid "Sync Plans" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:57 +msgid "Sync Plans applied successfully." +msgstr "" + +#: config/navigation.rb:38 +msgid "Sync Schedule" +msgstr "" + +#: config/navigation.rb:36 +msgid "Sync Status" +msgstr "" + +#: app/controllers/sync_management_controller.rb:24 +#: app/views/sync_management/index.html.haml:3 +msgid "Sync complete." +msgstr "" + +#: app/views/products/index.haml:11 +msgid "Synced" +msgstr "" + +#: app/views/sync_management/_products.html.haml:75 +msgid "Synchronize Now" +msgstr "" + +#: app/views/systems/_edit.html.haml:3 app/views/systems/_packages.html.haml:1 +#: app/views/systems/_facts.html.haml:1 +#: app/views/systems/_subscriptions.html.haml:1 +msgid "System" +msgstr "" + +#: app/views/systems/_edit.html.haml:50 +msgid "System Events" +msgstr "" + +#: app/views/systems/_edit.html.haml:9 +msgid "System Info" +msgstr "" + +#: app/views/systems/_edit.html.haml:21 +msgid "System Properties" +msgstr "" + +#: app/controllers/systems_controller.rb:43 +msgid "System subscriptions updated." +msgstr "" + +#: app/controllers/systems_controller.rb:64 +msgid "System updated." +msgstr "" + +#: app/controllers/systems_controller.rb:26 config/navigation.rb:59 +msgid "Systems" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "The passwords do not match" +msgstr "" + +#: app/controllers/providers_controller.rb:99 +msgid "There was a format error with your Subscription Manifest" +msgstr "" + +#: app/views/dashboard/index.html.haml:6 +msgid "" +"This is to be the Dashboard area containing Monitors, Reporting, and " +"Workflow branches." +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:25 +#: app/views/sync_plans/_form.html.haml:25 +msgid "Time" +msgstr "" + +#: app/views/providers/_edit.html.haml:24 +#: app/views/providers/_edit_repository.html.haml:17 +#: app/views/providers/_form.html.haml:18 +#: app/views/roles/_permission.html.haml:13 +#: app/views/roles/_closed_permission.html.haml:3 +#: app/views/errata/_show.html.haml:12 +msgid "Type" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:44 +msgid "Types" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:12 +#: app/views/providers/_products_repos.html.haml:39 +#: app/views/providers/_products_repos.html.haml:96 +#: app/views/providers/_edit_product.html.haml:19 +msgid "URL" +msgstr "" + +#: app/views/systems/_edit.html.haml:17 +msgid "UUID" +msgstr "" + +#: app/views/products/index.haml:13 +msgid "Unsynced" +msgstr "" + +#: app/views/errata/_show.html.haml:25 +msgid "Updated" +msgstr "" + +#: config/navigation.rb:54 +msgid "Updates Bundle" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:38 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Upload" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:32 +msgid "Upload Subscription Manifest" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Uploading" +msgstr "" + +#: app/controllers/users_controller.rb:35 +msgid "User" +msgstr "" + +#: app/views/notices/show.html.haml:11 +msgid "User Notifications" +msgstr "" + +#: app/views/notices/show.html.haml:15 +msgid "" +"User notifications lists all notifications generated by a user as well as " +"global notifications that are sent to all users." +msgstr "" + +#: app/controllers/users_controller.rb:72 +msgid "User updated successfully." +msgstr "" + +#: app/views/users/_edit.html.haml:7 app/views/users/_new.html.haml:7 +msgid "Username" +msgstr "" + +#: app/controllers/users_controller.rb:33 config/navigation.rb:85 +msgid "Users" +msgstr "" + +#: app/views/systems/_facts.html.haml:11 +msgid "Value" +msgstr "" + +#: app/views/roles/_permission.html.haml:30 +#: app/views/roles/_closed_permission.html.haml:15 +msgid "Verbs" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Very Weak" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Weak" +msgstr "" + +#: app/controllers/application_controller.rb:205 +msgid "Welcome Back!" +msgstr "" + +#: config/navigation.rb:16 +msgid "Workflow" +msgstr "" + +#: app/views/common/403.html.haml:3 +msgid "You are not authorised to perform this action." +msgstr "" + +#: app/controllers/application_controller.rb:162 +#: app/controllers/application_controller.rb:195 +msgid "You must be logged in to access that page." +msgstr "" + +#: app/controllers/application_controller.rb:176 +msgid "" +"You must have at least one organization in your database to access that " +"page. Might need to run 'rake db:seed'" +msgstr "" + +#: app/controllers/failed_authentication_controller.rb:18 +msgid "" +"You've entered an incorrect username or password combination, please try " +"again." +msgstr "" + +#: app/views/providers/_products_repos.html.haml:47 +msgid "Yum" +msgstr "" + +#: app/models/katello_name_format_validator.rb:20 +msgid "can't be blank" +msgstr "" + +#: app/models/katello_name_format_validator.rb:16 +msgid "cannot contain characters other than alpha numerals, space,'_', '-'." +msgstr "" + +#: app/models/username_validator.rb:16 +msgid "cannot contain characters other than alpha numerals,'_', '-'." +msgstr "" + +#: app/controllers/changesets_controller.rb:40 +msgid "changeset" +msgstr "" + +#: app/models/kp_environment.rb:27 +msgid "environment cannot be a prior to a different environment" +msgstr "" + +#: app/models/kp_environment.rb:69 +msgid "must be unique within one organization" +msgstr "" + +#: app/models/no_trailing_space_validator.rb:20 +msgid "must not contain leading or trailing white spaces." +msgstr "" + +#: app/controllers/organizations_controller.rb:37 +msgid "organization" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:22 +#: app/controllers/sync_schedules_controller.rb:36 +msgid "plan" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:30 +msgid "product" +msgstr "" + +#: app/controllers/sync_management_controller.rb:150 +msgid "product was synced successfully" +msgstr "" + +#: app/controllers/sync_management_controller.rb:147 +msgid "product was synced successfully with errors. See log for details" +msgstr "" + +#: app/controllers/providers_controller.rb:142 +msgid "provider" +msgstr "" + +#: app/controllers/roles_controller.rb:34 +msgid "role" +msgstr "" + +#: app/controllers/sync_management_controller.rb:155 +msgid "sync did not complete successfully" +msgstr "" + +#: app/controllers/systems_controller.rb:29 +msgid "system" +msgstr "" + +#: app/controllers/users_controller.rb:36 +msgid "user" +msgstr "" diff --git a/locale/en/app.po b/locale/en/app.po new file mode 100644 index 00000000000..499e468e735 --- /dev/null +++ b/locale/en/app.po @@ -0,0 +1,1189 @@ +# English translations for version package. +# Copyright (C) 2011 THE version'S COPYRIGHT HOLDER +# This file is distributed under the same license as the version package. +# Jason E. Rist , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2011-06-01 15:16-0600\n" +"PO-Revision-Date: 2011-01-06 19:28-0700\n" +"Last-Translator: Jason E. Rist \n" +"Language-Team: English\n" +"Language: en\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: app/views/layouts/_footer.haml:7 +msgid " Red Hat, Inc." +msgstr "" + +#: app/controllers/users_controller.rb:52 +msgid " created successfully." +msgstr "" + +#: app/models/kp_environment.rb:38 +msgid " environment cannot be set to an environment already on its path" +msgstr "" + +#: app/helpers/translation_helper.rb:15 +msgid "%{relative_time} ago" +msgstr "%{relative_time} ago" + +#: app/views/common/_panel.html.haml:39 +msgid "+ New " +msgstr "" + +#: app/views/products/index.haml:4 +msgid "Actions" +msgstr "" + +#: app/views/promotions/_packages.html.haml:14 +#: app/views/promotions/_products.html.haml:11 +#: app/views/promotions/_errata.html.haml:13 +msgid "Add" +msgstr "" + +#: app/views/organizations/_edit.html.haml:36 +msgid "Add New Environment" +msgstr "" + +#: app/views/roles/_edit.html.haml:20 +msgid "Add Permission" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:23 +msgid "Add Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:85 +msgid "Add Repository" +msgstr "" + +#: app/views/operations/index.html.haml:2 config/navigation.rb:84 +msgid "Administration" +msgstr "" + +#: app/views/roles/_permission.html.haml:23 +#: app/views/roles/_permission.html.haml:33 +#: app/views/roles/_closed_permission.html.haml:11 +#: app/views/roles/_closed_permission.html.haml:18 +msgid "All" +msgstr "" + +#: app/helpers/promotions_helper.rb:33 +#: app/views/promotions/_detail.html.haml:8 +msgid "All Errata" +msgstr "" + +#: app/views/sync_schedules/index.html.haml:12 +msgid "Apply Selected Plans to Selected Products" +msgstr "" + +#: app/views/systems/_edit.html.haml:41 +#: app/views/systems/_packages.html.haml:8 +msgid "Arch" +msgstr "" + +#: app/views/packages/_show.html.haml:25 +msgid "Architecture" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +#: app/views/sync_plans/_edit.html.haml:28 +#: app/views/organizations/_edit.html.haml:38 +#: app/views/environments/_edit.html.haml:29 +#: app/views/roles/_edit.html.haml:24 app/views/notices/show.html.haml:37 +#: app/views/common/_common_i18n.html.haml:3 +#: app/views/users/_edit.html.haml:50 +msgid "Are you sure?" +msgstr "" + +#: app/views/errata/_show.html.haml:39 +msgid "Associated Bugs" +msgstr "" + +#: app/views/promotions/show.html.haml:59 +msgid "Available Content" +msgstr "" + +#: app/views/common/403.html.haml:7 +msgid "Back" +msgstr "" + +#: config/navigation.rb:27 +msgid "Basics" +msgstr "" + +#: app/views/packages/_show.html.haml:70 +msgid "Build Date" +msgstr "" + +#: app/views/packages/_show.html.haml:64 +msgid "Build Host" +msgstr "" + +#: app/controllers/api/environments_controller.rb:38 +msgid "Can't update locker environment" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:24 +#: app/views/providers/_products_repos.html.haml:59 +#: app/views/providers/_products_repos.html.haml:103 +#: app/views/providers/_edit_product.html.haml:34 +#: app/views/roles/_permission.html.haml:42 +#: app/views/sync_management/index.html.haml:3 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Cancel" +msgstr "" + +#: app/views/users/_edit.html.haml:23 +msgid "Change Password" +msgstr "" + +#: app/views/packages/_changelog.html.haml:9 config/navigation.rb:45 +msgid "Changelog" +msgstr "" + +#: config/navigation.rb:53 +msgid "Changeset History" +msgstr "" + +#: app/views/changesets/_changeset.html.haml:21 +msgid "Changeset Summary" +msgstr "" + +#: app/controllers/changesets_controller.rb:27 +msgid "Changeset storage errors" +msgstr "" + +#: app/controllers/changesets_controller.rb:37 +msgid "Changesets" +msgstr "" + +#: app/views/systems/_edit.html.haml:54 +msgid "Checked In" +msgstr "" + +#: app/views/users/_edit.html.haml:20 +msgid "Clear" +msgstr "" + +#: app/views/users/_edit.html.haml:17 +msgid "Clear Disabled Helptips" +msgstr "" + +#: app/controllers/users_controller.rb:103 +msgid "Cleared" +msgstr "" + +#: app/views/common/_panel.html.haml:7 +msgid "Click New to create a new" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:21 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Click to edit" +msgstr "" + +#: app/views/promotions/show.html.haml:51 app/views/common/_panel.html.haml:17 +#: app/views/common/_panel.html.haml:26 +msgid "Close" +msgstr "" + +#: app/views/common/_env_select.html.haml:7 +msgid "Collapse" +msgstr "" + +#: app/views/users/_edit.html.haml:30 app/views/users/_new.html.haml:19 +msgid "Confirm" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:22 +msgid "Consumed Subscriptions" +msgstr "" + +#: app/helpers/promotions_helper.rb:31 app/views/content/index.html.haml:1 +msgid "Content" +msgstr "" + +#: config/navigation.rb:22 +msgid "Content Management" +msgstr "" + +#: app/views/layouts/_footer.haml:7 +msgid "Copyright © " +msgstr "" + +#: app/views/environments/_new.html.haml:24 config/navigation.rb:24 +msgid "Create" +msgstr "" + +#: app/views/environments/_new.html.haml:2 +msgid "Create Environment" +msgstr "" + +#: app/views/notices/show.html.haml:19 +msgid "Created" +msgstr "" + +#: app/views/promotions/show.html.haml:40 +msgid "Current Changeset" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:18 +msgid "Current Subscriptions" +msgstr "" + +#: app/views/dashboard/index.html.haml:2 config/navigation.rb:8 +msgid "Dashboard" +msgstr "" + +#: app/views/notices/show.html.haml:37 +msgid "Delete All" +msgstr "" + +#: app/views/packages/_dependencies.html.haml:12 +#: app/views/changesets/_changeset.html.haml:45 config/navigation.rb:44 +msgid "Dependencies" +msgstr "" + +#: app/views/providers/_edit.html.haml:19 +#: app/views/providers/_form.html.haml:12 +#: app/views/providers/_products_repos.html.haml:34 +#: app/views/providers/_edit_product.html.haml:12 +#: app/views/sync_plans/_edit.html.haml:13 +#: app/views/sync_plans/_form.html.haml:10 +#: app/views/organizations/_edit.html.haml:12 +#: app/views/organizations/_new.html.haml:12 +#: app/views/environments/_edit.html.haml:18 +#: app/views/environments/_new.html.haml:14 +#: app/views/systems/_edit.html.haml:29 app/views/packages/_show.html.haml:19 +#: app/views/notices/show.html.haml:23 app/views/errata/_show.html.haml:45 +msgid "Description" +msgstr "" + +#: app/views/changesets/_edit.html.haml:9 config/navigation.rb:43 +#: config/navigation.rb:49 +msgid "Details" +msgstr "" + +#: app/controllers/users_controller.rb:102 +msgid "Disabled help tips have been re-enabled." +msgstr "" + +#: app/views/packages/_show.html.haml:89 +msgid "Download" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:3 +msgid "Edit Product" +msgstr "" + +#: app/views/providers/_edit.html.haml:4 +msgid "Edit Provider" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:3 +msgid "Edit Repository" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:5 +msgid "Edit Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:2 +msgid "Edit User" +msgstr "" + +#: app/views/users/_edit.html.haml:12 +msgid "Enable inline help" +msgstr "" + +#: app/views/environments/_edit.html.haml:6 +msgid "Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:16 +msgid "Environment Promotion Paths" +msgstr "" + +#: app/models/kp_environment.rb:15 +msgid "Environment cannot be in its own promotion path" +msgstr "" + +#: app/helpers/promotions_helper.rb:49 +#: app/views/promotions/_detail.html.haml:18 +#: app/views/changesets/_edit.html.haml:33 +#: app/views/changesets/_changeset.html.haml:30 +msgid "Errata" +msgstr "" + +#: app/views/sync_management/index.html.haml:3 +msgid "Error" +msgstr "" + +#: app/controllers/sync_management_controller.rb:25 +msgid "Error syncing!" +msgstr "" + +#: app/views/sync_management/_products.html.haml:9 +msgid "Est Size (Packages)" +msgstr "" + +#: app/views/common/_env_select.html.haml:5 +msgid "Expand" +msgstr "" + +#: app/views/systems/_facts.html.haml:10 +msgid "Fact" +msgstr "" + +#: config/navigation.rb:68 +msgid "Facts" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:52 +msgid "File" +msgstr "" + +#: app/views/packages/_filelist.html.haml:8 config/navigation.rb:46 +msgid "Filelist" +msgstr "" + +#: app/views/products/index.haml:8 +msgid "Filter" +msgstr "" + +#: app/views/sync_management/_products.html.haml:8 +msgid "Finish Time" +msgstr "" + +#: config/navigation.rb:63 +msgid "General" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Good" +msgstr "" + +#: app/views/systems/_facts.html.haml:9 +msgid "Group" +msgstr "" + +#: config/navigation.rb:76 +msgid "Groups" +msgstr "" + +#: app/views/systems/_edit.html.haml:13 +msgid "ID" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:17 +#: app/views/sync_plans/_form.html.haml:15 +msgid "Interval" +msgstr "" + +#: app/views/errata/_show.html.haml:19 +msgid "Issued" +msgstr "" + +#: app/helpers/application_helper.rb:19 +msgid "Katello" +msgstr "" + +#: app/views/systems/_edit.html.haml:62 +msgid "Last Booted" +msgstr "" + +#: app/views/notices/show.html.haml:21 +msgid "Level" +msgstr "" + +#: app/views/packages/_show.html.haml:77 +msgid "License" +msgstr "" + +#: config/navigation.rb:80 +msgid "List" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:16 +msgid "" +"Listed below are the products available from the selected provider, as well " +"as the related subscription information. If you have a subscription " +"manifest you may upload it below. This manifest may be obtained by visiting " +"the Red Hat Customer Portal or by contacting your support representative." +msgstr "" + +#: app/views/systems/_edit.html.haml:45 +msgid "Location" +msgstr "" + +#: app/controllers/environments_controller.rb:39 +#: app/controllers/environments_controller.rb:73 +#: app/views/environments/_new.html.haml:21 +#: app/views/common/_env_select.html.haml:14 +#: app/views/common/_env_select.html.haml:29 +msgid "Locker" +msgstr "" + +#: app/views/user_sessions/new.html.haml:5 +#: app/views/user_sessions/new.html.haml:18 +msgid "Log In" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:41 +msgid "Login Successful" +msgstr "" + +#: app/views/layouts/_footer.haml:5 app/views/layouts/_header.haml:23 +#: app/views/accounts/show.html.haml:6 +msgid "Logout" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:50 +msgid "Logout Successful" +msgstr "" + +#: app/views/providers/schedule.html.haml:2 +msgid "Manage Providers" +msgstr "" + +#: config/navigation.rb:10 +msgid "Monitors" +msgstr "" + +#: app/views/providers/_edit.html.haml:14 +#: app/views/providers/_edit_repository.html.haml:7 +#: app/views/providers/_form.html.haml:6 +#: app/views/providers/_products_repos.html.haml:29 +#: app/views/providers/_products_repos.html.haml:91 +#: app/views/providers/_edit_product.html.haml:7 +#: app/views/providers/_subscriptions.html.haml:21 +#: app/views/sync_plans/_edit.html.haml:9 +#: app/views/sync_plans/_form.html.haml:5 +#: app/views/organizations/_new.html.haml:7 +#: app/views/environments/_edit.html.haml:13 +#: app/views/environments/_new.html.haml:8 +#: app/views/systems/_edit.html.haml:25 +#: app/views/systems/_packages.html.haml:7 app/views/roles/_edit.html.haml:10 +#: app/views/roles/_new.html.haml:8 app/views/packages/_show.html.haml:11 +#: app/views/changesets/_edit.html.haml:14 +msgid "Name" +msgstr "" + +#: app/views/changesets/_name.html.haml:3 +msgid "Name:" +msgstr "" + +#: app/views/organizations/_new.html.haml:2 +msgid "New Organization" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:25 +msgid "New Product" +msgstr "" + +#: app/views/providers/_new.html.haml:4 +msgid "New Provider" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:87 +msgid "New Repository" +msgstr "" + +#: app/views/roles/_new.html.haml:3 +msgid "New Role" +msgstr "" + +#: app/views/sync_plans/_new.html.haml:4 +msgid "New Sync Plan" +msgstr "" + +#: app/views/users/_new.html.haml:2 +msgid "New User" +msgstr "" + +#: app/views/organizations/_edit.html.haml:31 +msgid "" +"No environments are available in this organization. Please add some " +"environments to be able register systems to this organization." +msgstr "" + +#: app/views/promotions/_errata.html.haml:3 +msgid "No errata available." +msgstr "" + +#: app/views/promotions/_packages.html.haml:3 +msgid "No packages available for promotion" +msgstr "" + +#: app/views/promotions/_products.html.haml:3 +msgid "No products" +msgstr "" + +#: app/views/systems/_edit.html.haml:63 +msgid "None" +msgstr "" + +#: app/controllers/providers_controller.rb:109 +msgid "None Imported" +msgstr "" + +#: app/controllers/sync_management_controller.rb:27 +msgid "Not synced." +msgstr "" + +#: config/navigation.rb:14 +msgid "Notifications" +msgstr "" + +#: app/views/systems/_edit.html.haml:33 +msgid "OS" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:18 +msgid "" +"On Products & Repositories you can add your own Products and Repositories to " +"your Provider. This allows you to synchronize content from any remote " +"repository to this server. Simply add a Product and then setup one or more " +"repositories to add to this Provider. This feature is only available for " +"Custom Providers." +msgstr "" + +#: app/models/provider.rb:46 +msgid "Only one Red Hat provider permitted for an Organization" +msgstr "" + +#: app/helpers/application_helper.rb:23 +msgid "Open Source Systems Management" +msgstr "" + +#: app/controllers/organizations_controller.rb:36 +msgid "Organization" +msgstr "" + +#: app/controllers/organizations_controller.rb:34 config/navigation.rb:79 +msgid "Organizations" +msgstr "" + +#: app/views/organizations/index.html.haml:14 +msgid "" +"Organizations allow content and systems to be separated by logical " +"divisions. To edit the environments within an organization, click on that " +"organization and then click on the desired environment." +msgstr "" + +#: app/views/promotions/show.html.haml:13 +msgid "Package Dependencies" +msgstr "" + +#: app/views/packages/_show.html.haml:83 +msgid "Package Group" +msgstr "" + +#: app/views/packages/_show.html.haml:51 +msgid "Package Size" +msgstr "" + +#: app/helpers/promotions_helper.rb:45 +#: app/views/promotions/_detail.html.haml:14 +#: app/views/changesets/_edit.html.haml:39 +#: app/views/changesets/_changeset.html.haml:36 +#: app/views/changesets/_changeset.html.haml:47 +#: app/views/errata/_packages.html.haml:10 config/navigation.rb:50 +#: config/navigation.rb:71 +msgid "Packages" +msgstr "" + +#: app/views/users/_new.html.haml:12 +msgid "Password" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Password Strength" +msgstr "" + +#: app/views/roles/_permission.html.haml:4 +msgid "Permission" +msgstr "" + +#: app/controllers/roles_controller.rb:116 +msgid "Permission created." +msgstr "" + +#: app/views/common/403.html.haml:1 +msgid "Permission denied" +msgstr "" + +#: app/controllers/roles_controller.rb:106 +msgid "Permission updated." +msgstr "" + +#: app/controllers/sync_plans_controller.rb:21 +#: app/controllers/sync_schedules_controller.rb:29 +#: app/controllers/sync_schedules_controller.rb:35 +msgid "Plan" +msgstr "" + +#: app/views/common/403.html.haml:4 +msgid "Please request the required privileges from an administrator." +msgstr "" + +#: app/views/environments/_new.html.haml:19 +msgid "Prior Environment" +msgstr "" + +#: app/views/environments/_edit.html.haml:24 +msgid "Prior Environments" +msgstr "" + +#: app/views/sync_management/_products.html.haml:6 +msgid "Product" +msgstr "" + +#: app/controllers/providers_controller.rb:71 +msgid "Product created." +msgstr "" + +#: app/controllers/providers_controller.rb:84 +msgid "Product removed." +msgstr "" + +#: app/helpers/promotions_helper.rb:35 app/views/products/index.haml:15 +#: app/views/promotions/_detail.html.haml:5 +#: app/views/sync_management/_products.html.haml:2 +#: app/views/changesets/_edit.html.haml:27 +#: app/views/changesets/_changeset.html.haml:25 +msgid "Products" +msgstr "" + +#: config/navigation.rb:31 +msgid "Products & Repositories" +msgstr "" + +#: app/views/sync_management/_products.html.haml:10 +msgid "Progress" +msgstr "" + +#: app/views/promotions/show.html.haml:46 +msgid "Promote to" +msgstr "" + +#: app/views/promotions/_packages.html.haml:8 +msgid "Promoted" +msgstr "" + +#: app/views/changesets/_edit.html.haml:19 +msgid "Promotion Date" +msgstr "" + +#: config/navigation.rb:41 +msgid "Promotions" +msgstr "" + +#: app/views/promotions/show.html.haml:36 +msgid "" +"Promotions allow you to promote content from one environment to the next " +"along a promotion path. Clicking \"Add\" next to one or more products will " +"add them to the change set. If products already exist in the next " +"environment, you may promote other types of content. Once you have created a " +"change set, click the \"Promote\" button to commit it to the next " +"environment." +msgstr "" + +#: app/controllers/providers_controller.rb:141 +msgid "Provider" +msgstr "" + +#: app/controllers/providers_controller.rb:139 config/navigation.rb:23 +msgid "Providers" +msgstr "" + +#: app/views/providers/index.html.haml:13 +msgid "" +"Providers provide many types of content such as packages, errata, kickstart " +"trees, and installation disc images. A provider may be delivering all of " +"your paid content or it could simply be a local yum repostory providing a " +"few yum repos." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:27 +msgid "Provides" +msgstr "" + +#: config/navigation.rb:87 +msgid "Proxies" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:23 +msgid "Quantity Available" +msgstr "" + +#: app/controllers/sync_management_controller.rb:23 +msgid "Queued." +msgstr "" + +#: app/views/systems/_edit.html.haml:58 config/navigation.rb:61 +msgid "Registered" +msgstr "" + +#: app/views/systems/_edit.html.haml:37 +msgid "Release" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:22 +#: app/views/providers/_edit_product.html.haml:32 +#: app/views/promotions/_packages.html.haml:11 +#: app/views/promotions/_products.html.haml:8 +#: app/views/promotions/_errata.html.haml:10 +msgid "Remove" +msgstr "" + +#: app/views/environments/_edit.html.haml:30 +msgid "Remove Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:39 +msgid "Remove Organization" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +msgid "Remove Provider" +msgstr "" + +#: app/views/roles/_edit.html.haml:24 +msgid "Remove Role" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:28 +msgid "Remove Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:50 +msgid "Remove User" +msgstr "" + +#: app/controllers/providers_controller.rb:57 +msgid "Repo removed." +msgstr "" + +#: config/navigation.rb:12 +msgid "Reports" +msgstr "" + +#: app/views/providers/_edit.html.haml:30 +#: app/views/providers/_form.html.haml:24 +msgid "Repository Url" +msgstr "" + +#: app/controllers/providers_controller.rb:49 +msgid "Repository created." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:19 +msgid "Requires" +msgstr "" + +#: app/controllers/roles_controller.rb:33 app/views/roles/_edit.html.haml:5 +msgid "Role" +msgstr "" + +#: app/controllers/roles_controller.rb:51 +msgid "Role created." +msgstr "" + +#: app/controllers/roles_controller.rb:65 +msgid "Role updated." +msgstr "" + +#: app/controllers/roles_controller.rb:31 app/views/users/_edit.html.haml:42 +#: config/navigation.rb:86 +msgid "Roles" +msgstr "" + +#: app/controllers/sync_management_controller.rb:26 +msgid "Running." +msgstr "" + +#: app/views/providers/_form.html.haml:29 +#: app/views/sync_plans/_form.html.haml:32 +#: app/views/organizations/_new.html.haml:16 +#: app/views/roles/_permission.html.haml:39 +#: app/views/common/_edit_i18n.html.haml:3 app/views/users/_edit.html.haml:35 +msgid "Save" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:57 +msgid "Save Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:101 +msgid "Save Repository" +msgstr "" + +#: app/views/users/_edit.html.haml:48 +msgid "Save Roles" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:9 +msgid "Save Subscriptions" +msgstr "" + +#: app/views/users/_new.html.haml:28 +msgid "Save User" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Saving..." +msgstr "" + +#: app/views/providers/schedule.html.haml:4 +msgid "Schedule" +msgstr "" + +#: app/views/roles/_permission.html.haml:20 +#: app/views/roles/_closed_permission.html.haml:8 +msgid "Scope" +msgstr "" + +#: app/views/notices/show.html.haml:8 app/views/common/_panel.html.haml:44 +msgid "Search" +msgstr "" + +#: app/views/sync_management/_products.html.haml:74 +msgid "Select All" +msgstr "" + +#: app/views/sync_management/_products.html.haml:71 +msgid "Select None" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:33 +msgid "Select Plans to apply to selected Products" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:27 +msgid "Select Products to schedule" +msgstr "" + +#: app/views/common/_panel.html.haml:11 +msgid "Select Result" +msgstr "" + +#: app/views/packages/_show.html.haml:42 +msgid "Signature" +msgstr "" + +#: app/views/packages/_show.html.haml:96 +msgid "Source Package" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:35 +msgid "Specify Local Manifest" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:21 +#: app/views/sync_plans/_form.html.haml:20 +msgid "Start Date" +msgstr "" + +#: app/views/sync_management/_products.html.haml:7 +msgid "Start Time" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Strong" +msgstr "" + +#: app/controllers/providers_controller.rb:96 +msgid "Subscription uploaded successfully" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:4 config/navigation.rb:29 +#: config/navigation.rb:65 +msgid "Subscriptions" +msgstr "" + +#: app/views/products/index.haml:21 +msgid "Sync" +msgstr "" + +#: config/navigation.rb:35 +msgid "Sync Management" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:19 config/navigation.rb:37 +msgid "Sync Plans" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:57 +msgid "Sync Plans applied successfully." +msgstr "" + +#: config/navigation.rb:38 +msgid "Sync Schedule" +msgstr "" + +#: config/navigation.rb:36 +msgid "Sync Status" +msgstr "" + +#: app/controllers/sync_management_controller.rb:24 +#: app/views/sync_management/index.html.haml:3 +msgid "Sync complete." +msgstr "" + +#: app/views/products/index.haml:11 +msgid "Synced" +msgstr "" + +#: app/views/sync_management/_products.html.haml:75 +msgid "Synchronize Now" +msgstr "" + +#: app/views/systems/_edit.html.haml:3 app/views/systems/_packages.html.haml:1 +#: app/views/systems/_facts.html.haml:1 +#: app/views/systems/_subscriptions.html.haml:1 +msgid "System" +msgstr "" + +#: app/views/systems/_edit.html.haml:50 +msgid "System Events" +msgstr "" + +#: app/views/systems/_edit.html.haml:9 +msgid "System Info" +msgstr "" + +#: app/views/systems/_edit.html.haml:21 +msgid "System Properties" +msgstr "" + +#: app/controllers/systems_controller.rb:43 +msgid "System subscriptions updated." +msgstr "" + +#: app/controllers/systems_controller.rb:64 +msgid "System updated." +msgstr "" + +#: app/controllers/systems_controller.rb:26 config/navigation.rb:59 +msgid "Systems" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "The passwords do not match" +msgstr "" + +#: app/controllers/providers_controller.rb:99 +msgid "There was a format error with your Subscription Manifest" +msgstr "" + +#: app/views/dashboard/index.html.haml:6 +msgid "" +"This is to be the Dashboard area containing Monitors, Reporting, and " +"Workflow branches." +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:25 +#: app/views/sync_plans/_form.html.haml:25 +msgid "Time" +msgstr "" + +#: app/views/providers/_edit.html.haml:24 +#: app/views/providers/_edit_repository.html.haml:17 +#: app/views/providers/_form.html.haml:18 +#: app/views/roles/_permission.html.haml:13 +#: app/views/roles/_closed_permission.html.haml:3 +#: app/views/errata/_show.html.haml:12 +msgid "Type" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:44 +msgid "Types" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:12 +#: app/views/providers/_products_repos.html.haml:39 +#: app/views/providers/_products_repos.html.haml:96 +#: app/views/providers/_edit_product.html.haml:19 +msgid "URL" +msgstr "" + +#: app/views/systems/_edit.html.haml:17 +msgid "UUID" +msgstr "" + +#: app/views/products/index.haml:13 +msgid "Unsynced" +msgstr "" + +#: app/views/errata/_show.html.haml:25 +msgid "Updated" +msgstr "" + +#: config/navigation.rb:54 +msgid "Updates Bundle" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:38 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Upload" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:32 +msgid "Upload Subscription Manifest" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Uploading" +msgstr "" + +#: app/controllers/users_controller.rb:35 +msgid "User" +msgstr "" + +#: app/views/notices/show.html.haml:11 +msgid "User Notifications" +msgstr "" + +#: app/views/notices/show.html.haml:15 +msgid "" +"User notifications lists all notifications generated by a user as well as " +"global notifications that are sent to all users." +msgstr "" + +#: app/controllers/users_controller.rb:72 +msgid "User updated successfully." +msgstr "" + +#: app/views/users/_edit.html.haml:7 app/views/users/_new.html.haml:7 +msgid "Username" +msgstr "" + +#: app/controllers/users_controller.rb:33 config/navigation.rb:85 +msgid "Users" +msgstr "" + +#: app/views/systems/_facts.html.haml:11 +msgid "Value" +msgstr "" + +#: app/views/roles/_permission.html.haml:30 +#: app/views/roles/_closed_permission.html.haml:15 +msgid "Verbs" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Very Weak" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Weak" +msgstr "" + +#: app/controllers/application_controller.rb:205 +msgid "Welcome Back!" +msgstr "" + +#: config/navigation.rb:16 +msgid "Workflow" +msgstr "" + +#: app/views/common/403.html.haml:3 +msgid "You are not authorised to perform this action." +msgstr "" + +#: app/controllers/application_controller.rb:162 +#: app/controllers/application_controller.rb:195 +msgid "You must be logged in to access that page." +msgstr "" + +#: app/controllers/application_controller.rb:176 +msgid "" +"You must have at least one organization in your database to access that " +"page. Might need to run 'rake db:seed'" +msgstr "" + +#: app/controllers/failed_authentication_controller.rb:18 +msgid "" +"You've entered an incorrect username or password combination, please try " +"again." +msgstr "" + +#: app/views/providers/_products_repos.html.haml:47 +msgid "Yum" +msgstr "" + +#: app/models/katello_name_format_validator.rb:20 +msgid "can't be blank" +msgstr "" + +#: app/models/katello_name_format_validator.rb:16 +msgid "cannot contain characters other than alpha numerals, space,'_', '-'." +msgstr "" + +#: app/models/username_validator.rb:16 +msgid "cannot contain characters other than alpha numerals,'_', '-'." +msgstr "" + +#: app/controllers/changesets_controller.rb:40 +msgid "changeset" +msgstr "" + +#: app/models/kp_environment.rb:27 +msgid "environment cannot be a prior to a different environment" +msgstr "" + +#: app/models/kp_environment.rb:69 +msgid "must be unique within one organization" +msgstr "" + +#: app/models/no_trailing_space_validator.rb:20 +msgid "must not contain leading or trailing white spaces." +msgstr "" + +#: app/controllers/organizations_controller.rb:37 +msgid "organization" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:22 +#: app/controllers/sync_schedules_controller.rb:36 +msgid "plan" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:30 +msgid "product" +msgstr "" + +#: app/controllers/sync_management_controller.rb:150 +msgid "product was synced successfully" +msgstr "" + +#: app/controllers/sync_management_controller.rb:147 +msgid "product was synced successfully with errors. See log for details" +msgstr "" + +#: app/controllers/providers_controller.rb:142 +msgid "provider" +msgstr "" + +#: app/controllers/roles_controller.rb:34 +msgid "role" +msgstr "" + +#: app/controllers/sync_management_controller.rb:155 +msgid "sync did not complete successfully" +msgstr "" + +#: app/controllers/systems_controller.rb:29 +msgid "system" +msgstr "" + +#: app/controllers/users_controller.rb:36 +msgid "user" +msgstr "" diff --git a/locale/flies.xml b/locale/flies.xml new file mode 100644 index 00000000000..b5d44239505 --- /dev/null +++ b/locale/flies.xml @@ -0,0 +1,17 @@ + + + https://translate.engineering.redhat.com/flies/ + katello + 0.1v + + es + pt-BR + it + fr + de + ko + ja + zh-Hans + zh-Hant + + diff --git a/locale/fr/app.po b/locale/fr/app.po new file mode 100644 index 00000000000..bdff84ff74d --- /dev/null +++ b/locale/fr/app.po @@ -0,0 +1,1189 @@ +# French translations for version package. +# Copyright (C) 2011 THE version'S COPYRIGHT HOLDER +# This file is distributed under the same license as the version package. +# Jason E. Rist , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2011-06-01 15:16-0600\n" +"PO-Revision-Date: 2011-01-07 16:43-0700\n" +"Last-Translator: Jason E. Rist \n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: app/views/layouts/_footer.haml:7 +msgid " Red Hat, Inc." +msgstr "" + +#: app/controllers/users_controller.rb:52 +msgid " created successfully." +msgstr "" + +#: app/models/kp_environment.rb:38 +msgid " environment cannot be set to an environment already on its path" +msgstr "" + +#: app/helpers/translation_helper.rb:15 +msgid "%{relative_time} ago" +msgstr "" + +#: app/views/common/_panel.html.haml:39 +msgid "+ New " +msgstr "" + +#: app/views/products/index.haml:4 +msgid "Actions" +msgstr "" + +#: app/views/promotions/_packages.html.haml:14 +#: app/views/promotions/_products.html.haml:11 +#: app/views/promotions/_errata.html.haml:13 +msgid "Add" +msgstr "" + +#: app/views/organizations/_edit.html.haml:36 +msgid "Add New Environment" +msgstr "" + +#: app/views/roles/_edit.html.haml:20 +msgid "Add Permission" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:23 +msgid "Add Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:85 +msgid "Add Repository" +msgstr "" + +#: app/views/operations/index.html.haml:2 config/navigation.rb:84 +msgid "Administration" +msgstr "" + +#: app/views/roles/_permission.html.haml:23 +#: app/views/roles/_permission.html.haml:33 +#: app/views/roles/_closed_permission.html.haml:11 +#: app/views/roles/_closed_permission.html.haml:18 +msgid "All" +msgstr "" + +#: app/helpers/promotions_helper.rb:33 +#: app/views/promotions/_detail.html.haml:8 +msgid "All Errata" +msgstr "" + +#: app/views/sync_schedules/index.html.haml:12 +msgid "Apply Selected Plans to Selected Products" +msgstr "" + +#: app/views/systems/_edit.html.haml:41 +#: app/views/systems/_packages.html.haml:8 +msgid "Arch" +msgstr "" + +#: app/views/packages/_show.html.haml:25 +msgid "Architecture" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +#: app/views/sync_plans/_edit.html.haml:28 +#: app/views/organizations/_edit.html.haml:38 +#: app/views/environments/_edit.html.haml:29 +#: app/views/roles/_edit.html.haml:24 app/views/notices/show.html.haml:37 +#: app/views/common/_common_i18n.html.haml:3 +#: app/views/users/_edit.html.haml:50 +msgid "Are you sure?" +msgstr "" + +#: app/views/errata/_show.html.haml:39 +msgid "Associated Bugs" +msgstr "" + +#: app/views/promotions/show.html.haml:59 +msgid "Available Content" +msgstr "" + +#: app/views/common/403.html.haml:7 +msgid "Back" +msgstr "" + +#: config/navigation.rb:27 +msgid "Basics" +msgstr "" + +#: app/views/packages/_show.html.haml:70 +msgid "Build Date" +msgstr "" + +#: app/views/packages/_show.html.haml:64 +msgid "Build Host" +msgstr "" + +#: app/controllers/api/environments_controller.rb:38 +msgid "Can't update locker environment" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:24 +#: app/views/providers/_products_repos.html.haml:59 +#: app/views/providers/_products_repos.html.haml:103 +#: app/views/providers/_edit_product.html.haml:34 +#: app/views/roles/_permission.html.haml:42 +#: app/views/sync_management/index.html.haml:3 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Cancel" +msgstr "" + +#: app/views/users/_edit.html.haml:23 +msgid "Change Password" +msgstr "" + +#: app/views/packages/_changelog.html.haml:9 config/navigation.rb:45 +msgid "Changelog" +msgstr "" + +#: config/navigation.rb:53 +msgid "Changeset History" +msgstr "" + +#: app/views/changesets/_changeset.html.haml:21 +msgid "Changeset Summary" +msgstr "" + +#: app/controllers/changesets_controller.rb:27 +msgid "Changeset storage errors" +msgstr "" + +#: app/controllers/changesets_controller.rb:37 +msgid "Changesets" +msgstr "" + +#: app/views/systems/_edit.html.haml:54 +msgid "Checked In" +msgstr "" + +#: app/views/users/_edit.html.haml:20 +msgid "Clear" +msgstr "" + +#: app/views/users/_edit.html.haml:17 +msgid "Clear Disabled Helptips" +msgstr "" + +#: app/controllers/users_controller.rb:103 +msgid "Cleared" +msgstr "" + +#: app/views/common/_panel.html.haml:7 +msgid "Click New to create a new" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:21 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Click to edit" +msgstr "" + +#: app/views/promotions/show.html.haml:51 app/views/common/_panel.html.haml:17 +#: app/views/common/_panel.html.haml:26 +msgid "Close" +msgstr "" + +#: app/views/common/_env_select.html.haml:7 +msgid "Collapse" +msgstr "" + +#: app/views/users/_edit.html.haml:30 app/views/users/_new.html.haml:19 +msgid "Confirm" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:22 +msgid "Consumed Subscriptions" +msgstr "" + +#: app/helpers/promotions_helper.rb:31 app/views/content/index.html.haml:1 +msgid "Content" +msgstr "" + +#: config/navigation.rb:22 +msgid "Content Management" +msgstr "" + +#: app/views/layouts/_footer.haml:7 +msgid "Copyright © " +msgstr "" + +#: app/views/environments/_new.html.haml:24 config/navigation.rb:24 +msgid "Create" +msgstr "" + +#: app/views/environments/_new.html.haml:2 +msgid "Create Environment" +msgstr "" + +#: app/views/notices/show.html.haml:19 +msgid "Created" +msgstr "" + +#: app/views/promotions/show.html.haml:40 +msgid "Current Changeset" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:18 +msgid "Current Subscriptions" +msgstr "" + +#: app/views/dashboard/index.html.haml:2 config/navigation.rb:8 +msgid "Dashboard" +msgstr "" + +#: app/views/notices/show.html.haml:37 +msgid "Delete All" +msgstr "" + +#: app/views/packages/_dependencies.html.haml:12 +#: app/views/changesets/_changeset.html.haml:45 config/navigation.rb:44 +msgid "Dependencies" +msgstr "" + +#: app/views/providers/_edit.html.haml:19 +#: app/views/providers/_form.html.haml:12 +#: app/views/providers/_products_repos.html.haml:34 +#: app/views/providers/_edit_product.html.haml:12 +#: app/views/sync_plans/_edit.html.haml:13 +#: app/views/sync_plans/_form.html.haml:10 +#: app/views/organizations/_edit.html.haml:12 +#: app/views/organizations/_new.html.haml:12 +#: app/views/environments/_edit.html.haml:18 +#: app/views/environments/_new.html.haml:14 +#: app/views/systems/_edit.html.haml:29 app/views/packages/_show.html.haml:19 +#: app/views/notices/show.html.haml:23 app/views/errata/_show.html.haml:45 +msgid "Description" +msgstr "" + +#: app/views/changesets/_edit.html.haml:9 config/navigation.rb:43 +#: config/navigation.rb:49 +msgid "Details" +msgstr "" + +#: app/controllers/users_controller.rb:102 +msgid "Disabled help tips have been re-enabled." +msgstr "" + +#: app/views/packages/_show.html.haml:89 +msgid "Download" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:3 +msgid "Edit Product" +msgstr "" + +#: app/views/providers/_edit.html.haml:4 +msgid "Edit Provider" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:3 +msgid "Edit Repository" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:5 +msgid "Edit Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:2 +msgid "Edit User" +msgstr "" + +#: app/views/users/_edit.html.haml:12 +msgid "Enable inline help" +msgstr "" + +#: app/views/environments/_edit.html.haml:6 +msgid "Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:16 +msgid "Environment Promotion Paths" +msgstr "" + +#: app/models/kp_environment.rb:15 +msgid "Environment cannot be in its own promotion path" +msgstr "" + +#: app/helpers/promotions_helper.rb:49 +#: app/views/promotions/_detail.html.haml:18 +#: app/views/changesets/_edit.html.haml:33 +#: app/views/changesets/_changeset.html.haml:30 +msgid "Errata" +msgstr "" + +#: app/views/sync_management/index.html.haml:3 +msgid "Error" +msgstr "" + +#: app/controllers/sync_management_controller.rb:25 +msgid "Error syncing!" +msgstr "" + +#: app/views/sync_management/_products.html.haml:9 +msgid "Est Size (Packages)" +msgstr "" + +#: app/views/common/_env_select.html.haml:5 +msgid "Expand" +msgstr "" + +#: app/views/systems/_facts.html.haml:10 +msgid "Fact" +msgstr "" + +#: config/navigation.rb:68 +msgid "Facts" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:52 +msgid "File" +msgstr "" + +#: app/views/packages/_filelist.html.haml:8 config/navigation.rb:46 +msgid "Filelist" +msgstr "" + +#: app/views/products/index.haml:8 +msgid "Filter" +msgstr "" + +#: app/views/sync_management/_products.html.haml:8 +msgid "Finish Time" +msgstr "" + +#: config/navigation.rb:63 +msgid "General" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Good" +msgstr "" + +#: app/views/systems/_facts.html.haml:9 +msgid "Group" +msgstr "" + +#: config/navigation.rb:76 +msgid "Groups" +msgstr "" + +#: app/views/systems/_edit.html.haml:13 +msgid "ID" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:17 +#: app/views/sync_plans/_form.html.haml:15 +msgid "Interval" +msgstr "" + +#: app/views/errata/_show.html.haml:19 +msgid "Issued" +msgstr "" + +#: app/helpers/application_helper.rb:19 +msgid "Katello" +msgstr "" + +#: app/views/systems/_edit.html.haml:62 +msgid "Last Booted" +msgstr "" + +#: app/views/notices/show.html.haml:21 +msgid "Level" +msgstr "" + +#: app/views/packages/_show.html.haml:77 +msgid "License" +msgstr "" + +#: config/navigation.rb:80 +msgid "List" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:16 +msgid "" +"Listed below are the products available from the selected provider, as well " +"as the related subscription information. If you have a subscription " +"manifest you may upload it below. This manifest may be obtained by visiting " +"the Red Hat Customer Portal or by contacting your support representative." +msgstr "" + +#: app/views/systems/_edit.html.haml:45 +msgid "Location" +msgstr "" + +#: app/controllers/environments_controller.rb:39 +#: app/controllers/environments_controller.rb:73 +#: app/views/environments/_new.html.haml:21 +#: app/views/common/_env_select.html.haml:14 +#: app/views/common/_env_select.html.haml:29 +msgid "Locker" +msgstr "" + +#: app/views/user_sessions/new.html.haml:5 +#: app/views/user_sessions/new.html.haml:18 +msgid "Log In" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:41 +msgid "Login Successful" +msgstr "" + +#: app/views/layouts/_footer.haml:5 app/views/layouts/_header.haml:23 +#: app/views/accounts/show.html.haml:6 +msgid "Logout" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:50 +msgid "Logout Successful" +msgstr "" + +#: app/views/providers/schedule.html.haml:2 +msgid "Manage Providers" +msgstr "" + +#: config/navigation.rb:10 +msgid "Monitors" +msgstr "" + +#: app/views/providers/_edit.html.haml:14 +#: app/views/providers/_edit_repository.html.haml:7 +#: app/views/providers/_form.html.haml:6 +#: app/views/providers/_products_repos.html.haml:29 +#: app/views/providers/_products_repos.html.haml:91 +#: app/views/providers/_edit_product.html.haml:7 +#: app/views/providers/_subscriptions.html.haml:21 +#: app/views/sync_plans/_edit.html.haml:9 +#: app/views/sync_plans/_form.html.haml:5 +#: app/views/organizations/_new.html.haml:7 +#: app/views/environments/_edit.html.haml:13 +#: app/views/environments/_new.html.haml:8 +#: app/views/systems/_edit.html.haml:25 +#: app/views/systems/_packages.html.haml:7 app/views/roles/_edit.html.haml:10 +#: app/views/roles/_new.html.haml:8 app/views/packages/_show.html.haml:11 +#: app/views/changesets/_edit.html.haml:14 +msgid "Name" +msgstr "" + +#: app/views/changesets/_name.html.haml:3 +msgid "Name:" +msgstr "" + +#: app/views/organizations/_new.html.haml:2 +msgid "New Organization" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:25 +msgid "New Product" +msgstr "" + +#: app/views/providers/_new.html.haml:4 +msgid "New Provider" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:87 +msgid "New Repository" +msgstr "" + +#: app/views/roles/_new.html.haml:3 +msgid "New Role" +msgstr "" + +#: app/views/sync_plans/_new.html.haml:4 +msgid "New Sync Plan" +msgstr "" + +#: app/views/users/_new.html.haml:2 +msgid "New User" +msgstr "" + +#: app/views/organizations/_edit.html.haml:31 +msgid "" +"No environments are available in this organization. Please add some " +"environments to be able register systems to this organization." +msgstr "" + +#: app/views/promotions/_errata.html.haml:3 +msgid "No errata available." +msgstr "" + +#: app/views/promotions/_packages.html.haml:3 +msgid "No packages available for promotion" +msgstr "" + +#: app/views/promotions/_products.html.haml:3 +msgid "No products" +msgstr "" + +#: app/views/systems/_edit.html.haml:63 +msgid "None" +msgstr "" + +#: app/controllers/providers_controller.rb:109 +msgid "None Imported" +msgstr "" + +#: app/controllers/sync_management_controller.rb:27 +msgid "Not synced." +msgstr "" + +#: config/navigation.rb:14 +msgid "Notifications" +msgstr "" + +#: app/views/systems/_edit.html.haml:33 +msgid "OS" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:18 +msgid "" +"On Products & Repositories you can add your own Products and Repositories to " +"your Provider. This allows you to synchronize content from any remote " +"repository to this server. Simply add a Product and then setup one or more " +"repositories to add to this Provider. This feature is only available for " +"Custom Providers." +msgstr "" + +#: app/models/provider.rb:46 +msgid "Only one Red Hat provider permitted for an Organization" +msgstr "" + +#: app/helpers/application_helper.rb:23 +msgid "Open Source Systems Management" +msgstr "" + +#: app/controllers/organizations_controller.rb:36 +msgid "Organization" +msgstr "" + +#: app/controllers/organizations_controller.rb:34 config/navigation.rb:79 +msgid "Organizations" +msgstr "" + +#: app/views/organizations/index.html.haml:14 +msgid "" +"Organizations allow content and systems to be separated by logical " +"divisions. To edit the environments within an organization, click on that " +"organization and then click on the desired environment." +msgstr "" + +#: app/views/promotions/show.html.haml:13 +msgid "Package Dependencies" +msgstr "" + +#: app/views/packages/_show.html.haml:83 +msgid "Package Group" +msgstr "" + +#: app/views/packages/_show.html.haml:51 +msgid "Package Size" +msgstr "" + +#: app/helpers/promotions_helper.rb:45 +#: app/views/promotions/_detail.html.haml:14 +#: app/views/changesets/_edit.html.haml:39 +#: app/views/changesets/_changeset.html.haml:36 +#: app/views/changesets/_changeset.html.haml:47 +#: app/views/errata/_packages.html.haml:10 config/navigation.rb:50 +#: config/navigation.rb:71 +msgid "Packages" +msgstr "" + +#: app/views/users/_new.html.haml:12 +msgid "Password" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Password Strength" +msgstr "" + +#: app/views/roles/_permission.html.haml:4 +msgid "Permission" +msgstr "" + +#: app/controllers/roles_controller.rb:116 +msgid "Permission created." +msgstr "" + +#: app/views/common/403.html.haml:1 +msgid "Permission denied" +msgstr "" + +#: app/controllers/roles_controller.rb:106 +msgid "Permission updated." +msgstr "" + +#: app/controllers/sync_plans_controller.rb:21 +#: app/controllers/sync_schedules_controller.rb:29 +#: app/controllers/sync_schedules_controller.rb:35 +msgid "Plan" +msgstr "" + +#: app/views/common/403.html.haml:4 +msgid "Please request the required privileges from an administrator." +msgstr "" + +#: app/views/environments/_new.html.haml:19 +msgid "Prior Environment" +msgstr "" + +#: app/views/environments/_edit.html.haml:24 +msgid "Prior Environments" +msgstr "" + +#: app/views/sync_management/_products.html.haml:6 +msgid "Product" +msgstr "" + +#: app/controllers/providers_controller.rb:71 +msgid "Product created." +msgstr "" + +#: app/controllers/providers_controller.rb:84 +msgid "Product removed." +msgstr "" + +#: app/helpers/promotions_helper.rb:35 app/views/products/index.haml:15 +#: app/views/promotions/_detail.html.haml:5 +#: app/views/sync_management/_products.html.haml:2 +#: app/views/changesets/_edit.html.haml:27 +#: app/views/changesets/_changeset.html.haml:25 +msgid "Products" +msgstr "" + +#: config/navigation.rb:31 +msgid "Products & Repositories" +msgstr "" + +#: app/views/sync_management/_products.html.haml:10 +msgid "Progress" +msgstr "" + +#: app/views/promotions/show.html.haml:46 +msgid "Promote to" +msgstr "" + +#: app/views/promotions/_packages.html.haml:8 +msgid "Promoted" +msgstr "" + +#: app/views/changesets/_edit.html.haml:19 +msgid "Promotion Date" +msgstr "" + +#: config/navigation.rb:41 +msgid "Promotions" +msgstr "" + +#: app/views/promotions/show.html.haml:36 +msgid "" +"Promotions allow you to promote content from one environment to the next " +"along a promotion path. Clicking \"Add\" next to one or more products will " +"add them to the change set. If products already exist in the next " +"environment, you may promote other types of content. Once you have created a " +"change set, click the \"Promote\" button to commit it to the next " +"environment." +msgstr "" + +#: app/controllers/providers_controller.rb:141 +msgid "Provider" +msgstr "" + +#: app/controllers/providers_controller.rb:139 config/navigation.rb:23 +msgid "Providers" +msgstr "" + +#: app/views/providers/index.html.haml:13 +msgid "" +"Providers provide many types of content such as packages, errata, kickstart " +"trees, and installation disc images. A provider may be delivering all of " +"your paid content or it could simply be a local yum repostory providing a " +"few yum repos." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:27 +msgid "Provides" +msgstr "" + +#: config/navigation.rb:87 +msgid "Proxies" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:23 +msgid "Quantity Available" +msgstr "" + +#: app/controllers/sync_management_controller.rb:23 +msgid "Queued." +msgstr "" + +#: app/views/systems/_edit.html.haml:58 config/navigation.rb:61 +msgid "Registered" +msgstr "" + +#: app/views/systems/_edit.html.haml:37 +msgid "Release" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:22 +#: app/views/providers/_edit_product.html.haml:32 +#: app/views/promotions/_packages.html.haml:11 +#: app/views/promotions/_products.html.haml:8 +#: app/views/promotions/_errata.html.haml:10 +msgid "Remove" +msgstr "" + +#: app/views/environments/_edit.html.haml:30 +msgid "Remove Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:39 +msgid "Remove Organization" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +msgid "Remove Provider" +msgstr "" + +#: app/views/roles/_edit.html.haml:24 +msgid "Remove Role" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:28 +msgid "Remove Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:50 +msgid "Remove User" +msgstr "" + +#: app/controllers/providers_controller.rb:57 +msgid "Repo removed." +msgstr "" + +#: config/navigation.rb:12 +msgid "Reports" +msgstr "" + +#: app/views/providers/_edit.html.haml:30 +#: app/views/providers/_form.html.haml:24 +msgid "Repository Url" +msgstr "" + +#: app/controllers/providers_controller.rb:49 +msgid "Repository created." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:19 +msgid "Requires" +msgstr "" + +#: app/controllers/roles_controller.rb:33 app/views/roles/_edit.html.haml:5 +msgid "Role" +msgstr "" + +#: app/controllers/roles_controller.rb:51 +msgid "Role created." +msgstr "" + +#: app/controllers/roles_controller.rb:65 +msgid "Role updated." +msgstr "" + +#: app/controllers/roles_controller.rb:31 app/views/users/_edit.html.haml:42 +#: config/navigation.rb:86 +msgid "Roles" +msgstr "" + +#: app/controllers/sync_management_controller.rb:26 +msgid "Running." +msgstr "" + +#: app/views/providers/_form.html.haml:29 +#: app/views/sync_plans/_form.html.haml:32 +#: app/views/organizations/_new.html.haml:16 +#: app/views/roles/_permission.html.haml:39 +#: app/views/common/_edit_i18n.html.haml:3 app/views/users/_edit.html.haml:35 +msgid "Save" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:57 +msgid "Save Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:101 +msgid "Save Repository" +msgstr "" + +#: app/views/users/_edit.html.haml:48 +msgid "Save Roles" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:9 +msgid "Save Subscriptions" +msgstr "" + +#: app/views/users/_new.html.haml:28 +msgid "Save User" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Saving..." +msgstr "" + +#: app/views/providers/schedule.html.haml:4 +msgid "Schedule" +msgstr "" + +#: app/views/roles/_permission.html.haml:20 +#: app/views/roles/_closed_permission.html.haml:8 +msgid "Scope" +msgstr "" + +#: app/views/notices/show.html.haml:8 app/views/common/_panel.html.haml:44 +msgid "Search" +msgstr "" + +#: app/views/sync_management/_products.html.haml:74 +msgid "Select All" +msgstr "" + +#: app/views/sync_management/_products.html.haml:71 +msgid "Select None" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:33 +msgid "Select Plans to apply to selected Products" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:27 +msgid "Select Products to schedule" +msgstr "" + +#: app/views/common/_panel.html.haml:11 +msgid "Select Result" +msgstr "" + +#: app/views/packages/_show.html.haml:42 +msgid "Signature" +msgstr "" + +#: app/views/packages/_show.html.haml:96 +msgid "Source Package" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:35 +msgid "Specify Local Manifest" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:21 +#: app/views/sync_plans/_form.html.haml:20 +msgid "Start Date" +msgstr "" + +#: app/views/sync_management/_products.html.haml:7 +msgid "Start Time" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Strong" +msgstr "" + +#: app/controllers/providers_controller.rb:96 +msgid "Subscription uploaded successfully" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:4 config/navigation.rb:29 +#: config/navigation.rb:65 +msgid "Subscriptions" +msgstr "" + +#: app/views/products/index.haml:21 +msgid "Sync" +msgstr "" + +#: config/navigation.rb:35 +msgid "Sync Management" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:19 config/navigation.rb:37 +msgid "Sync Plans" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:57 +msgid "Sync Plans applied successfully." +msgstr "" + +#: config/navigation.rb:38 +msgid "Sync Schedule" +msgstr "" + +#: config/navigation.rb:36 +msgid "Sync Status" +msgstr "" + +#: app/controllers/sync_management_controller.rb:24 +#: app/views/sync_management/index.html.haml:3 +msgid "Sync complete." +msgstr "" + +#: app/views/products/index.haml:11 +msgid "Synced" +msgstr "" + +#: app/views/sync_management/_products.html.haml:75 +msgid "Synchronize Now" +msgstr "" + +#: app/views/systems/_edit.html.haml:3 app/views/systems/_packages.html.haml:1 +#: app/views/systems/_facts.html.haml:1 +#: app/views/systems/_subscriptions.html.haml:1 +msgid "System" +msgstr "" + +#: app/views/systems/_edit.html.haml:50 +msgid "System Events" +msgstr "" + +#: app/views/systems/_edit.html.haml:9 +msgid "System Info" +msgstr "" + +#: app/views/systems/_edit.html.haml:21 +msgid "System Properties" +msgstr "" + +#: app/controllers/systems_controller.rb:43 +msgid "System subscriptions updated." +msgstr "" + +#: app/controllers/systems_controller.rb:64 +msgid "System updated." +msgstr "" + +#: app/controllers/systems_controller.rb:26 config/navigation.rb:59 +msgid "Systems" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "The passwords do not match" +msgstr "" + +#: app/controllers/providers_controller.rb:99 +msgid "There was a format error with your Subscription Manifest" +msgstr "" + +#: app/views/dashboard/index.html.haml:6 +msgid "" +"This is to be the Dashboard area containing Monitors, Reporting, and " +"Workflow branches." +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:25 +#: app/views/sync_plans/_form.html.haml:25 +msgid "Time" +msgstr "" + +#: app/views/providers/_edit.html.haml:24 +#: app/views/providers/_edit_repository.html.haml:17 +#: app/views/providers/_form.html.haml:18 +#: app/views/roles/_permission.html.haml:13 +#: app/views/roles/_closed_permission.html.haml:3 +#: app/views/errata/_show.html.haml:12 +msgid "Type" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:44 +msgid "Types" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:12 +#: app/views/providers/_products_repos.html.haml:39 +#: app/views/providers/_products_repos.html.haml:96 +#: app/views/providers/_edit_product.html.haml:19 +msgid "URL" +msgstr "" + +#: app/views/systems/_edit.html.haml:17 +msgid "UUID" +msgstr "" + +#: app/views/products/index.haml:13 +msgid "Unsynced" +msgstr "" + +#: app/views/errata/_show.html.haml:25 +msgid "Updated" +msgstr "" + +#: config/navigation.rb:54 +msgid "Updates Bundle" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:38 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Upload" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:32 +msgid "Upload Subscription Manifest" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Uploading" +msgstr "" + +#: app/controllers/users_controller.rb:35 +msgid "User" +msgstr "" + +#: app/views/notices/show.html.haml:11 +msgid "User Notifications" +msgstr "" + +#: app/views/notices/show.html.haml:15 +msgid "" +"User notifications lists all notifications generated by a user as well as " +"global notifications that are sent to all users." +msgstr "" + +#: app/controllers/users_controller.rb:72 +msgid "User updated successfully." +msgstr "" + +#: app/views/users/_edit.html.haml:7 app/views/users/_new.html.haml:7 +msgid "Username" +msgstr "" + +#: app/controllers/users_controller.rb:33 config/navigation.rb:85 +msgid "Users" +msgstr "" + +#: app/views/systems/_facts.html.haml:11 +msgid "Value" +msgstr "" + +#: app/views/roles/_permission.html.haml:30 +#: app/views/roles/_closed_permission.html.haml:15 +msgid "Verbs" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Very Weak" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Weak" +msgstr "" + +#: app/controllers/application_controller.rb:205 +msgid "Welcome Back!" +msgstr "" + +#: config/navigation.rb:16 +msgid "Workflow" +msgstr "" + +#: app/views/common/403.html.haml:3 +msgid "You are not authorised to perform this action." +msgstr "" + +#: app/controllers/application_controller.rb:162 +#: app/controllers/application_controller.rb:195 +msgid "You must be logged in to access that page." +msgstr "" + +#: app/controllers/application_controller.rb:176 +msgid "" +"You must have at least one organization in your database to access that " +"page. Might need to run 'rake db:seed'" +msgstr "" + +#: app/controllers/failed_authentication_controller.rb:18 +msgid "" +"You've entered an incorrect username or password combination, please try " +"again." +msgstr "" + +#: app/views/providers/_products_repos.html.haml:47 +msgid "Yum" +msgstr "" + +#: app/models/katello_name_format_validator.rb:20 +msgid "can't be blank" +msgstr "" + +#: app/models/katello_name_format_validator.rb:16 +msgid "cannot contain characters other than alpha numerals, space,'_', '-'." +msgstr "" + +#: app/models/username_validator.rb:16 +msgid "cannot contain characters other than alpha numerals,'_', '-'." +msgstr "" + +#: app/controllers/changesets_controller.rb:40 +msgid "changeset" +msgstr "" + +#: app/models/kp_environment.rb:27 +msgid "environment cannot be a prior to a different environment" +msgstr "" + +#: app/models/kp_environment.rb:69 +msgid "must be unique within one organization" +msgstr "" + +#: app/models/no_trailing_space_validator.rb:20 +msgid "must not contain leading or trailing white spaces." +msgstr "" + +#: app/controllers/organizations_controller.rb:37 +msgid "organization" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:22 +#: app/controllers/sync_schedules_controller.rb:36 +msgid "plan" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:30 +msgid "product" +msgstr "" + +#: app/controllers/sync_management_controller.rb:150 +msgid "product was synced successfully" +msgstr "" + +#: app/controllers/sync_management_controller.rb:147 +msgid "product was synced successfully with errors. See log for details" +msgstr "" + +#: app/controllers/providers_controller.rb:142 +msgid "provider" +msgstr "" + +#: app/controllers/roles_controller.rb:34 +msgid "role" +msgstr "" + +#: app/controllers/sync_management_controller.rb:155 +msgid "sync did not complete successfully" +msgstr "" + +#: app/controllers/systems_controller.rb:29 +msgid "system" +msgstr "" + +#: app/controllers/users_controller.rb:36 +msgid "user" +msgstr "" diff --git a/locale/ja/app.po b/locale/ja/app.po new file mode 100644 index 00000000000..ad400afac81 --- /dev/null +++ b/locale/ja/app.po @@ -0,0 +1,1231 @@ +# Japanese translations for version package. +# Copyright (C) 2011 THE version'S COPYRIGHT HOLDER +# This file is distributed under the same license as the version package. +# Jason E. Rist , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2011-06-01 15:16-0600\n" +"PO-Revision-Date: 2011-01-10 17:59-0700\n" +"Last-Translator: Jason E. Rist \n" +"Language-Team: Japanese\n" +"Language: ja\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: app/views/layouts/_footer.haml:7 +msgid " Red Hat, Inc." +msgstr " Red Hat, Inc." + +#: app/controllers/users_controller.rb:52 +msgid " created successfully." +msgstr "正常ã«ä½œæˆã•ã‚Œã¾ã—ãŸã€‚" + +#: app/models/kp_environment.rb:38 +msgid " environment cannot be set to an environment already on its path" +msgstr "環境ã¯ã€ãã®ãƒ‘ス上ã«æ—¢ã«ç’°å¢ƒã«è¨­å®šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“" + +#: app/helpers/translation_helper.rb:15 +msgid "%{relative_time} ago" +msgstr "%{relative_time} å‰" + +#: app/views/common/_panel.html.haml:39 +msgid "+ New " +msgstr "" + +#: app/views/products/index.haml:4 +msgid "Actions" +msgstr "アクション" + +#: app/views/promotions/_packages.html.haml:14 +#: app/views/promotions/_products.html.haml:11 +#: app/views/promotions/_errata.html.haml:13 +msgid "Add" +msgstr "追加" + +#: app/views/roles/_edit.html.haml:20 +msgid "Add Permission" +msgstr "アクセス許å¯ã‚’追加ã™ã‚‹" + +#: app/views/providers/_products_repos.html.haml:23 +msgid "Add Product" +msgstr "追加製å“" + +#: app/views/providers/_products_repos.html.haml:85 +msgid "Add Repository" +msgstr "リãƒã‚¸ãƒˆãƒªãƒ¼ã®è¿½åŠ " + +#: app/views/operations/index.html.haml:2 config/navigation.rb:84 +msgid "Administration" +msgstr "登録" + +#: app/views/roles/_permission.html.haml:23 +#: app/views/roles/_permission.html.haml:33 +#: app/views/roles/_closed_permission.html.haml:11 +#: app/views/roles/_closed_permission.html.haml:18 +msgid "All" +msgstr "ã™ã¹ã¦" + +#: app/helpers/promotions_helper.rb:33 +#: app/views/promotions/_detail.html.haml:8 +msgid "All Errata" +msgstr "ã™ã¹ã¦ã®ã‚¨ãƒ©ãƒ¼ã‚¿" + +#: app/views/sync_schedules/index.html.haml:12 +msgid "Apply Selected Plans to Selected Products" +msgstr "" + +#: app/views/systems/_edit.html.haml:41 +#: app/views/systems/_packages.html.haml:8 +msgid "Arch" +msgstr "" + +#: app/views/packages/_show.html.haml:25 +msgid "Architecture" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +#: app/views/sync_plans/_edit.html.haml:28 +#: app/views/organizations/_edit.html.haml:38 +#: app/views/environments/_edit.html.haml:29 +#: app/views/roles/_edit.html.haml:24 app/views/notices/show.html.haml:37 +#: app/views/common/_common_i18n.html.haml:3 +#: app/views/users/_edit.html.haml:50 +msgid "Are you sure?" +msgstr "" + +#: app/views/errata/_show.html.haml:39 +msgid "Associated Bugs" +msgstr "" + +#: app/views/promotions/show.html.haml:59 +msgid "Available Content" +msgstr "" + +#: app/views/common/403.html.haml:7 +msgid "Back" +msgstr "" + +#: config/navigation.rb:27 +msgid "Basics" +msgstr "" + +#: app/views/packages/_show.html.haml:70 +msgid "Build Date" +msgstr "" + +#: app/views/packages/_show.html.haml:64 +msgid "Build Host" +msgstr "" + +#: app/controllers/api/environments_controller.rb:38 +#, fuzzy +msgid "Can't update locker environment" +msgstr "環境を作æˆã™ã‚‹" + +#: app/views/providers/_edit_repository.html.haml:24 +#: app/views/providers/_products_repos.html.haml:59 +#: app/views/providers/_products_repos.html.haml:103 +#: app/views/providers/_edit_product.html.haml:34 +#: app/views/roles/_permission.html.haml:42 +#: app/views/sync_management/index.html.haml:3 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Cancel" +msgstr "" + +#: app/views/users/_edit.html.haml:23 +msgid "Change Password" +msgstr "" + +#: app/views/packages/_changelog.html.haml:9 config/navigation.rb:45 +msgid "Changelog" +msgstr "" + +#: config/navigation.rb:53 +msgid "Changeset History" +msgstr "" + +#: app/views/changesets/_changeset.html.haml:21 +msgid "Changeset Summary" +msgstr "" + +#: app/controllers/changesets_controller.rb:27 +msgid "Changeset storage errors" +msgstr "" + +#: app/controllers/changesets_controller.rb:37 +msgid "Changesets" +msgstr "" + +#: app/views/systems/_edit.html.haml:54 +msgid "Checked In" +msgstr "" + +#: app/views/users/_edit.html.haml:20 +msgid "Clear" +msgstr "" + +#: app/views/users/_edit.html.haml:17 +msgid "Clear Disabled Helptips" +msgstr "" + +#: app/controllers/users_controller.rb:103 +msgid "Cleared" +msgstr "" + +#: app/views/common/_panel.html.haml:7 +msgid "Click New to create a new" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:21 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Click to edit" +msgstr "" + +#: app/views/promotions/show.html.haml:51 app/views/common/_panel.html.haml:17 +#: app/views/common/_panel.html.haml:26 +msgid "Close" +msgstr "é–‰ã˜ã‚‹" + +#: app/views/common/_env_select.html.haml:7 +msgid "Collapse" +msgstr "" + +#: app/views/users/_edit.html.haml:30 app/views/users/_new.html.haml:19 +msgid "Confirm" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:22 +#, fuzzy +msgid "Consumed Subscriptions" +msgstr "サブスクリプション" + +#: app/helpers/promotions_helper.rb:31 app/views/content/index.html.haml:1 +msgid "Content" +msgstr "コンテンツロッカー" + +#: config/navigation.rb:22 +msgid "Content Management" +msgstr "コンテンツ管ç†" + +#: app/views/layouts/_footer.haml:7 +msgid "Copyright © " +msgstr "" + +#: app/views/environments/_new.html.haml:24 config/navigation.rb:24 +msgid "Create" +msgstr "作æˆ" + +#: app/views/environments/_new.html.haml:2 +msgid "Create Environment" +msgstr "環境を作æˆã™ã‚‹" + +#: app/views/notices/show.html.haml:19 +#, fuzzy +msgid "Created" +msgstr "作æˆ" + +#: app/views/promotions/show.html.haml:40 +#, fuzzy +msgid "Current Changeset" +msgstr "コンテンツ管ç†" + +#: app/views/providers/_subscriptions.html.haml:18 +#, fuzzy +msgid "Current Subscriptions" +msgstr "サブスクリプション" + +#: app/views/dashboard/index.html.haml:2 config/navigation.rb:8 +msgid "Dashboard" +msgstr "ダッシュボード" + +#: app/views/notices/show.html.haml:37 +#, fuzzy +msgid "Delete All" +msgstr "検索" + +#: app/views/packages/_dependencies.html.haml:12 +#: app/views/changesets/_changeset.html.haml:45 config/navigation.rb:44 +msgid "Dependencies" +msgstr "" + +#: app/views/providers/_edit.html.haml:19 +#: app/views/providers/_form.html.haml:12 +#: app/views/providers/_products_repos.html.haml:34 +#: app/views/providers/_edit_product.html.haml:12 +#: app/views/sync_plans/_edit.html.haml:13 +#: app/views/sync_plans/_form.html.haml:10 +#: app/views/organizations/_edit.html.haml:12 +#: app/views/organizations/_new.html.haml:12 +#: app/views/environments/_edit.html.haml:18 +#: app/views/environments/_new.html.haml:14 +#: app/views/systems/_edit.html.haml:29 app/views/packages/_show.html.haml:19 +#: app/views/notices/show.html.haml:23 app/views/errata/_show.html.haml:45 +msgid "Description" +msgstr "概è¦" + +#: app/views/changesets/_edit.html.haml:9 config/navigation.rb:43 +#: config/navigation.rb:49 +msgid "Details" +msgstr "" + +#: app/controllers/users_controller.rb:102 +msgid "Disabled help tips have been re-enabled." +msgstr "" + +#: app/views/packages/_show.html.haml:89 +msgid "Download" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:3 +msgid "Edit Product" +msgstr "" + +#: app/views/providers/_edit.html.haml:4 +#, fuzzy +msgid "Edit Provider" +msgstr "コンテンツプロãƒã‚¤ãƒ€ãƒ¼" + +#: app/views/providers/_edit_repository.html.haml:3 +msgid "Edit Repository" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:5 +msgid "Edit Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:2 +#, fuzzy +msgid "Edit User" +msgstr "編集ã™ã‚‹" + +#: app/views/users/_edit.html.haml:12 +msgid "Enable inline help" +msgstr "" + +#: app/views/environments/_edit.html.haml:6 +#, fuzzy +msgid "Environment" +msgstr "環境" + +#: app/views/organizations/_edit.html.haml:16 +#, fuzzy +msgid "Environment Promotion Paths" +msgstr "環境" + +#: app/models/kp_environment.rb:15 +msgid "Environment cannot be in its own promotion path" +msgstr "" + +#: app/helpers/promotions_helper.rb:49 +#: app/views/promotions/_detail.html.haml:18 +#: app/views/changesets/_edit.html.haml:33 +#: app/views/changesets/_changeset.html.haml:30 +msgid "Errata" +msgstr "" + +#: app/views/sync_management/index.html.haml:3 +msgid "Error" +msgstr "" + +#: app/controllers/sync_management_controller.rb:25 +msgid "Error syncing!" +msgstr "" + +#: app/views/sync_management/_products.html.haml:9 +msgid "Est Size (Packages)" +msgstr "" + +#: app/views/common/_env_select.html.haml:5 +msgid "Expand" +msgstr "" + +#: app/views/systems/_facts.html.haml:10 +msgid "Fact" +msgstr "" + +#: config/navigation.rb:68 +msgid "Facts" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:52 +msgid "File" +msgstr "" + +#: app/views/packages/_filelist.html.haml:8 config/navigation.rb:46 +msgid "Filelist" +msgstr "" + +#: app/views/products/index.haml:8 +msgid "Filter" +msgstr "" + +#: app/views/sync_management/_products.html.haml:8 +msgid "Finish Time" +msgstr "" + +#: config/navigation.rb:63 +msgid "General" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Good" +msgstr "" + +#: app/views/systems/_facts.html.haml:9 +#, fuzzy +msgid "Group" +msgstr "グループ" + +#: config/navigation.rb:76 +msgid "Groups" +msgstr "グループ" + +#: app/views/systems/_edit.html.haml:13 +msgid "ID" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:17 +#: app/views/sync_plans/_form.html.haml:15 +msgid "Interval" +msgstr "" + +#: app/views/errata/_show.html.haml:19 +msgid "Issued" +msgstr "" + +#: app/helpers/application_helper.rb:19 +msgid "Katello" +msgstr "" + +#: app/views/systems/_edit.html.haml:62 +msgid "Last Booted" +msgstr "" + +#: app/views/notices/show.html.haml:21 +msgid "Level" +msgstr "" + +#: app/views/packages/_show.html.haml:77 +msgid "License" +msgstr "" + +#: config/navigation.rb:80 +msgid "List" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:16 +msgid "" +"Listed below are the products available from the selected provider, as well " +"as the related subscription information. If you have a subscription " +"manifest you may upload it below. This manifest may be obtained by visiting " +"the Red Hat Customer Portal or by contacting your support representative." +msgstr "" + +#: app/views/systems/_edit.html.haml:45 +#, fuzzy +msgid "Location" +msgstr "通知" + +#: app/controllers/environments_controller.rb:39 +#: app/controllers/environments_controller.rb:73 +#: app/views/environments/_new.html.haml:21 +#: app/views/common/_env_select.html.haml:14 +#: app/views/common/_env_select.html.haml:29 +#, fuzzy +msgid "Locker" +msgstr "コンテンツロッカー" + +#: app/views/user_sessions/new.html.haml:5 +#: app/views/user_sessions/new.html.haml:18 +msgid "Log In" +msgstr "ログイン" + +#: app/controllers/user_sessions_controller.rb:41 +msgid "Login Successful" +msgstr "ログインæˆåŠŸ" + +#: app/views/layouts/_footer.haml:5 app/views/layouts/_header.haml:23 +#: app/views/accounts/show.html.haml:6 +msgid "Logout" +msgstr "ログアウト" + +#: app/controllers/user_sessions_controller.rb:50 +msgid "Logout Successful" +msgstr "ログアウトæˆåŠŸ" + +#: app/views/providers/schedule.html.haml:2 +#, fuzzy +msgid "Manage Providers" +msgstr "コンテンツプロãƒã‚¤ãƒ€ãƒ¼" + +#: config/navigation.rb:10 +msgid "Monitors" +msgstr "モニター" + +#: app/views/providers/_edit.html.haml:14 +#: app/views/providers/_edit_repository.html.haml:7 +#: app/views/providers/_form.html.haml:6 +#: app/views/providers/_products_repos.html.haml:29 +#: app/views/providers/_products_repos.html.haml:91 +#: app/views/providers/_edit_product.html.haml:7 +#: app/views/providers/_subscriptions.html.haml:21 +#: app/views/sync_plans/_edit.html.haml:9 +#: app/views/sync_plans/_form.html.haml:5 +#: app/views/organizations/_new.html.haml:7 +#: app/views/environments/_edit.html.haml:13 +#: app/views/environments/_new.html.haml:8 +#: app/views/systems/_edit.html.haml:25 +#: app/views/systems/_packages.html.haml:7 app/views/roles/_edit.html.haml:10 +#: app/views/roles/_new.html.haml:8 app/views/packages/_show.html.haml:11 +#: app/views/changesets/_edit.html.haml:14 +msgid "Name" +msgstr "å" + +#: app/views/changesets/_name.html.haml:3 +#, fuzzy +msgid "Name:" +msgstr "å" + +#: app/views/organizations/_new.html.haml:2 +msgid "New Organization" +msgstr "æ–°ã—ã„組織" + +#: app/views/providers/_products_repos.html.haml:25 +msgid "New Product" +msgstr "" + +#: app/views/providers/_new.html.haml:4 +#, fuzzy +msgid "New Provider" +msgstr "コンテンツプロãƒã‚¤ãƒ€ãƒ¼" + +#: app/views/providers/_products_repos.html.haml:87 +msgid "New Repository" +msgstr "" + +#: app/views/roles/_new.html.haml:3 +msgid "New Role" +msgstr "æ–°ãŸãªå½¹å‰²" + +#: app/views/sync_plans/_new.html.haml:4 +msgid "New Sync Plan" +msgstr "" + +#: app/views/users/_new.html.haml:2 +#, fuzzy +msgid "New User" +msgstr "ユーザー" + +#: app/views/organizations/_edit.html.haml:31 +msgid "" +"No environments are available in this organization. Please add some " +"environments to be able register systems to this organization." +msgstr "" + +#: app/views/promotions/_errata.html.haml:3 +msgid "No errata available." +msgstr "" + +#: app/views/promotions/_packages.html.haml:3 +msgid "No packages available for promotion" +msgstr "" + +#: app/views/promotions/_products.html.haml:3 +msgid "No products" +msgstr "" + +#: app/views/systems/_edit.html.haml:63 +msgid "None" +msgstr "ãªã—" + +#: app/controllers/providers_controller.rb:109 +msgid "None Imported" +msgstr "" + +#: app/controllers/sync_management_controller.rb:27 +msgid "Not synced." +msgstr "" + +#: config/navigation.rb:14 +msgid "Notifications" +msgstr "通知" + +#: app/views/systems/_edit.html.haml:33 +msgid "OS" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:18 +msgid "" +"On Products & Repositories you can add your own Products and Repositories to " +"your Provider. This allows you to synchronize content from any remote " +"repository to this server. Simply add a Product and then setup one or more " +"repositories to add to this Provider. This feature is only available for " +"Custom Providers." +msgstr "" + +#: app/models/provider.rb:46 +msgid "Only one Red Hat provider permitted for an Organization" +msgstr "" + +#: app/helpers/application_helper.rb:23 +msgid "Open Source Systems Management" +msgstr "" + +#: app/controllers/organizations_controller.rb:36 +#, fuzzy +msgid "Organization" +msgstr "組織" + +#: app/controllers/organizations_controller.rb:34 config/navigation.rb:79 +msgid "Organizations" +msgstr "組織" + +#: app/views/organizations/index.html.haml:14 +msgid "" +"Organizations allow content and systems to be separated by logical " +"divisions. To edit the environments within an organization, click on that " +"organization and then click on the desired environment." +msgstr "" + +#: app/views/promotions/show.html.haml:13 +msgid "Package Dependencies" +msgstr "" + +#: app/views/packages/_show.html.haml:83 +msgid "Package Group" +msgstr "" + +#: app/views/packages/_show.html.haml:51 +msgid "Package Size" +msgstr "" + +#: app/helpers/promotions_helper.rb:45 +#: app/views/promotions/_detail.html.haml:14 +#: app/views/changesets/_edit.html.haml:39 +#: app/views/changesets/_changeset.html.haml:36 +#: app/views/changesets/_changeset.html.haml:47 +#: app/views/errata/_packages.html.haml:10 config/navigation.rb:50 +#: config/navigation.rb:71 +msgid "Packages" +msgstr "" + +#: app/views/users/_new.html.haml:12 +msgid "Password" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Password Strength" +msgstr "" + +#: app/views/roles/_permission.html.haml:4 +msgid "Permission" +msgstr "" + +#: app/controllers/roles_controller.rb:116 +msgid "Permission created." +msgstr "" + +#: app/views/common/403.html.haml:1 +msgid "Permission denied" +msgstr "" + +#: app/controllers/roles_controller.rb:106 +msgid "Permission updated." +msgstr "" + +#: app/controllers/sync_plans_controller.rb:21 +#: app/controllers/sync_schedules_controller.rb:29 +#: app/controllers/sync_schedules_controller.rb:35 +msgid "Plan" +msgstr "" + +#: app/views/common/403.html.haml:4 +msgid "Please request the required privileges from an administrator." +msgstr "" + +#: app/views/environments/_new.html.haml:19 +#, fuzzy +msgid "Prior Environment" +msgstr "環境" + +#: app/views/environments/_edit.html.haml:24 +#, fuzzy +msgid "Prior Environments" +msgstr "環境" + +#: app/views/sync_management/_products.html.haml:6 +msgid "Product" +msgstr "" + +#: app/controllers/providers_controller.rb:71 +msgid "Product created." +msgstr "" + +#: app/controllers/providers_controller.rb:84 +msgid "Product removed." +msgstr "" + +#: app/helpers/promotions_helper.rb:35 app/views/products/index.haml:15 +#: app/views/promotions/_detail.html.haml:5 +#: app/views/sync_management/_products.html.haml:2 +#: app/views/changesets/_edit.html.haml:27 +#: app/views/changesets/_changeset.html.haml:25 +msgid "Products" +msgstr "" + +#: config/navigation.rb:31 +msgid "Products & Repositories" +msgstr "" + +#: app/views/sync_management/_products.html.haml:10 +msgid "Progress" +msgstr "" + +#: app/views/promotions/show.html.haml:46 +msgid "Promote to" +msgstr "" + +#: app/views/promotions/_packages.html.haml:8 +msgid "Promoted" +msgstr "" + +#: app/views/changesets/_edit.html.haml:19 +msgid "Promotion Date" +msgstr "" + +#: config/navigation.rb:41 +msgid "Promotions" +msgstr "" + +#: app/views/promotions/show.html.haml:36 +msgid "" +"Promotions allow you to promote content from one environment to the next " +"along a promotion path. Clicking \"Add\" next to one or more products will " +"add them to the change set. If products already exist in the next " +"environment, you may promote other types of content. Once you have created a " +"change set, click the \"Promote\" button to commit it to the next " +"environment." +msgstr "" + +#: app/controllers/providers_controller.rb:141 +#, fuzzy +msgid "Provider" +msgstr "コンテンツプロãƒã‚¤ãƒ€ãƒ¼" + +#: app/controllers/providers_controller.rb:139 config/navigation.rb:23 +msgid "Providers" +msgstr "コンテンツプロãƒã‚¤ãƒ€ãƒ¼" + +#: app/views/providers/index.html.haml:13 +msgid "" +"Providers provide many types of content such as packages, errata, kickstart " +"trees, and installation disc images. A provider may be delivering all of " +"your paid content or it could simply be a local yum repostory providing a " +"few yum repos." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:27 +#, fuzzy +msgid "Provides" +msgstr "コンテンツプロãƒã‚¤ãƒ€ãƒ¼" + +#: config/navigation.rb:87 +msgid "Proxies" +msgstr "プロキシ" + +#: app/views/providers/_subscriptions.html.haml:23 +msgid "Quantity Available" +msgstr "" + +#: app/controllers/sync_management_controller.rb:23 +msgid "Queued." +msgstr "" + +#: app/views/systems/_edit.html.haml:58 config/navigation.rb:61 +#, fuzzy +msgid "Registered" +msgstr "登録" + +#: app/views/systems/_edit.html.haml:37 +msgid "Release" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:22 +#: app/views/providers/_edit_product.html.haml:32 +#: app/views/promotions/_packages.html.haml:11 +#: app/views/promotions/_products.html.haml:8 +#: app/views/promotions/_errata.html.haml:10 +msgid "Remove" +msgstr "" + +#: app/views/environments/_edit.html.haml:30 +#, fuzzy +msgid "Remove Environment" +msgstr "æ–°ã—ã„環境" + +#: app/views/organizations/_edit.html.haml:39 +#, fuzzy +msgid "Remove Organization" +msgstr "æ–°ã—ã„組織" + +#: app/views/providers/_edit.html.haml:33 +#, fuzzy +msgid "Remove Provider" +msgstr "コンテンツプロãƒã‚¤ãƒ€ãƒ¼" + +#: app/views/roles/_edit.html.haml:24 +msgid "Remove Role" +msgstr "役割を削除ã™ã‚‹" + +#: app/views/sync_plans/_edit.html.haml:28 +msgid "Remove Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:50 +msgid "Remove User" +msgstr "" + +#: app/controllers/providers_controller.rb:57 +msgid "Repo removed." +msgstr "" + +#: config/navigation.rb:12 +msgid "Reports" +msgstr "レãƒãƒ¼ãƒˆ" + +#: app/views/providers/_edit.html.haml:30 +#: app/views/providers/_form.html.haml:24 +msgid "Repository Url" +msgstr "" + +#: app/controllers/providers_controller.rb:49 +msgid "Repository created." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:19 +msgid "Requires" +msgstr "" + +#: app/controllers/roles_controller.rb:33 app/views/roles/_edit.html.haml:5 +msgid "Role" +msgstr "役割" + +#: app/controllers/roles_controller.rb:51 +msgid "Role created." +msgstr "役割を作æˆ" + +#: app/controllers/roles_controller.rb:65 +msgid "Role updated." +msgstr "役割ã¯ã€æ›´æ–°ã•ã‚ŒãŸ" + +#: app/controllers/roles_controller.rb:31 app/views/users/_edit.html.haml:42 +#: config/navigation.rb:86 +msgid "Roles" +msgstr "ロール" + +#: app/controllers/sync_management_controller.rb:26 +msgid "Running." +msgstr "" + +#: app/views/providers/_form.html.haml:29 +#: app/views/sync_plans/_form.html.haml:32 +#: app/views/organizations/_new.html.haml:16 +#: app/views/roles/_permission.html.haml:39 +#: app/views/common/_edit_i18n.html.haml:3 app/views/users/_edit.html.haml:35 +msgid "Save" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:57 +msgid "Save Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:101 +msgid "Save Repository" +msgstr "" + +#: app/views/users/_edit.html.haml:48 +msgid "Save Roles" +msgstr "ä¿å­˜ã®å½¹å‰²" + +#: app/views/systems/_subscriptions.html.haml:9 +#, fuzzy +msgid "Save Subscriptions" +msgstr "サブスクリプション" + +#: app/views/users/_new.html.haml:28 +msgid "Save User" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Saving..." +msgstr "" + +#: app/views/providers/schedule.html.haml:4 +msgid "Schedule" +msgstr "" + +#: app/views/roles/_permission.html.haml:20 +#: app/views/roles/_closed_permission.html.haml:8 +msgid "Scope" +msgstr "範囲" + +#: app/views/notices/show.html.haml:8 app/views/common/_panel.html.haml:44 +msgid "Search" +msgstr "検索" + +#: app/views/sync_management/_products.html.haml:74 +#, fuzzy +msgid "Select All" +msgstr "検索" + +#: app/views/sync_management/_products.html.haml:71 +#, fuzzy +msgid "Select None" +msgstr "検索" + +#: app/controllers/sync_schedules_controller.rb:33 +msgid "Select Plans to apply to selected Products" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:27 +msgid "Select Products to schedule" +msgstr "" + +#: app/views/common/_panel.html.haml:11 +#, fuzzy +msgid "Select Result" +msgstr "検索" + +#: app/views/packages/_show.html.haml:42 +msgid "Signature" +msgstr "" + +#: app/views/packages/_show.html.haml:96 +msgid "Source Package" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:35 +msgid "Specify Local Manifest" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:21 +#: app/views/sync_plans/_form.html.haml:20 +msgid "Start Date" +msgstr "" + +#: app/views/sync_management/_products.html.haml:7 +msgid "Start Time" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Strong" +msgstr "" + +#: app/controllers/providers_controller.rb:96 +msgid "Subscription uploaded successfully" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:4 config/navigation.rb:29 +#: config/navigation.rb:65 +msgid "Subscriptions" +msgstr "サブスクリプション" + +#: app/views/products/index.haml:21 +msgid "Sync" +msgstr "" + +#: config/navigation.rb:35 +msgid "Sync Management" +msgstr "åŒæœŸç®¡ç†" + +#: app/controllers/sync_plans_controller.rb:19 config/navigation.rb:37 +msgid "Sync Plans" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:57 +msgid "Sync Plans applied successfully." +msgstr "" + +#: config/navigation.rb:38 +msgid "Sync Schedule" +msgstr "" + +#: config/navigation.rb:36 +msgid "Sync Status" +msgstr "" + +#: app/controllers/sync_management_controller.rb:24 +#: app/views/sync_management/index.html.haml:3 +msgid "Sync complete." +msgstr "" + +#: app/views/products/index.haml:11 +msgid "Synced" +msgstr "" + +#: app/views/sync_management/_products.html.haml:75 +msgid "Synchronize Now" +msgstr "" + +#: app/views/systems/_edit.html.haml:3 app/views/systems/_packages.html.haml:1 +#: app/views/systems/_facts.html.haml:1 +#: app/views/systems/_subscriptions.html.haml:1 +#, fuzzy +msgid "System" +msgstr "システム" + +#: app/views/systems/_edit.html.haml:50 +#, fuzzy +msgid "System Events" +msgstr "システム" + +#: app/views/systems/_edit.html.haml:9 +#, fuzzy +msgid "System Info" +msgstr "システム" + +#: app/views/systems/_edit.html.haml:21 +msgid "System Properties" +msgstr "" + +#: app/controllers/systems_controller.rb:43 +#, fuzzy +msgid "System subscriptions updated." +msgstr "サブスクリプション" + +#: app/controllers/systems_controller.rb:64 +msgid "System updated." +msgstr "" + +#: app/controllers/systems_controller.rb:26 config/navigation.rb:59 +msgid "Systems" +msgstr "システム" + +#: app/views/users/index.html.haml:3 +msgid "The passwords do not match" +msgstr "" + +#: app/controllers/providers_controller.rb:99 +msgid "There was a format error with your Subscription Manifest" +msgstr "" + +#: app/views/dashboard/index.html.haml:6 +msgid "" +"This is to be the Dashboard area containing Monitors, Reporting, and " +"Workflow branches." +msgstr "" +"ã“ã‚Œã¯ã€ãƒ¢ãƒ‹ã‚¿ã€ãƒ¬ãƒãƒ¼ãƒˆã€ãŠã‚ˆã³ãƒ¯ãƒ¼ã‚¯ãƒ•ãƒ­ãƒ¼ã®åˆ†å²ã‚’å«ã‚€ãƒ€ãƒƒã‚·ãƒ¥ãƒœãƒ¼ãƒ‰ã‚¨ãƒªã‚¢" +"ã•ã‚Œã‚‹ã€‚" + +#: app/views/sync_plans/_edit.html.haml:25 +#: app/views/sync_plans/_form.html.haml:25 +msgid "Time" +msgstr "" + +#: app/views/providers/_edit.html.haml:24 +#: app/views/providers/_edit_repository.html.haml:17 +#: app/views/providers/_form.html.haml:18 +#: app/views/roles/_permission.html.haml:13 +#: app/views/roles/_closed_permission.html.haml:3 +#: app/views/errata/_show.html.haml:12 +msgid "Type" +msgstr "タイプ" + +#: app/views/providers/_products_repos.html.haml:44 +msgid "Types" +msgstr "タイプ" + +#: app/views/providers/_edit_repository.html.haml:12 +#: app/views/providers/_products_repos.html.haml:39 +#: app/views/providers/_products_repos.html.haml:96 +#: app/views/providers/_edit_product.html.haml:19 +msgid "URL" +msgstr "" + +#: app/views/systems/_edit.html.haml:17 +msgid "UUID" +msgstr "" + +#: app/views/products/index.haml:13 +msgid "Unsynced" +msgstr "" + +#: app/views/errata/_show.html.haml:25 +#, fuzzy +msgid "Updated" +msgstr "æ›´æ–°" + +#: config/navigation.rb:54 +msgid "Updates Bundle" +msgstr "アップデートãƒãƒ³ãƒ‰ãƒ«" + +#: app/views/providers/_subscriptions.html.haml:38 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Upload" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:32 +#, fuzzy +msgid "Upload Subscription Manifest" +msgstr "サブスクリプション" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Uploading" +msgstr "" + +#: app/controllers/users_controller.rb:35 +#, fuzzy +msgid "User" +msgstr "ユーザー" + +#: app/views/notices/show.html.haml:11 +#, fuzzy +msgid "User Notifications" +msgstr "通知" + +#: app/views/notices/show.html.haml:15 +msgid "" +"User notifications lists all notifications generated by a user as well as " +"global notifications that are sent to all users." +msgstr "" + +#: app/controllers/users_controller.rb:72 +msgid "User updated successfully." +msgstr "" + +#: app/views/users/_edit.html.haml:7 app/views/users/_new.html.haml:7 +#, fuzzy +msgid "Username" +msgstr "ユーザー" + +#: app/controllers/users_controller.rb:33 config/navigation.rb:85 +msgid "Users" +msgstr "ユーザー" + +#: app/views/systems/_facts.html.haml:11 +msgid "Value" +msgstr "" + +#: app/views/roles/_permission.html.haml:30 +#: app/views/roles/_closed_permission.html.haml:15 +msgid "Verbs" +msgstr "å‹•è©ž" + +#: app/views/users/index.html.haml:3 +msgid "Very Weak" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Weak" +msgstr "" + +#: app/controllers/application_controller.rb:205 +msgid "Welcome Back!" +msgstr "先頭ã¸ã‚ˆã†ã“ãï¼" + +#: config/navigation.rb:16 +msgid "Workflow" +msgstr "ワークフロー" + +#: app/views/common/403.html.haml:3 +msgid "You are not authorised to perform this action." +msgstr "ã‚ãªãŸã¯ã“ã®ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’実行ã™ã‚‹æ¨©é™ãŒã‚ã‚Šã¾ã›ã‚“。" + +#: app/controllers/application_controller.rb:162 +#: app/controllers/application_controller.rb:195 +msgid "You must be logged in to access that page." +msgstr "ã‚ãªãŸã¯ãã®ãƒšãƒ¼ã‚¸ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚" + +#: app/controllers/application_controller.rb:176 +msgid "" +"You must have at least one organization in your database to access that " +"page. Might need to run 'rake db:seed'" +msgstr "" + +#: app/controllers/failed_authentication_controller.rb:18 +msgid "" +"You've entered an incorrect username or password combination, please try " +"again." +msgstr "" +"ã‚ãªãŸã¯ä¸æ­£ãªãƒ¦ãƒ¼ã‚¶åã¾ãŸã¯ãƒ‘スワードã®çµ„ã¿åˆã‚ã›ã‚’入力ã—ãŸã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦" +"ãã ã•ã„。" + +#: app/views/providers/_products_repos.html.haml:47 +msgid "Yum" +msgstr "" + +#: app/models/katello_name_format_validator.rb:20 +msgid "can't be blank" +msgstr "" + +#: app/models/katello_name_format_validator.rb:16 +msgid "cannot contain characters other than alpha numerals, space,'_', '-'." +msgstr "" + +#: app/models/username_validator.rb:16 +msgid "cannot contain characters other than alpha numerals,'_', '-'." +msgstr "" + +#: app/controllers/changesets_controller.rb:40 +msgid "changeset" +msgstr "" + +#: app/models/kp_environment.rb:27 +msgid "environment cannot be a prior to a different environment" +msgstr "" + +#: app/models/kp_environment.rb:69 +msgid "must be unique within one organization" +msgstr "" + +#: app/models/no_trailing_space_validator.rb:20 +msgid "must not contain leading or trailing white spaces." +msgstr "" + +#: app/controllers/organizations_controller.rb:37 +#, fuzzy +msgid "organization" +msgstr "組織" + +#: app/controllers/sync_plans_controller.rb:22 +#: app/controllers/sync_schedules_controller.rb:36 +msgid "plan" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:30 +msgid "product" +msgstr "" + +#: app/controllers/sync_management_controller.rb:150 +msgid "product was synced successfully" +msgstr "" + +#: app/controllers/sync_management_controller.rb:147 +msgid "product was synced successfully with errors. See log for details" +msgstr "" + +#: app/controllers/providers_controller.rb:142 +#, fuzzy +msgid "provider" +msgstr "コンテンツプロãƒã‚¤ãƒ€ãƒ¼" + +#: app/controllers/roles_controller.rb:34 +msgid "role" +msgstr "" + +#: app/controllers/sync_management_controller.rb:155 +msgid "sync did not complete successfully" +msgstr "" + +#: app/controllers/systems_controller.rb:29 +#, fuzzy +msgid "system" +msgstr "システム" + +#: app/controllers/users_controller.rb:36 +msgid "user" +msgstr "" diff --git a/locale/ko/app.po b/locale/ko/app.po new file mode 100644 index 00000000000..66d234df053 --- /dev/null +++ b/locale/ko/app.po @@ -0,0 +1,1189 @@ +# Korean translations for version package. +# Copyright (C) 2011 THE version'S COPYRIGHT HOLDER +# This file is distributed under the same license as the version package. +# Jason E. Rist , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2011-06-01 15:16-0600\n" +"PO-Revision-Date: 2011-01-07 16:45-0700\n" +"Last-Translator: Jason E. Rist \n" +"Language-Team: Korean\n" +"Language: ko\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: app/views/layouts/_footer.haml:7 +msgid " Red Hat, Inc." +msgstr "" + +#: app/controllers/users_controller.rb:52 +msgid " created successfully." +msgstr "" + +#: app/models/kp_environment.rb:38 +msgid " environment cannot be set to an environment already on its path" +msgstr "" + +#: app/helpers/translation_helper.rb:15 +msgid "%{relative_time} ago" +msgstr "" + +#: app/views/common/_panel.html.haml:39 +msgid "+ New " +msgstr "" + +#: app/views/products/index.haml:4 +msgid "Actions" +msgstr "" + +#: app/views/promotions/_packages.html.haml:14 +#: app/views/promotions/_products.html.haml:11 +#: app/views/promotions/_errata.html.haml:13 +msgid "Add" +msgstr "" + +#: app/views/organizations/_edit.html.haml:36 +msgid "Add New Environment" +msgstr "" + +#: app/views/roles/_edit.html.haml:20 +msgid "Add Permission" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:23 +msgid "Add Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:85 +msgid "Add Repository" +msgstr "" + +#: app/views/operations/index.html.haml:2 config/navigation.rb:84 +msgid "Administration" +msgstr "" + +#: app/views/roles/_permission.html.haml:23 +#: app/views/roles/_permission.html.haml:33 +#: app/views/roles/_closed_permission.html.haml:11 +#: app/views/roles/_closed_permission.html.haml:18 +msgid "All" +msgstr "" + +#: app/helpers/promotions_helper.rb:33 +#: app/views/promotions/_detail.html.haml:8 +msgid "All Errata" +msgstr "" + +#: app/views/sync_schedules/index.html.haml:12 +msgid "Apply Selected Plans to Selected Products" +msgstr "" + +#: app/views/systems/_edit.html.haml:41 +#: app/views/systems/_packages.html.haml:8 +msgid "Arch" +msgstr "" + +#: app/views/packages/_show.html.haml:25 +msgid "Architecture" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +#: app/views/sync_plans/_edit.html.haml:28 +#: app/views/organizations/_edit.html.haml:38 +#: app/views/environments/_edit.html.haml:29 +#: app/views/roles/_edit.html.haml:24 app/views/notices/show.html.haml:37 +#: app/views/common/_common_i18n.html.haml:3 +#: app/views/users/_edit.html.haml:50 +msgid "Are you sure?" +msgstr "" + +#: app/views/errata/_show.html.haml:39 +msgid "Associated Bugs" +msgstr "" + +#: app/views/promotions/show.html.haml:59 +msgid "Available Content" +msgstr "" + +#: app/views/common/403.html.haml:7 +msgid "Back" +msgstr "" + +#: config/navigation.rb:27 +msgid "Basics" +msgstr "" + +#: app/views/packages/_show.html.haml:70 +msgid "Build Date" +msgstr "" + +#: app/views/packages/_show.html.haml:64 +msgid "Build Host" +msgstr "" + +#: app/controllers/api/environments_controller.rb:38 +msgid "Can't update locker environment" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:24 +#: app/views/providers/_products_repos.html.haml:59 +#: app/views/providers/_products_repos.html.haml:103 +#: app/views/providers/_edit_product.html.haml:34 +#: app/views/roles/_permission.html.haml:42 +#: app/views/sync_management/index.html.haml:3 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Cancel" +msgstr "" + +#: app/views/users/_edit.html.haml:23 +msgid "Change Password" +msgstr "" + +#: app/views/packages/_changelog.html.haml:9 config/navigation.rb:45 +msgid "Changelog" +msgstr "" + +#: config/navigation.rb:53 +msgid "Changeset History" +msgstr "" + +#: app/views/changesets/_changeset.html.haml:21 +msgid "Changeset Summary" +msgstr "" + +#: app/controllers/changesets_controller.rb:27 +msgid "Changeset storage errors" +msgstr "" + +#: app/controllers/changesets_controller.rb:37 +msgid "Changesets" +msgstr "" + +#: app/views/systems/_edit.html.haml:54 +msgid "Checked In" +msgstr "" + +#: app/views/users/_edit.html.haml:20 +msgid "Clear" +msgstr "" + +#: app/views/users/_edit.html.haml:17 +msgid "Clear Disabled Helptips" +msgstr "" + +#: app/controllers/users_controller.rb:103 +msgid "Cleared" +msgstr "" + +#: app/views/common/_panel.html.haml:7 +msgid "Click New to create a new" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:21 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Click to edit" +msgstr "" + +#: app/views/promotions/show.html.haml:51 app/views/common/_panel.html.haml:17 +#: app/views/common/_panel.html.haml:26 +msgid "Close" +msgstr "" + +#: app/views/common/_env_select.html.haml:7 +msgid "Collapse" +msgstr "" + +#: app/views/users/_edit.html.haml:30 app/views/users/_new.html.haml:19 +msgid "Confirm" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:22 +msgid "Consumed Subscriptions" +msgstr "" + +#: app/helpers/promotions_helper.rb:31 app/views/content/index.html.haml:1 +msgid "Content" +msgstr "" + +#: config/navigation.rb:22 +msgid "Content Management" +msgstr "" + +#: app/views/layouts/_footer.haml:7 +msgid "Copyright © " +msgstr "" + +#: app/views/environments/_new.html.haml:24 config/navigation.rb:24 +msgid "Create" +msgstr "" + +#: app/views/environments/_new.html.haml:2 +msgid "Create Environment" +msgstr "" + +#: app/views/notices/show.html.haml:19 +msgid "Created" +msgstr "" + +#: app/views/promotions/show.html.haml:40 +msgid "Current Changeset" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:18 +msgid "Current Subscriptions" +msgstr "" + +#: app/views/dashboard/index.html.haml:2 config/navigation.rb:8 +msgid "Dashboard" +msgstr "" + +#: app/views/notices/show.html.haml:37 +msgid "Delete All" +msgstr "" + +#: app/views/packages/_dependencies.html.haml:12 +#: app/views/changesets/_changeset.html.haml:45 config/navigation.rb:44 +msgid "Dependencies" +msgstr "" + +#: app/views/providers/_edit.html.haml:19 +#: app/views/providers/_form.html.haml:12 +#: app/views/providers/_products_repos.html.haml:34 +#: app/views/providers/_edit_product.html.haml:12 +#: app/views/sync_plans/_edit.html.haml:13 +#: app/views/sync_plans/_form.html.haml:10 +#: app/views/organizations/_edit.html.haml:12 +#: app/views/organizations/_new.html.haml:12 +#: app/views/environments/_edit.html.haml:18 +#: app/views/environments/_new.html.haml:14 +#: app/views/systems/_edit.html.haml:29 app/views/packages/_show.html.haml:19 +#: app/views/notices/show.html.haml:23 app/views/errata/_show.html.haml:45 +msgid "Description" +msgstr "" + +#: app/views/changesets/_edit.html.haml:9 config/navigation.rb:43 +#: config/navigation.rb:49 +msgid "Details" +msgstr "" + +#: app/controllers/users_controller.rb:102 +msgid "Disabled help tips have been re-enabled." +msgstr "" + +#: app/views/packages/_show.html.haml:89 +msgid "Download" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:3 +msgid "Edit Product" +msgstr "" + +#: app/views/providers/_edit.html.haml:4 +msgid "Edit Provider" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:3 +msgid "Edit Repository" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:5 +msgid "Edit Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:2 +msgid "Edit User" +msgstr "" + +#: app/views/users/_edit.html.haml:12 +msgid "Enable inline help" +msgstr "" + +#: app/views/environments/_edit.html.haml:6 +msgid "Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:16 +msgid "Environment Promotion Paths" +msgstr "" + +#: app/models/kp_environment.rb:15 +msgid "Environment cannot be in its own promotion path" +msgstr "" + +#: app/helpers/promotions_helper.rb:49 +#: app/views/promotions/_detail.html.haml:18 +#: app/views/changesets/_edit.html.haml:33 +#: app/views/changesets/_changeset.html.haml:30 +msgid "Errata" +msgstr "" + +#: app/views/sync_management/index.html.haml:3 +msgid "Error" +msgstr "" + +#: app/controllers/sync_management_controller.rb:25 +msgid "Error syncing!" +msgstr "" + +#: app/views/sync_management/_products.html.haml:9 +msgid "Est Size (Packages)" +msgstr "" + +#: app/views/common/_env_select.html.haml:5 +msgid "Expand" +msgstr "" + +#: app/views/systems/_facts.html.haml:10 +msgid "Fact" +msgstr "" + +#: config/navigation.rb:68 +msgid "Facts" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:52 +msgid "File" +msgstr "" + +#: app/views/packages/_filelist.html.haml:8 config/navigation.rb:46 +msgid "Filelist" +msgstr "" + +#: app/views/products/index.haml:8 +msgid "Filter" +msgstr "" + +#: app/views/sync_management/_products.html.haml:8 +msgid "Finish Time" +msgstr "" + +#: config/navigation.rb:63 +msgid "General" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Good" +msgstr "" + +#: app/views/systems/_facts.html.haml:9 +msgid "Group" +msgstr "" + +#: config/navigation.rb:76 +msgid "Groups" +msgstr "" + +#: app/views/systems/_edit.html.haml:13 +msgid "ID" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:17 +#: app/views/sync_plans/_form.html.haml:15 +msgid "Interval" +msgstr "" + +#: app/views/errata/_show.html.haml:19 +msgid "Issued" +msgstr "" + +#: app/helpers/application_helper.rb:19 +msgid "Katello" +msgstr "" + +#: app/views/systems/_edit.html.haml:62 +msgid "Last Booted" +msgstr "" + +#: app/views/notices/show.html.haml:21 +msgid "Level" +msgstr "" + +#: app/views/packages/_show.html.haml:77 +msgid "License" +msgstr "" + +#: config/navigation.rb:80 +msgid "List" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:16 +msgid "" +"Listed below are the products available from the selected provider, as well " +"as the related subscription information. If you have a subscription " +"manifest you may upload it below. This manifest may be obtained by visiting " +"the Red Hat Customer Portal or by contacting your support representative." +msgstr "" + +#: app/views/systems/_edit.html.haml:45 +msgid "Location" +msgstr "" + +#: app/controllers/environments_controller.rb:39 +#: app/controllers/environments_controller.rb:73 +#: app/views/environments/_new.html.haml:21 +#: app/views/common/_env_select.html.haml:14 +#: app/views/common/_env_select.html.haml:29 +msgid "Locker" +msgstr "" + +#: app/views/user_sessions/new.html.haml:5 +#: app/views/user_sessions/new.html.haml:18 +msgid "Log In" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:41 +msgid "Login Successful" +msgstr "" + +#: app/views/layouts/_footer.haml:5 app/views/layouts/_header.haml:23 +#: app/views/accounts/show.html.haml:6 +msgid "Logout" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:50 +msgid "Logout Successful" +msgstr "" + +#: app/views/providers/schedule.html.haml:2 +msgid "Manage Providers" +msgstr "" + +#: config/navigation.rb:10 +msgid "Monitors" +msgstr "" + +#: app/views/providers/_edit.html.haml:14 +#: app/views/providers/_edit_repository.html.haml:7 +#: app/views/providers/_form.html.haml:6 +#: app/views/providers/_products_repos.html.haml:29 +#: app/views/providers/_products_repos.html.haml:91 +#: app/views/providers/_edit_product.html.haml:7 +#: app/views/providers/_subscriptions.html.haml:21 +#: app/views/sync_plans/_edit.html.haml:9 +#: app/views/sync_plans/_form.html.haml:5 +#: app/views/organizations/_new.html.haml:7 +#: app/views/environments/_edit.html.haml:13 +#: app/views/environments/_new.html.haml:8 +#: app/views/systems/_edit.html.haml:25 +#: app/views/systems/_packages.html.haml:7 app/views/roles/_edit.html.haml:10 +#: app/views/roles/_new.html.haml:8 app/views/packages/_show.html.haml:11 +#: app/views/changesets/_edit.html.haml:14 +msgid "Name" +msgstr "" + +#: app/views/changesets/_name.html.haml:3 +msgid "Name:" +msgstr "" + +#: app/views/organizations/_new.html.haml:2 +msgid "New Organization" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:25 +msgid "New Product" +msgstr "" + +#: app/views/providers/_new.html.haml:4 +msgid "New Provider" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:87 +msgid "New Repository" +msgstr "" + +#: app/views/roles/_new.html.haml:3 +msgid "New Role" +msgstr "" + +#: app/views/sync_plans/_new.html.haml:4 +msgid "New Sync Plan" +msgstr "" + +#: app/views/users/_new.html.haml:2 +msgid "New User" +msgstr "" + +#: app/views/organizations/_edit.html.haml:31 +msgid "" +"No environments are available in this organization. Please add some " +"environments to be able register systems to this organization." +msgstr "" + +#: app/views/promotions/_errata.html.haml:3 +msgid "No errata available." +msgstr "" + +#: app/views/promotions/_packages.html.haml:3 +msgid "No packages available for promotion" +msgstr "" + +#: app/views/promotions/_products.html.haml:3 +msgid "No products" +msgstr "" + +#: app/views/systems/_edit.html.haml:63 +msgid "None" +msgstr "" + +#: app/controllers/providers_controller.rb:109 +msgid "None Imported" +msgstr "" + +#: app/controllers/sync_management_controller.rb:27 +msgid "Not synced." +msgstr "" + +#: config/navigation.rb:14 +msgid "Notifications" +msgstr "" + +#: app/views/systems/_edit.html.haml:33 +msgid "OS" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:18 +msgid "" +"On Products & Repositories you can add your own Products and Repositories to " +"your Provider. This allows you to synchronize content from any remote " +"repository to this server. Simply add a Product and then setup one or more " +"repositories to add to this Provider. This feature is only available for " +"Custom Providers." +msgstr "" + +#: app/models/provider.rb:46 +msgid "Only one Red Hat provider permitted for an Organization" +msgstr "" + +#: app/helpers/application_helper.rb:23 +msgid "Open Source Systems Management" +msgstr "" + +#: app/controllers/organizations_controller.rb:36 +msgid "Organization" +msgstr "" + +#: app/controllers/organizations_controller.rb:34 config/navigation.rb:79 +msgid "Organizations" +msgstr "" + +#: app/views/organizations/index.html.haml:14 +msgid "" +"Organizations allow content and systems to be separated by logical " +"divisions. To edit the environments within an organization, click on that " +"organization and then click on the desired environment." +msgstr "" + +#: app/views/promotions/show.html.haml:13 +msgid "Package Dependencies" +msgstr "" + +#: app/views/packages/_show.html.haml:83 +msgid "Package Group" +msgstr "" + +#: app/views/packages/_show.html.haml:51 +msgid "Package Size" +msgstr "" + +#: app/helpers/promotions_helper.rb:45 +#: app/views/promotions/_detail.html.haml:14 +#: app/views/changesets/_edit.html.haml:39 +#: app/views/changesets/_changeset.html.haml:36 +#: app/views/changesets/_changeset.html.haml:47 +#: app/views/errata/_packages.html.haml:10 config/navigation.rb:50 +#: config/navigation.rb:71 +msgid "Packages" +msgstr "" + +#: app/views/users/_new.html.haml:12 +msgid "Password" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Password Strength" +msgstr "" + +#: app/views/roles/_permission.html.haml:4 +msgid "Permission" +msgstr "" + +#: app/controllers/roles_controller.rb:116 +msgid "Permission created." +msgstr "" + +#: app/views/common/403.html.haml:1 +msgid "Permission denied" +msgstr "" + +#: app/controllers/roles_controller.rb:106 +msgid "Permission updated." +msgstr "" + +#: app/controllers/sync_plans_controller.rb:21 +#: app/controllers/sync_schedules_controller.rb:29 +#: app/controllers/sync_schedules_controller.rb:35 +msgid "Plan" +msgstr "" + +#: app/views/common/403.html.haml:4 +msgid "Please request the required privileges from an administrator." +msgstr "" + +#: app/views/environments/_new.html.haml:19 +msgid "Prior Environment" +msgstr "" + +#: app/views/environments/_edit.html.haml:24 +msgid "Prior Environments" +msgstr "" + +#: app/views/sync_management/_products.html.haml:6 +msgid "Product" +msgstr "" + +#: app/controllers/providers_controller.rb:71 +msgid "Product created." +msgstr "" + +#: app/controllers/providers_controller.rb:84 +msgid "Product removed." +msgstr "" + +#: app/helpers/promotions_helper.rb:35 app/views/products/index.haml:15 +#: app/views/promotions/_detail.html.haml:5 +#: app/views/sync_management/_products.html.haml:2 +#: app/views/changesets/_edit.html.haml:27 +#: app/views/changesets/_changeset.html.haml:25 +msgid "Products" +msgstr "" + +#: config/navigation.rb:31 +msgid "Products & Repositories" +msgstr "" + +#: app/views/sync_management/_products.html.haml:10 +msgid "Progress" +msgstr "" + +#: app/views/promotions/show.html.haml:46 +msgid "Promote to" +msgstr "" + +#: app/views/promotions/_packages.html.haml:8 +msgid "Promoted" +msgstr "" + +#: app/views/changesets/_edit.html.haml:19 +msgid "Promotion Date" +msgstr "" + +#: config/navigation.rb:41 +msgid "Promotions" +msgstr "" + +#: app/views/promotions/show.html.haml:36 +msgid "" +"Promotions allow you to promote content from one environment to the next " +"along a promotion path. Clicking \"Add\" next to one or more products will " +"add them to the change set. If products already exist in the next " +"environment, you may promote other types of content. Once you have created a " +"change set, click the \"Promote\" button to commit it to the next " +"environment." +msgstr "" + +#: app/controllers/providers_controller.rb:141 +msgid "Provider" +msgstr "" + +#: app/controllers/providers_controller.rb:139 config/navigation.rb:23 +msgid "Providers" +msgstr "" + +#: app/views/providers/index.html.haml:13 +msgid "" +"Providers provide many types of content such as packages, errata, kickstart " +"trees, and installation disc images. A provider may be delivering all of " +"your paid content or it could simply be a local yum repostory providing a " +"few yum repos." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:27 +msgid "Provides" +msgstr "" + +#: config/navigation.rb:87 +msgid "Proxies" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:23 +msgid "Quantity Available" +msgstr "" + +#: app/controllers/sync_management_controller.rb:23 +msgid "Queued." +msgstr "" + +#: app/views/systems/_edit.html.haml:58 config/navigation.rb:61 +msgid "Registered" +msgstr "" + +#: app/views/systems/_edit.html.haml:37 +msgid "Release" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:22 +#: app/views/providers/_edit_product.html.haml:32 +#: app/views/promotions/_packages.html.haml:11 +#: app/views/promotions/_products.html.haml:8 +#: app/views/promotions/_errata.html.haml:10 +msgid "Remove" +msgstr "" + +#: app/views/environments/_edit.html.haml:30 +msgid "Remove Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:39 +msgid "Remove Organization" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +msgid "Remove Provider" +msgstr "" + +#: app/views/roles/_edit.html.haml:24 +msgid "Remove Role" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:28 +msgid "Remove Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:50 +msgid "Remove User" +msgstr "" + +#: app/controllers/providers_controller.rb:57 +msgid "Repo removed." +msgstr "" + +#: config/navigation.rb:12 +msgid "Reports" +msgstr "" + +#: app/views/providers/_edit.html.haml:30 +#: app/views/providers/_form.html.haml:24 +msgid "Repository Url" +msgstr "" + +#: app/controllers/providers_controller.rb:49 +msgid "Repository created." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:19 +msgid "Requires" +msgstr "" + +#: app/controllers/roles_controller.rb:33 app/views/roles/_edit.html.haml:5 +msgid "Role" +msgstr "" + +#: app/controllers/roles_controller.rb:51 +msgid "Role created." +msgstr "" + +#: app/controllers/roles_controller.rb:65 +msgid "Role updated." +msgstr "" + +#: app/controllers/roles_controller.rb:31 app/views/users/_edit.html.haml:42 +#: config/navigation.rb:86 +msgid "Roles" +msgstr "" + +#: app/controllers/sync_management_controller.rb:26 +msgid "Running." +msgstr "" + +#: app/views/providers/_form.html.haml:29 +#: app/views/sync_plans/_form.html.haml:32 +#: app/views/organizations/_new.html.haml:16 +#: app/views/roles/_permission.html.haml:39 +#: app/views/common/_edit_i18n.html.haml:3 app/views/users/_edit.html.haml:35 +msgid "Save" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:57 +msgid "Save Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:101 +msgid "Save Repository" +msgstr "" + +#: app/views/users/_edit.html.haml:48 +msgid "Save Roles" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:9 +msgid "Save Subscriptions" +msgstr "" + +#: app/views/users/_new.html.haml:28 +msgid "Save User" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Saving..." +msgstr "" + +#: app/views/providers/schedule.html.haml:4 +msgid "Schedule" +msgstr "" + +#: app/views/roles/_permission.html.haml:20 +#: app/views/roles/_closed_permission.html.haml:8 +msgid "Scope" +msgstr "" + +#: app/views/notices/show.html.haml:8 app/views/common/_panel.html.haml:44 +msgid "Search" +msgstr "" + +#: app/views/sync_management/_products.html.haml:74 +msgid "Select All" +msgstr "" + +#: app/views/sync_management/_products.html.haml:71 +msgid "Select None" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:33 +msgid "Select Plans to apply to selected Products" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:27 +msgid "Select Products to schedule" +msgstr "" + +#: app/views/common/_panel.html.haml:11 +msgid "Select Result" +msgstr "" + +#: app/views/packages/_show.html.haml:42 +msgid "Signature" +msgstr "" + +#: app/views/packages/_show.html.haml:96 +msgid "Source Package" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:35 +msgid "Specify Local Manifest" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:21 +#: app/views/sync_plans/_form.html.haml:20 +msgid "Start Date" +msgstr "" + +#: app/views/sync_management/_products.html.haml:7 +msgid "Start Time" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Strong" +msgstr "" + +#: app/controllers/providers_controller.rb:96 +msgid "Subscription uploaded successfully" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:4 config/navigation.rb:29 +#: config/navigation.rb:65 +msgid "Subscriptions" +msgstr "" + +#: app/views/products/index.haml:21 +msgid "Sync" +msgstr "" + +#: config/navigation.rb:35 +msgid "Sync Management" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:19 config/navigation.rb:37 +msgid "Sync Plans" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:57 +msgid "Sync Plans applied successfully." +msgstr "" + +#: config/navigation.rb:38 +msgid "Sync Schedule" +msgstr "" + +#: config/navigation.rb:36 +msgid "Sync Status" +msgstr "" + +#: app/controllers/sync_management_controller.rb:24 +#: app/views/sync_management/index.html.haml:3 +msgid "Sync complete." +msgstr "" + +#: app/views/products/index.haml:11 +msgid "Synced" +msgstr "" + +#: app/views/sync_management/_products.html.haml:75 +msgid "Synchronize Now" +msgstr "" + +#: app/views/systems/_edit.html.haml:3 app/views/systems/_packages.html.haml:1 +#: app/views/systems/_facts.html.haml:1 +#: app/views/systems/_subscriptions.html.haml:1 +msgid "System" +msgstr "" + +#: app/views/systems/_edit.html.haml:50 +msgid "System Events" +msgstr "" + +#: app/views/systems/_edit.html.haml:9 +msgid "System Info" +msgstr "" + +#: app/views/systems/_edit.html.haml:21 +msgid "System Properties" +msgstr "" + +#: app/controllers/systems_controller.rb:43 +msgid "System subscriptions updated." +msgstr "" + +#: app/controllers/systems_controller.rb:64 +msgid "System updated." +msgstr "" + +#: app/controllers/systems_controller.rb:26 config/navigation.rb:59 +msgid "Systems" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "The passwords do not match" +msgstr "" + +#: app/controllers/providers_controller.rb:99 +msgid "There was a format error with your Subscription Manifest" +msgstr "" + +#: app/views/dashboard/index.html.haml:6 +msgid "" +"This is to be the Dashboard area containing Monitors, Reporting, and " +"Workflow branches." +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:25 +#: app/views/sync_plans/_form.html.haml:25 +msgid "Time" +msgstr "" + +#: app/views/providers/_edit.html.haml:24 +#: app/views/providers/_edit_repository.html.haml:17 +#: app/views/providers/_form.html.haml:18 +#: app/views/roles/_permission.html.haml:13 +#: app/views/roles/_closed_permission.html.haml:3 +#: app/views/errata/_show.html.haml:12 +msgid "Type" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:44 +msgid "Types" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:12 +#: app/views/providers/_products_repos.html.haml:39 +#: app/views/providers/_products_repos.html.haml:96 +#: app/views/providers/_edit_product.html.haml:19 +msgid "URL" +msgstr "" + +#: app/views/systems/_edit.html.haml:17 +msgid "UUID" +msgstr "" + +#: app/views/products/index.haml:13 +msgid "Unsynced" +msgstr "" + +#: app/views/errata/_show.html.haml:25 +msgid "Updated" +msgstr "" + +#: config/navigation.rb:54 +msgid "Updates Bundle" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:38 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Upload" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:32 +msgid "Upload Subscription Manifest" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Uploading" +msgstr "" + +#: app/controllers/users_controller.rb:35 +msgid "User" +msgstr "" + +#: app/views/notices/show.html.haml:11 +msgid "User Notifications" +msgstr "" + +#: app/views/notices/show.html.haml:15 +msgid "" +"User notifications lists all notifications generated by a user as well as " +"global notifications that are sent to all users." +msgstr "" + +#: app/controllers/users_controller.rb:72 +msgid "User updated successfully." +msgstr "" + +#: app/views/users/_edit.html.haml:7 app/views/users/_new.html.haml:7 +msgid "Username" +msgstr "" + +#: app/controllers/users_controller.rb:33 config/navigation.rb:85 +msgid "Users" +msgstr "" + +#: app/views/systems/_facts.html.haml:11 +msgid "Value" +msgstr "" + +#: app/views/roles/_permission.html.haml:30 +#: app/views/roles/_closed_permission.html.haml:15 +msgid "Verbs" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Very Weak" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Weak" +msgstr "" + +#: app/controllers/application_controller.rb:205 +msgid "Welcome Back!" +msgstr "" + +#: config/navigation.rb:16 +msgid "Workflow" +msgstr "" + +#: app/views/common/403.html.haml:3 +msgid "You are not authorised to perform this action." +msgstr "" + +#: app/controllers/application_controller.rb:162 +#: app/controllers/application_controller.rb:195 +msgid "You must be logged in to access that page." +msgstr "" + +#: app/controllers/application_controller.rb:176 +msgid "" +"You must have at least one organization in your database to access that " +"page. Might need to run 'rake db:seed'" +msgstr "" + +#: app/controllers/failed_authentication_controller.rb:18 +msgid "" +"You've entered an incorrect username or password combination, please try " +"again." +msgstr "" + +#: app/views/providers/_products_repos.html.haml:47 +msgid "Yum" +msgstr "" + +#: app/models/katello_name_format_validator.rb:20 +msgid "can't be blank" +msgstr "" + +#: app/models/katello_name_format_validator.rb:16 +msgid "cannot contain characters other than alpha numerals, space,'_', '-'." +msgstr "" + +#: app/models/username_validator.rb:16 +msgid "cannot contain characters other than alpha numerals,'_', '-'." +msgstr "" + +#: app/controllers/changesets_controller.rb:40 +msgid "changeset" +msgstr "" + +#: app/models/kp_environment.rb:27 +msgid "environment cannot be a prior to a different environment" +msgstr "" + +#: app/models/kp_environment.rb:69 +msgid "must be unique within one organization" +msgstr "" + +#: app/models/no_trailing_space_validator.rb:20 +msgid "must not contain leading or trailing white spaces." +msgstr "" + +#: app/controllers/organizations_controller.rb:37 +msgid "organization" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:22 +#: app/controllers/sync_schedules_controller.rb:36 +msgid "plan" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:30 +msgid "product" +msgstr "" + +#: app/controllers/sync_management_controller.rb:150 +msgid "product was synced successfully" +msgstr "" + +#: app/controllers/sync_management_controller.rb:147 +msgid "product was synced successfully with errors. See log for details" +msgstr "" + +#: app/controllers/providers_controller.rb:142 +msgid "provider" +msgstr "" + +#: app/controllers/roles_controller.rb:34 +msgid "role" +msgstr "" + +#: app/controllers/sync_management_controller.rb:155 +msgid "sync did not complete successfully" +msgstr "" + +#: app/controllers/systems_controller.rb:29 +msgid "system" +msgstr "" + +#: app/controllers/users_controller.rb:36 +msgid "user" +msgstr "" diff --git a/locale/pom.xml b/locale/pom.xml new file mode 100644 index 00000000000..937e4fed2a1 --- /dev/null +++ b/locale/pom.xml @@ -0,0 +1,35 @@ + + 4.0.0 + null + null + 0 + + + + + net.openl10n.flies + flies-maven-plugin + 1.1.1 + + . + . + . + + + + + + + + openl10n-public-repository-group + OpenL10n Public Repository Group + http://nexus.openl10n.net/content/groups/public + + true + + + true + + + + diff --git a/locale/pt-BR/app.po b/locale/pt-BR/app.po new file mode 100644 index 00000000000..a635df6f8e4 --- /dev/null +++ b/locale/pt-BR/app.po @@ -0,0 +1,1189 @@ +# Language pt-BR translations for version package. +# Copyright (C) 2011 THE version'S COPYRIGHT HOLDER +# This file is distributed under the same license as the version package. +# Jason E. Rist , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2011-06-01 15:16-0600\n" +"PO-Revision-Date: 2011-01-07 16:44-0700\n" +"Last-Translator: Jason E. Rist \n" +"Language-Team: Language pt-BR\n" +"Language: pt-BR\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: app/views/layouts/_footer.haml:7 +msgid " Red Hat, Inc." +msgstr "" + +#: app/controllers/users_controller.rb:52 +msgid " created successfully." +msgstr "" + +#: app/models/kp_environment.rb:38 +msgid " environment cannot be set to an environment already on its path" +msgstr "" + +#: app/helpers/translation_helper.rb:15 +msgid "%{relative_time} ago" +msgstr "" + +#: app/views/common/_panel.html.haml:39 +msgid "+ New " +msgstr "" + +#: app/views/products/index.haml:4 +msgid "Actions" +msgstr "" + +#: app/views/promotions/_packages.html.haml:14 +#: app/views/promotions/_products.html.haml:11 +#: app/views/promotions/_errata.html.haml:13 +msgid "Add" +msgstr "" + +#: app/views/organizations/_edit.html.haml:36 +msgid "Add New Environment" +msgstr "" + +#: app/views/roles/_edit.html.haml:20 +msgid "Add Permission" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:23 +msgid "Add Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:85 +msgid "Add Repository" +msgstr "" + +#: app/views/operations/index.html.haml:2 config/navigation.rb:84 +msgid "Administration" +msgstr "" + +#: app/views/roles/_permission.html.haml:23 +#: app/views/roles/_permission.html.haml:33 +#: app/views/roles/_closed_permission.html.haml:11 +#: app/views/roles/_closed_permission.html.haml:18 +msgid "All" +msgstr "" + +#: app/helpers/promotions_helper.rb:33 +#: app/views/promotions/_detail.html.haml:8 +msgid "All Errata" +msgstr "" + +#: app/views/sync_schedules/index.html.haml:12 +msgid "Apply Selected Plans to Selected Products" +msgstr "" + +#: app/views/systems/_edit.html.haml:41 +#: app/views/systems/_packages.html.haml:8 +msgid "Arch" +msgstr "" + +#: app/views/packages/_show.html.haml:25 +msgid "Architecture" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +#: app/views/sync_plans/_edit.html.haml:28 +#: app/views/organizations/_edit.html.haml:38 +#: app/views/environments/_edit.html.haml:29 +#: app/views/roles/_edit.html.haml:24 app/views/notices/show.html.haml:37 +#: app/views/common/_common_i18n.html.haml:3 +#: app/views/users/_edit.html.haml:50 +msgid "Are you sure?" +msgstr "" + +#: app/views/errata/_show.html.haml:39 +msgid "Associated Bugs" +msgstr "" + +#: app/views/promotions/show.html.haml:59 +msgid "Available Content" +msgstr "" + +#: app/views/common/403.html.haml:7 +msgid "Back" +msgstr "" + +#: config/navigation.rb:27 +msgid "Basics" +msgstr "" + +#: app/views/packages/_show.html.haml:70 +msgid "Build Date" +msgstr "" + +#: app/views/packages/_show.html.haml:64 +msgid "Build Host" +msgstr "" + +#: app/controllers/api/environments_controller.rb:38 +msgid "Can't update locker environment" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:24 +#: app/views/providers/_products_repos.html.haml:59 +#: app/views/providers/_products_repos.html.haml:103 +#: app/views/providers/_edit_product.html.haml:34 +#: app/views/roles/_permission.html.haml:42 +#: app/views/sync_management/index.html.haml:3 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Cancel" +msgstr "" + +#: app/views/users/_edit.html.haml:23 +msgid "Change Password" +msgstr "" + +#: app/views/packages/_changelog.html.haml:9 config/navigation.rb:45 +msgid "Changelog" +msgstr "" + +#: config/navigation.rb:53 +msgid "Changeset History" +msgstr "" + +#: app/views/changesets/_changeset.html.haml:21 +msgid "Changeset Summary" +msgstr "" + +#: app/controllers/changesets_controller.rb:27 +msgid "Changeset storage errors" +msgstr "" + +#: app/controllers/changesets_controller.rb:37 +msgid "Changesets" +msgstr "" + +#: app/views/systems/_edit.html.haml:54 +msgid "Checked In" +msgstr "" + +#: app/views/users/_edit.html.haml:20 +msgid "Clear" +msgstr "" + +#: app/views/users/_edit.html.haml:17 +msgid "Clear Disabled Helptips" +msgstr "" + +#: app/controllers/users_controller.rb:103 +msgid "Cleared" +msgstr "" + +#: app/views/common/_panel.html.haml:7 +msgid "Click New to create a new" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:21 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Click to edit" +msgstr "" + +#: app/views/promotions/show.html.haml:51 app/views/common/_panel.html.haml:17 +#: app/views/common/_panel.html.haml:26 +msgid "Close" +msgstr "" + +#: app/views/common/_env_select.html.haml:7 +msgid "Collapse" +msgstr "" + +#: app/views/users/_edit.html.haml:30 app/views/users/_new.html.haml:19 +msgid "Confirm" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:22 +msgid "Consumed Subscriptions" +msgstr "" + +#: app/helpers/promotions_helper.rb:31 app/views/content/index.html.haml:1 +msgid "Content" +msgstr "" + +#: config/navigation.rb:22 +msgid "Content Management" +msgstr "" + +#: app/views/layouts/_footer.haml:7 +msgid "Copyright © " +msgstr "" + +#: app/views/environments/_new.html.haml:24 config/navigation.rb:24 +msgid "Create" +msgstr "" + +#: app/views/environments/_new.html.haml:2 +msgid "Create Environment" +msgstr "" + +#: app/views/notices/show.html.haml:19 +msgid "Created" +msgstr "" + +#: app/views/promotions/show.html.haml:40 +msgid "Current Changeset" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:18 +msgid "Current Subscriptions" +msgstr "" + +#: app/views/dashboard/index.html.haml:2 config/navigation.rb:8 +msgid "Dashboard" +msgstr "" + +#: app/views/notices/show.html.haml:37 +msgid "Delete All" +msgstr "" + +#: app/views/packages/_dependencies.html.haml:12 +#: app/views/changesets/_changeset.html.haml:45 config/navigation.rb:44 +msgid "Dependencies" +msgstr "" + +#: app/views/providers/_edit.html.haml:19 +#: app/views/providers/_form.html.haml:12 +#: app/views/providers/_products_repos.html.haml:34 +#: app/views/providers/_edit_product.html.haml:12 +#: app/views/sync_plans/_edit.html.haml:13 +#: app/views/sync_plans/_form.html.haml:10 +#: app/views/organizations/_edit.html.haml:12 +#: app/views/organizations/_new.html.haml:12 +#: app/views/environments/_edit.html.haml:18 +#: app/views/environments/_new.html.haml:14 +#: app/views/systems/_edit.html.haml:29 app/views/packages/_show.html.haml:19 +#: app/views/notices/show.html.haml:23 app/views/errata/_show.html.haml:45 +msgid "Description" +msgstr "" + +#: app/views/changesets/_edit.html.haml:9 config/navigation.rb:43 +#: config/navigation.rb:49 +msgid "Details" +msgstr "" + +#: app/controllers/users_controller.rb:102 +msgid "Disabled help tips have been re-enabled." +msgstr "" + +#: app/views/packages/_show.html.haml:89 +msgid "Download" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:3 +msgid "Edit Product" +msgstr "" + +#: app/views/providers/_edit.html.haml:4 +msgid "Edit Provider" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:3 +msgid "Edit Repository" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:5 +msgid "Edit Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:2 +msgid "Edit User" +msgstr "" + +#: app/views/users/_edit.html.haml:12 +msgid "Enable inline help" +msgstr "" + +#: app/views/environments/_edit.html.haml:6 +msgid "Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:16 +msgid "Environment Promotion Paths" +msgstr "" + +#: app/models/kp_environment.rb:15 +msgid "Environment cannot be in its own promotion path" +msgstr "" + +#: app/helpers/promotions_helper.rb:49 +#: app/views/promotions/_detail.html.haml:18 +#: app/views/changesets/_edit.html.haml:33 +#: app/views/changesets/_changeset.html.haml:30 +msgid "Errata" +msgstr "" + +#: app/views/sync_management/index.html.haml:3 +msgid "Error" +msgstr "" + +#: app/controllers/sync_management_controller.rb:25 +msgid "Error syncing!" +msgstr "" + +#: app/views/sync_management/_products.html.haml:9 +msgid "Est Size (Packages)" +msgstr "" + +#: app/views/common/_env_select.html.haml:5 +msgid "Expand" +msgstr "" + +#: app/views/systems/_facts.html.haml:10 +msgid "Fact" +msgstr "" + +#: config/navigation.rb:68 +msgid "Facts" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:52 +msgid "File" +msgstr "" + +#: app/views/packages/_filelist.html.haml:8 config/navigation.rb:46 +msgid "Filelist" +msgstr "" + +#: app/views/products/index.haml:8 +msgid "Filter" +msgstr "" + +#: app/views/sync_management/_products.html.haml:8 +msgid "Finish Time" +msgstr "" + +#: config/navigation.rb:63 +msgid "General" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Good" +msgstr "" + +#: app/views/systems/_facts.html.haml:9 +msgid "Group" +msgstr "" + +#: config/navigation.rb:76 +msgid "Groups" +msgstr "" + +#: app/views/systems/_edit.html.haml:13 +msgid "ID" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:17 +#: app/views/sync_plans/_form.html.haml:15 +msgid "Interval" +msgstr "" + +#: app/views/errata/_show.html.haml:19 +msgid "Issued" +msgstr "" + +#: app/helpers/application_helper.rb:19 +msgid "Katello" +msgstr "" + +#: app/views/systems/_edit.html.haml:62 +msgid "Last Booted" +msgstr "" + +#: app/views/notices/show.html.haml:21 +msgid "Level" +msgstr "" + +#: app/views/packages/_show.html.haml:77 +msgid "License" +msgstr "" + +#: config/navigation.rb:80 +msgid "List" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:16 +msgid "" +"Listed below are the products available from the selected provider, as well " +"as the related subscription information. If you have a subscription " +"manifest you may upload it below. This manifest may be obtained by visiting " +"the Red Hat Customer Portal or by contacting your support representative." +msgstr "" + +#: app/views/systems/_edit.html.haml:45 +msgid "Location" +msgstr "" + +#: app/controllers/environments_controller.rb:39 +#: app/controllers/environments_controller.rb:73 +#: app/views/environments/_new.html.haml:21 +#: app/views/common/_env_select.html.haml:14 +#: app/views/common/_env_select.html.haml:29 +msgid "Locker" +msgstr "" + +#: app/views/user_sessions/new.html.haml:5 +#: app/views/user_sessions/new.html.haml:18 +msgid "Log In" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:41 +msgid "Login Successful" +msgstr "" + +#: app/views/layouts/_footer.haml:5 app/views/layouts/_header.haml:23 +#: app/views/accounts/show.html.haml:6 +msgid "Logout" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:50 +msgid "Logout Successful" +msgstr "" + +#: app/views/providers/schedule.html.haml:2 +msgid "Manage Providers" +msgstr "" + +#: config/navigation.rb:10 +msgid "Monitors" +msgstr "" + +#: app/views/providers/_edit.html.haml:14 +#: app/views/providers/_edit_repository.html.haml:7 +#: app/views/providers/_form.html.haml:6 +#: app/views/providers/_products_repos.html.haml:29 +#: app/views/providers/_products_repos.html.haml:91 +#: app/views/providers/_edit_product.html.haml:7 +#: app/views/providers/_subscriptions.html.haml:21 +#: app/views/sync_plans/_edit.html.haml:9 +#: app/views/sync_plans/_form.html.haml:5 +#: app/views/organizations/_new.html.haml:7 +#: app/views/environments/_edit.html.haml:13 +#: app/views/environments/_new.html.haml:8 +#: app/views/systems/_edit.html.haml:25 +#: app/views/systems/_packages.html.haml:7 app/views/roles/_edit.html.haml:10 +#: app/views/roles/_new.html.haml:8 app/views/packages/_show.html.haml:11 +#: app/views/changesets/_edit.html.haml:14 +msgid "Name" +msgstr "" + +#: app/views/changesets/_name.html.haml:3 +msgid "Name:" +msgstr "" + +#: app/views/organizations/_new.html.haml:2 +msgid "New Organization" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:25 +msgid "New Product" +msgstr "" + +#: app/views/providers/_new.html.haml:4 +msgid "New Provider" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:87 +msgid "New Repository" +msgstr "" + +#: app/views/roles/_new.html.haml:3 +msgid "New Role" +msgstr "" + +#: app/views/sync_plans/_new.html.haml:4 +msgid "New Sync Plan" +msgstr "" + +#: app/views/users/_new.html.haml:2 +msgid "New User" +msgstr "" + +#: app/views/organizations/_edit.html.haml:31 +msgid "" +"No environments are available in this organization. Please add some " +"environments to be able register systems to this organization." +msgstr "" + +#: app/views/promotions/_errata.html.haml:3 +msgid "No errata available." +msgstr "" + +#: app/views/promotions/_packages.html.haml:3 +msgid "No packages available for promotion" +msgstr "" + +#: app/views/promotions/_products.html.haml:3 +msgid "No products" +msgstr "" + +#: app/views/systems/_edit.html.haml:63 +msgid "None" +msgstr "" + +#: app/controllers/providers_controller.rb:109 +msgid "None Imported" +msgstr "" + +#: app/controllers/sync_management_controller.rb:27 +msgid "Not synced." +msgstr "" + +#: config/navigation.rb:14 +msgid "Notifications" +msgstr "" + +#: app/views/systems/_edit.html.haml:33 +msgid "OS" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:18 +msgid "" +"On Products & Repositories you can add your own Products and Repositories to " +"your Provider. This allows you to synchronize content from any remote " +"repository to this server. Simply add a Product and then setup one or more " +"repositories to add to this Provider. This feature is only available for " +"Custom Providers." +msgstr "" + +#: app/models/provider.rb:46 +msgid "Only one Red Hat provider permitted for an Organization" +msgstr "" + +#: app/helpers/application_helper.rb:23 +msgid "Open Source Systems Management" +msgstr "" + +#: app/controllers/organizations_controller.rb:36 +msgid "Organization" +msgstr "" + +#: app/controllers/organizations_controller.rb:34 config/navigation.rb:79 +msgid "Organizations" +msgstr "" + +#: app/views/organizations/index.html.haml:14 +msgid "" +"Organizations allow content and systems to be separated by logical " +"divisions. To edit the environments within an organization, click on that " +"organization and then click on the desired environment." +msgstr "" + +#: app/views/promotions/show.html.haml:13 +msgid "Package Dependencies" +msgstr "" + +#: app/views/packages/_show.html.haml:83 +msgid "Package Group" +msgstr "" + +#: app/views/packages/_show.html.haml:51 +msgid "Package Size" +msgstr "" + +#: app/helpers/promotions_helper.rb:45 +#: app/views/promotions/_detail.html.haml:14 +#: app/views/changesets/_edit.html.haml:39 +#: app/views/changesets/_changeset.html.haml:36 +#: app/views/changesets/_changeset.html.haml:47 +#: app/views/errata/_packages.html.haml:10 config/navigation.rb:50 +#: config/navigation.rb:71 +msgid "Packages" +msgstr "" + +#: app/views/users/_new.html.haml:12 +msgid "Password" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Password Strength" +msgstr "" + +#: app/views/roles/_permission.html.haml:4 +msgid "Permission" +msgstr "" + +#: app/controllers/roles_controller.rb:116 +msgid "Permission created." +msgstr "" + +#: app/views/common/403.html.haml:1 +msgid "Permission denied" +msgstr "" + +#: app/controllers/roles_controller.rb:106 +msgid "Permission updated." +msgstr "" + +#: app/controllers/sync_plans_controller.rb:21 +#: app/controllers/sync_schedules_controller.rb:29 +#: app/controllers/sync_schedules_controller.rb:35 +msgid "Plan" +msgstr "" + +#: app/views/common/403.html.haml:4 +msgid "Please request the required privileges from an administrator." +msgstr "" + +#: app/views/environments/_new.html.haml:19 +msgid "Prior Environment" +msgstr "" + +#: app/views/environments/_edit.html.haml:24 +msgid "Prior Environments" +msgstr "" + +#: app/views/sync_management/_products.html.haml:6 +msgid "Product" +msgstr "" + +#: app/controllers/providers_controller.rb:71 +msgid "Product created." +msgstr "" + +#: app/controllers/providers_controller.rb:84 +msgid "Product removed." +msgstr "" + +#: app/helpers/promotions_helper.rb:35 app/views/products/index.haml:15 +#: app/views/promotions/_detail.html.haml:5 +#: app/views/sync_management/_products.html.haml:2 +#: app/views/changesets/_edit.html.haml:27 +#: app/views/changesets/_changeset.html.haml:25 +msgid "Products" +msgstr "" + +#: config/navigation.rb:31 +msgid "Products & Repositories" +msgstr "" + +#: app/views/sync_management/_products.html.haml:10 +msgid "Progress" +msgstr "" + +#: app/views/promotions/show.html.haml:46 +msgid "Promote to" +msgstr "" + +#: app/views/promotions/_packages.html.haml:8 +msgid "Promoted" +msgstr "" + +#: app/views/changesets/_edit.html.haml:19 +msgid "Promotion Date" +msgstr "" + +#: config/navigation.rb:41 +msgid "Promotions" +msgstr "" + +#: app/views/promotions/show.html.haml:36 +msgid "" +"Promotions allow you to promote content from one environment to the next " +"along a promotion path. Clicking \"Add\" next to one or more products will " +"add them to the change set. If products already exist in the next " +"environment, you may promote other types of content. Once you have created a " +"change set, click the \"Promote\" button to commit it to the next " +"environment." +msgstr "" + +#: app/controllers/providers_controller.rb:141 +msgid "Provider" +msgstr "" + +#: app/controllers/providers_controller.rb:139 config/navigation.rb:23 +msgid "Providers" +msgstr "" + +#: app/views/providers/index.html.haml:13 +msgid "" +"Providers provide many types of content such as packages, errata, kickstart " +"trees, and installation disc images. A provider may be delivering all of " +"your paid content or it could simply be a local yum repostory providing a " +"few yum repos." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:27 +msgid "Provides" +msgstr "" + +#: config/navigation.rb:87 +msgid "Proxies" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:23 +msgid "Quantity Available" +msgstr "" + +#: app/controllers/sync_management_controller.rb:23 +msgid "Queued." +msgstr "" + +#: app/views/systems/_edit.html.haml:58 config/navigation.rb:61 +msgid "Registered" +msgstr "" + +#: app/views/systems/_edit.html.haml:37 +msgid "Release" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:22 +#: app/views/providers/_edit_product.html.haml:32 +#: app/views/promotions/_packages.html.haml:11 +#: app/views/promotions/_products.html.haml:8 +#: app/views/promotions/_errata.html.haml:10 +msgid "Remove" +msgstr "" + +#: app/views/environments/_edit.html.haml:30 +msgid "Remove Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:39 +msgid "Remove Organization" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +msgid "Remove Provider" +msgstr "" + +#: app/views/roles/_edit.html.haml:24 +msgid "Remove Role" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:28 +msgid "Remove Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:50 +msgid "Remove User" +msgstr "" + +#: app/controllers/providers_controller.rb:57 +msgid "Repo removed." +msgstr "" + +#: config/navigation.rb:12 +msgid "Reports" +msgstr "" + +#: app/views/providers/_edit.html.haml:30 +#: app/views/providers/_form.html.haml:24 +msgid "Repository Url" +msgstr "" + +#: app/controllers/providers_controller.rb:49 +msgid "Repository created." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:19 +msgid "Requires" +msgstr "" + +#: app/controllers/roles_controller.rb:33 app/views/roles/_edit.html.haml:5 +msgid "Role" +msgstr "" + +#: app/controllers/roles_controller.rb:51 +msgid "Role created." +msgstr "" + +#: app/controllers/roles_controller.rb:65 +msgid "Role updated." +msgstr "" + +#: app/controllers/roles_controller.rb:31 app/views/users/_edit.html.haml:42 +#: config/navigation.rb:86 +msgid "Roles" +msgstr "" + +#: app/controllers/sync_management_controller.rb:26 +msgid "Running." +msgstr "" + +#: app/views/providers/_form.html.haml:29 +#: app/views/sync_plans/_form.html.haml:32 +#: app/views/organizations/_new.html.haml:16 +#: app/views/roles/_permission.html.haml:39 +#: app/views/common/_edit_i18n.html.haml:3 app/views/users/_edit.html.haml:35 +msgid "Save" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:57 +msgid "Save Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:101 +msgid "Save Repository" +msgstr "" + +#: app/views/users/_edit.html.haml:48 +msgid "Save Roles" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:9 +msgid "Save Subscriptions" +msgstr "" + +#: app/views/users/_new.html.haml:28 +msgid "Save User" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Saving..." +msgstr "" + +#: app/views/providers/schedule.html.haml:4 +msgid "Schedule" +msgstr "" + +#: app/views/roles/_permission.html.haml:20 +#: app/views/roles/_closed_permission.html.haml:8 +msgid "Scope" +msgstr "" + +#: app/views/notices/show.html.haml:8 app/views/common/_panel.html.haml:44 +msgid "Search" +msgstr "" + +#: app/views/sync_management/_products.html.haml:74 +msgid "Select All" +msgstr "" + +#: app/views/sync_management/_products.html.haml:71 +msgid "Select None" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:33 +msgid "Select Plans to apply to selected Products" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:27 +msgid "Select Products to schedule" +msgstr "" + +#: app/views/common/_panel.html.haml:11 +msgid "Select Result" +msgstr "" + +#: app/views/packages/_show.html.haml:42 +msgid "Signature" +msgstr "" + +#: app/views/packages/_show.html.haml:96 +msgid "Source Package" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:35 +msgid "Specify Local Manifest" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:21 +#: app/views/sync_plans/_form.html.haml:20 +msgid "Start Date" +msgstr "" + +#: app/views/sync_management/_products.html.haml:7 +msgid "Start Time" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Strong" +msgstr "" + +#: app/controllers/providers_controller.rb:96 +msgid "Subscription uploaded successfully" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:4 config/navigation.rb:29 +#: config/navigation.rb:65 +msgid "Subscriptions" +msgstr "" + +#: app/views/products/index.haml:21 +msgid "Sync" +msgstr "" + +#: config/navigation.rb:35 +msgid "Sync Management" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:19 config/navigation.rb:37 +msgid "Sync Plans" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:57 +msgid "Sync Plans applied successfully." +msgstr "" + +#: config/navigation.rb:38 +msgid "Sync Schedule" +msgstr "" + +#: config/navigation.rb:36 +msgid "Sync Status" +msgstr "" + +#: app/controllers/sync_management_controller.rb:24 +#: app/views/sync_management/index.html.haml:3 +msgid "Sync complete." +msgstr "" + +#: app/views/products/index.haml:11 +msgid "Synced" +msgstr "" + +#: app/views/sync_management/_products.html.haml:75 +msgid "Synchronize Now" +msgstr "" + +#: app/views/systems/_edit.html.haml:3 app/views/systems/_packages.html.haml:1 +#: app/views/systems/_facts.html.haml:1 +#: app/views/systems/_subscriptions.html.haml:1 +msgid "System" +msgstr "" + +#: app/views/systems/_edit.html.haml:50 +msgid "System Events" +msgstr "" + +#: app/views/systems/_edit.html.haml:9 +msgid "System Info" +msgstr "" + +#: app/views/systems/_edit.html.haml:21 +msgid "System Properties" +msgstr "" + +#: app/controllers/systems_controller.rb:43 +msgid "System subscriptions updated." +msgstr "" + +#: app/controllers/systems_controller.rb:64 +msgid "System updated." +msgstr "" + +#: app/controllers/systems_controller.rb:26 config/navigation.rb:59 +msgid "Systems" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "The passwords do not match" +msgstr "" + +#: app/controllers/providers_controller.rb:99 +msgid "There was a format error with your Subscription Manifest" +msgstr "" + +#: app/views/dashboard/index.html.haml:6 +msgid "" +"This is to be the Dashboard area containing Monitors, Reporting, and " +"Workflow branches." +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:25 +#: app/views/sync_plans/_form.html.haml:25 +msgid "Time" +msgstr "" + +#: app/views/providers/_edit.html.haml:24 +#: app/views/providers/_edit_repository.html.haml:17 +#: app/views/providers/_form.html.haml:18 +#: app/views/roles/_permission.html.haml:13 +#: app/views/roles/_closed_permission.html.haml:3 +#: app/views/errata/_show.html.haml:12 +msgid "Type" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:44 +msgid "Types" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:12 +#: app/views/providers/_products_repos.html.haml:39 +#: app/views/providers/_products_repos.html.haml:96 +#: app/views/providers/_edit_product.html.haml:19 +msgid "URL" +msgstr "" + +#: app/views/systems/_edit.html.haml:17 +msgid "UUID" +msgstr "" + +#: app/views/products/index.haml:13 +msgid "Unsynced" +msgstr "" + +#: app/views/errata/_show.html.haml:25 +msgid "Updated" +msgstr "" + +#: config/navigation.rb:54 +msgid "Updates Bundle" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:38 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Upload" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:32 +msgid "Upload Subscription Manifest" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Uploading" +msgstr "" + +#: app/controllers/users_controller.rb:35 +msgid "User" +msgstr "" + +#: app/views/notices/show.html.haml:11 +msgid "User Notifications" +msgstr "" + +#: app/views/notices/show.html.haml:15 +msgid "" +"User notifications lists all notifications generated by a user as well as " +"global notifications that are sent to all users." +msgstr "" + +#: app/controllers/users_controller.rb:72 +msgid "User updated successfully." +msgstr "" + +#: app/views/users/_edit.html.haml:7 app/views/users/_new.html.haml:7 +msgid "Username" +msgstr "" + +#: app/controllers/users_controller.rb:33 config/navigation.rb:85 +msgid "Users" +msgstr "" + +#: app/views/systems/_facts.html.haml:11 +msgid "Value" +msgstr "" + +#: app/views/roles/_permission.html.haml:30 +#: app/views/roles/_closed_permission.html.haml:15 +msgid "Verbs" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Very Weak" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Weak" +msgstr "" + +#: app/controllers/application_controller.rb:205 +msgid "Welcome Back!" +msgstr "" + +#: config/navigation.rb:16 +msgid "Workflow" +msgstr "" + +#: app/views/common/403.html.haml:3 +msgid "You are not authorised to perform this action." +msgstr "" + +#: app/controllers/application_controller.rb:162 +#: app/controllers/application_controller.rb:195 +msgid "You must be logged in to access that page." +msgstr "" + +#: app/controllers/application_controller.rb:176 +msgid "" +"You must have at least one organization in your database to access that " +"page. Might need to run 'rake db:seed'" +msgstr "" + +#: app/controllers/failed_authentication_controller.rb:18 +msgid "" +"You've entered an incorrect username or password combination, please try " +"again." +msgstr "" + +#: app/views/providers/_products_repos.html.haml:47 +msgid "Yum" +msgstr "" + +#: app/models/katello_name_format_validator.rb:20 +msgid "can't be blank" +msgstr "" + +#: app/models/katello_name_format_validator.rb:16 +msgid "cannot contain characters other than alpha numerals, space,'_', '-'." +msgstr "" + +#: app/models/username_validator.rb:16 +msgid "cannot contain characters other than alpha numerals,'_', '-'." +msgstr "" + +#: app/controllers/changesets_controller.rb:40 +msgid "changeset" +msgstr "" + +#: app/models/kp_environment.rb:27 +msgid "environment cannot be a prior to a different environment" +msgstr "" + +#: app/models/kp_environment.rb:69 +msgid "must be unique within one organization" +msgstr "" + +#: app/models/no_trailing_space_validator.rb:20 +msgid "must not contain leading or trailing white spaces." +msgstr "" + +#: app/controllers/organizations_controller.rb:37 +msgid "organization" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:22 +#: app/controllers/sync_schedules_controller.rb:36 +msgid "plan" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:30 +msgid "product" +msgstr "" + +#: app/controllers/sync_management_controller.rb:150 +msgid "product was synced successfully" +msgstr "" + +#: app/controllers/sync_management_controller.rb:147 +msgid "product was synced successfully with errors. See log for details" +msgstr "" + +#: app/controllers/providers_controller.rb:142 +msgid "provider" +msgstr "" + +#: app/controllers/roles_controller.rb:34 +msgid "role" +msgstr "" + +#: app/controllers/sync_management_controller.rb:155 +msgid "sync did not complete successfully" +msgstr "" + +#: app/controllers/systems_controller.rb:29 +msgid "system" +msgstr "" + +#: app/controllers/users_controller.rb:36 +msgid "user" +msgstr "" diff --git a/locale/pt-PT/app.po b/locale/pt-PT/app.po new file mode 100644 index 00000000000..a19e499d07d --- /dev/null +++ b/locale/pt-PT/app.po @@ -0,0 +1,1189 @@ +# Language pt-PT translations for version package. +# Copyright (C) 2011 THE version'S COPYRIGHT HOLDER +# This file is distributed under the same license as the version package. +# Jason E. Rist , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2011-06-01 15:16-0600\n" +"PO-Revision-Date: 2011-01-07 16:45-0700\n" +"Last-Translator: Jason E. Rist \n" +"Language-Team: Language pt-PT\n" +"Language: pt-PT\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: app/views/layouts/_footer.haml:7 +msgid " Red Hat, Inc." +msgstr "" + +#: app/controllers/users_controller.rb:52 +msgid " created successfully." +msgstr "" + +#: app/models/kp_environment.rb:38 +msgid " environment cannot be set to an environment already on its path" +msgstr "" + +#: app/helpers/translation_helper.rb:15 +msgid "%{relative_time} ago" +msgstr "" + +#: app/views/common/_panel.html.haml:39 +msgid "+ New " +msgstr "" + +#: app/views/products/index.haml:4 +msgid "Actions" +msgstr "" + +#: app/views/promotions/_packages.html.haml:14 +#: app/views/promotions/_products.html.haml:11 +#: app/views/promotions/_errata.html.haml:13 +msgid "Add" +msgstr "" + +#: app/views/organizations/_edit.html.haml:36 +msgid "Add New Environment" +msgstr "" + +#: app/views/roles/_edit.html.haml:20 +msgid "Add Permission" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:23 +msgid "Add Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:85 +msgid "Add Repository" +msgstr "" + +#: app/views/operations/index.html.haml:2 config/navigation.rb:84 +msgid "Administration" +msgstr "" + +#: app/views/roles/_permission.html.haml:23 +#: app/views/roles/_permission.html.haml:33 +#: app/views/roles/_closed_permission.html.haml:11 +#: app/views/roles/_closed_permission.html.haml:18 +msgid "All" +msgstr "" + +#: app/helpers/promotions_helper.rb:33 +#: app/views/promotions/_detail.html.haml:8 +msgid "All Errata" +msgstr "" + +#: app/views/sync_schedules/index.html.haml:12 +msgid "Apply Selected Plans to Selected Products" +msgstr "" + +#: app/views/systems/_edit.html.haml:41 +#: app/views/systems/_packages.html.haml:8 +msgid "Arch" +msgstr "" + +#: app/views/packages/_show.html.haml:25 +msgid "Architecture" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +#: app/views/sync_plans/_edit.html.haml:28 +#: app/views/organizations/_edit.html.haml:38 +#: app/views/environments/_edit.html.haml:29 +#: app/views/roles/_edit.html.haml:24 app/views/notices/show.html.haml:37 +#: app/views/common/_common_i18n.html.haml:3 +#: app/views/users/_edit.html.haml:50 +msgid "Are you sure?" +msgstr "" + +#: app/views/errata/_show.html.haml:39 +msgid "Associated Bugs" +msgstr "" + +#: app/views/promotions/show.html.haml:59 +msgid "Available Content" +msgstr "" + +#: app/views/common/403.html.haml:7 +msgid "Back" +msgstr "" + +#: config/navigation.rb:27 +msgid "Basics" +msgstr "" + +#: app/views/packages/_show.html.haml:70 +msgid "Build Date" +msgstr "" + +#: app/views/packages/_show.html.haml:64 +msgid "Build Host" +msgstr "" + +#: app/controllers/api/environments_controller.rb:38 +msgid "Can't update locker environment" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:24 +#: app/views/providers/_products_repos.html.haml:59 +#: app/views/providers/_products_repos.html.haml:103 +#: app/views/providers/_edit_product.html.haml:34 +#: app/views/roles/_permission.html.haml:42 +#: app/views/sync_management/index.html.haml:3 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Cancel" +msgstr "" + +#: app/views/users/_edit.html.haml:23 +msgid "Change Password" +msgstr "" + +#: app/views/packages/_changelog.html.haml:9 config/navigation.rb:45 +msgid "Changelog" +msgstr "" + +#: config/navigation.rb:53 +msgid "Changeset History" +msgstr "" + +#: app/views/changesets/_changeset.html.haml:21 +msgid "Changeset Summary" +msgstr "" + +#: app/controllers/changesets_controller.rb:27 +msgid "Changeset storage errors" +msgstr "" + +#: app/controllers/changesets_controller.rb:37 +msgid "Changesets" +msgstr "" + +#: app/views/systems/_edit.html.haml:54 +msgid "Checked In" +msgstr "" + +#: app/views/users/_edit.html.haml:20 +msgid "Clear" +msgstr "" + +#: app/views/users/_edit.html.haml:17 +msgid "Clear Disabled Helptips" +msgstr "" + +#: app/controllers/users_controller.rb:103 +msgid "Cleared" +msgstr "" + +#: app/views/common/_panel.html.haml:7 +msgid "Click New to create a new" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:21 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Click to edit" +msgstr "" + +#: app/views/promotions/show.html.haml:51 app/views/common/_panel.html.haml:17 +#: app/views/common/_panel.html.haml:26 +msgid "Close" +msgstr "" + +#: app/views/common/_env_select.html.haml:7 +msgid "Collapse" +msgstr "" + +#: app/views/users/_edit.html.haml:30 app/views/users/_new.html.haml:19 +msgid "Confirm" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:22 +msgid "Consumed Subscriptions" +msgstr "" + +#: app/helpers/promotions_helper.rb:31 app/views/content/index.html.haml:1 +msgid "Content" +msgstr "" + +#: config/navigation.rb:22 +msgid "Content Management" +msgstr "" + +#: app/views/layouts/_footer.haml:7 +msgid "Copyright © " +msgstr "" + +#: app/views/environments/_new.html.haml:24 config/navigation.rb:24 +msgid "Create" +msgstr "" + +#: app/views/environments/_new.html.haml:2 +msgid "Create Environment" +msgstr "" + +#: app/views/notices/show.html.haml:19 +msgid "Created" +msgstr "" + +#: app/views/promotions/show.html.haml:40 +msgid "Current Changeset" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:18 +msgid "Current Subscriptions" +msgstr "" + +#: app/views/dashboard/index.html.haml:2 config/navigation.rb:8 +msgid "Dashboard" +msgstr "" + +#: app/views/notices/show.html.haml:37 +msgid "Delete All" +msgstr "" + +#: app/views/packages/_dependencies.html.haml:12 +#: app/views/changesets/_changeset.html.haml:45 config/navigation.rb:44 +msgid "Dependencies" +msgstr "" + +#: app/views/providers/_edit.html.haml:19 +#: app/views/providers/_form.html.haml:12 +#: app/views/providers/_products_repos.html.haml:34 +#: app/views/providers/_edit_product.html.haml:12 +#: app/views/sync_plans/_edit.html.haml:13 +#: app/views/sync_plans/_form.html.haml:10 +#: app/views/organizations/_edit.html.haml:12 +#: app/views/organizations/_new.html.haml:12 +#: app/views/environments/_edit.html.haml:18 +#: app/views/environments/_new.html.haml:14 +#: app/views/systems/_edit.html.haml:29 app/views/packages/_show.html.haml:19 +#: app/views/notices/show.html.haml:23 app/views/errata/_show.html.haml:45 +msgid "Description" +msgstr "" + +#: app/views/changesets/_edit.html.haml:9 config/navigation.rb:43 +#: config/navigation.rb:49 +msgid "Details" +msgstr "" + +#: app/controllers/users_controller.rb:102 +msgid "Disabled help tips have been re-enabled." +msgstr "" + +#: app/views/packages/_show.html.haml:89 +msgid "Download" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:3 +msgid "Edit Product" +msgstr "" + +#: app/views/providers/_edit.html.haml:4 +msgid "Edit Provider" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:3 +msgid "Edit Repository" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:5 +msgid "Edit Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:2 +msgid "Edit User" +msgstr "" + +#: app/views/users/_edit.html.haml:12 +msgid "Enable inline help" +msgstr "" + +#: app/views/environments/_edit.html.haml:6 +msgid "Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:16 +msgid "Environment Promotion Paths" +msgstr "" + +#: app/models/kp_environment.rb:15 +msgid "Environment cannot be in its own promotion path" +msgstr "" + +#: app/helpers/promotions_helper.rb:49 +#: app/views/promotions/_detail.html.haml:18 +#: app/views/changesets/_edit.html.haml:33 +#: app/views/changesets/_changeset.html.haml:30 +msgid "Errata" +msgstr "" + +#: app/views/sync_management/index.html.haml:3 +msgid "Error" +msgstr "" + +#: app/controllers/sync_management_controller.rb:25 +msgid "Error syncing!" +msgstr "" + +#: app/views/sync_management/_products.html.haml:9 +msgid "Est Size (Packages)" +msgstr "" + +#: app/views/common/_env_select.html.haml:5 +msgid "Expand" +msgstr "" + +#: app/views/systems/_facts.html.haml:10 +msgid "Fact" +msgstr "" + +#: config/navigation.rb:68 +msgid "Facts" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:52 +msgid "File" +msgstr "" + +#: app/views/packages/_filelist.html.haml:8 config/navigation.rb:46 +msgid "Filelist" +msgstr "" + +#: app/views/products/index.haml:8 +msgid "Filter" +msgstr "" + +#: app/views/sync_management/_products.html.haml:8 +msgid "Finish Time" +msgstr "" + +#: config/navigation.rb:63 +msgid "General" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Good" +msgstr "" + +#: app/views/systems/_facts.html.haml:9 +msgid "Group" +msgstr "" + +#: config/navigation.rb:76 +msgid "Groups" +msgstr "" + +#: app/views/systems/_edit.html.haml:13 +msgid "ID" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:17 +#: app/views/sync_plans/_form.html.haml:15 +msgid "Interval" +msgstr "" + +#: app/views/errata/_show.html.haml:19 +msgid "Issued" +msgstr "" + +#: app/helpers/application_helper.rb:19 +msgid "Katello" +msgstr "" + +#: app/views/systems/_edit.html.haml:62 +msgid "Last Booted" +msgstr "" + +#: app/views/notices/show.html.haml:21 +msgid "Level" +msgstr "" + +#: app/views/packages/_show.html.haml:77 +msgid "License" +msgstr "" + +#: config/navigation.rb:80 +msgid "List" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:16 +msgid "" +"Listed below are the products available from the selected provider, as well " +"as the related subscription information. If you have a subscription " +"manifest you may upload it below. This manifest may be obtained by visiting " +"the Red Hat Customer Portal or by contacting your support representative." +msgstr "" + +#: app/views/systems/_edit.html.haml:45 +msgid "Location" +msgstr "" + +#: app/controllers/environments_controller.rb:39 +#: app/controllers/environments_controller.rb:73 +#: app/views/environments/_new.html.haml:21 +#: app/views/common/_env_select.html.haml:14 +#: app/views/common/_env_select.html.haml:29 +msgid "Locker" +msgstr "" + +#: app/views/user_sessions/new.html.haml:5 +#: app/views/user_sessions/new.html.haml:18 +msgid "Log In" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:41 +msgid "Login Successful" +msgstr "" + +#: app/views/layouts/_footer.haml:5 app/views/layouts/_header.haml:23 +#: app/views/accounts/show.html.haml:6 +msgid "Logout" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:50 +msgid "Logout Successful" +msgstr "" + +#: app/views/providers/schedule.html.haml:2 +msgid "Manage Providers" +msgstr "" + +#: config/navigation.rb:10 +msgid "Monitors" +msgstr "" + +#: app/views/providers/_edit.html.haml:14 +#: app/views/providers/_edit_repository.html.haml:7 +#: app/views/providers/_form.html.haml:6 +#: app/views/providers/_products_repos.html.haml:29 +#: app/views/providers/_products_repos.html.haml:91 +#: app/views/providers/_edit_product.html.haml:7 +#: app/views/providers/_subscriptions.html.haml:21 +#: app/views/sync_plans/_edit.html.haml:9 +#: app/views/sync_plans/_form.html.haml:5 +#: app/views/organizations/_new.html.haml:7 +#: app/views/environments/_edit.html.haml:13 +#: app/views/environments/_new.html.haml:8 +#: app/views/systems/_edit.html.haml:25 +#: app/views/systems/_packages.html.haml:7 app/views/roles/_edit.html.haml:10 +#: app/views/roles/_new.html.haml:8 app/views/packages/_show.html.haml:11 +#: app/views/changesets/_edit.html.haml:14 +msgid "Name" +msgstr "" + +#: app/views/changesets/_name.html.haml:3 +msgid "Name:" +msgstr "" + +#: app/views/organizations/_new.html.haml:2 +msgid "New Organization" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:25 +msgid "New Product" +msgstr "" + +#: app/views/providers/_new.html.haml:4 +msgid "New Provider" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:87 +msgid "New Repository" +msgstr "" + +#: app/views/roles/_new.html.haml:3 +msgid "New Role" +msgstr "" + +#: app/views/sync_plans/_new.html.haml:4 +msgid "New Sync Plan" +msgstr "" + +#: app/views/users/_new.html.haml:2 +msgid "New User" +msgstr "" + +#: app/views/organizations/_edit.html.haml:31 +msgid "" +"No environments are available in this organization. Please add some " +"environments to be able register systems to this organization." +msgstr "" + +#: app/views/promotions/_errata.html.haml:3 +msgid "No errata available." +msgstr "" + +#: app/views/promotions/_packages.html.haml:3 +msgid "No packages available for promotion" +msgstr "" + +#: app/views/promotions/_products.html.haml:3 +msgid "No products" +msgstr "" + +#: app/views/systems/_edit.html.haml:63 +msgid "None" +msgstr "" + +#: app/controllers/providers_controller.rb:109 +msgid "None Imported" +msgstr "" + +#: app/controllers/sync_management_controller.rb:27 +msgid "Not synced." +msgstr "" + +#: config/navigation.rb:14 +msgid "Notifications" +msgstr "" + +#: app/views/systems/_edit.html.haml:33 +msgid "OS" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:18 +msgid "" +"On Products & Repositories you can add your own Products and Repositories to " +"your Provider. This allows you to synchronize content from any remote " +"repository to this server. Simply add a Product and then setup one or more " +"repositories to add to this Provider. This feature is only available for " +"Custom Providers." +msgstr "" + +#: app/models/provider.rb:46 +msgid "Only one Red Hat provider permitted for an Organization" +msgstr "" + +#: app/helpers/application_helper.rb:23 +msgid "Open Source Systems Management" +msgstr "" + +#: app/controllers/organizations_controller.rb:36 +msgid "Organization" +msgstr "" + +#: app/controllers/organizations_controller.rb:34 config/navigation.rb:79 +msgid "Organizations" +msgstr "" + +#: app/views/organizations/index.html.haml:14 +msgid "" +"Organizations allow content and systems to be separated by logical " +"divisions. To edit the environments within an organization, click on that " +"organization and then click on the desired environment." +msgstr "" + +#: app/views/promotions/show.html.haml:13 +msgid "Package Dependencies" +msgstr "" + +#: app/views/packages/_show.html.haml:83 +msgid "Package Group" +msgstr "" + +#: app/views/packages/_show.html.haml:51 +msgid "Package Size" +msgstr "" + +#: app/helpers/promotions_helper.rb:45 +#: app/views/promotions/_detail.html.haml:14 +#: app/views/changesets/_edit.html.haml:39 +#: app/views/changesets/_changeset.html.haml:36 +#: app/views/changesets/_changeset.html.haml:47 +#: app/views/errata/_packages.html.haml:10 config/navigation.rb:50 +#: config/navigation.rb:71 +msgid "Packages" +msgstr "" + +#: app/views/users/_new.html.haml:12 +msgid "Password" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Password Strength" +msgstr "" + +#: app/views/roles/_permission.html.haml:4 +msgid "Permission" +msgstr "" + +#: app/controllers/roles_controller.rb:116 +msgid "Permission created." +msgstr "" + +#: app/views/common/403.html.haml:1 +msgid "Permission denied" +msgstr "" + +#: app/controllers/roles_controller.rb:106 +msgid "Permission updated." +msgstr "" + +#: app/controllers/sync_plans_controller.rb:21 +#: app/controllers/sync_schedules_controller.rb:29 +#: app/controllers/sync_schedules_controller.rb:35 +msgid "Plan" +msgstr "" + +#: app/views/common/403.html.haml:4 +msgid "Please request the required privileges from an administrator." +msgstr "" + +#: app/views/environments/_new.html.haml:19 +msgid "Prior Environment" +msgstr "" + +#: app/views/environments/_edit.html.haml:24 +msgid "Prior Environments" +msgstr "" + +#: app/views/sync_management/_products.html.haml:6 +msgid "Product" +msgstr "" + +#: app/controllers/providers_controller.rb:71 +msgid "Product created." +msgstr "" + +#: app/controllers/providers_controller.rb:84 +msgid "Product removed." +msgstr "" + +#: app/helpers/promotions_helper.rb:35 app/views/products/index.haml:15 +#: app/views/promotions/_detail.html.haml:5 +#: app/views/sync_management/_products.html.haml:2 +#: app/views/changesets/_edit.html.haml:27 +#: app/views/changesets/_changeset.html.haml:25 +msgid "Products" +msgstr "" + +#: config/navigation.rb:31 +msgid "Products & Repositories" +msgstr "" + +#: app/views/sync_management/_products.html.haml:10 +msgid "Progress" +msgstr "" + +#: app/views/promotions/show.html.haml:46 +msgid "Promote to" +msgstr "" + +#: app/views/promotions/_packages.html.haml:8 +msgid "Promoted" +msgstr "" + +#: app/views/changesets/_edit.html.haml:19 +msgid "Promotion Date" +msgstr "" + +#: config/navigation.rb:41 +msgid "Promotions" +msgstr "" + +#: app/views/promotions/show.html.haml:36 +msgid "" +"Promotions allow you to promote content from one environment to the next " +"along a promotion path. Clicking \"Add\" next to one or more products will " +"add them to the change set. If products already exist in the next " +"environment, you may promote other types of content. Once you have created a " +"change set, click the \"Promote\" button to commit it to the next " +"environment." +msgstr "" + +#: app/controllers/providers_controller.rb:141 +msgid "Provider" +msgstr "" + +#: app/controllers/providers_controller.rb:139 config/navigation.rb:23 +msgid "Providers" +msgstr "" + +#: app/views/providers/index.html.haml:13 +msgid "" +"Providers provide many types of content such as packages, errata, kickstart " +"trees, and installation disc images. A provider may be delivering all of " +"your paid content or it could simply be a local yum repostory providing a " +"few yum repos." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:27 +msgid "Provides" +msgstr "" + +#: config/navigation.rb:87 +msgid "Proxies" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:23 +msgid "Quantity Available" +msgstr "" + +#: app/controllers/sync_management_controller.rb:23 +msgid "Queued." +msgstr "" + +#: app/views/systems/_edit.html.haml:58 config/navigation.rb:61 +msgid "Registered" +msgstr "" + +#: app/views/systems/_edit.html.haml:37 +msgid "Release" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:22 +#: app/views/providers/_edit_product.html.haml:32 +#: app/views/promotions/_packages.html.haml:11 +#: app/views/promotions/_products.html.haml:8 +#: app/views/promotions/_errata.html.haml:10 +msgid "Remove" +msgstr "" + +#: app/views/environments/_edit.html.haml:30 +msgid "Remove Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:39 +msgid "Remove Organization" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +msgid "Remove Provider" +msgstr "" + +#: app/views/roles/_edit.html.haml:24 +msgid "Remove Role" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:28 +msgid "Remove Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:50 +msgid "Remove User" +msgstr "" + +#: app/controllers/providers_controller.rb:57 +msgid "Repo removed." +msgstr "" + +#: config/navigation.rb:12 +msgid "Reports" +msgstr "" + +#: app/views/providers/_edit.html.haml:30 +#: app/views/providers/_form.html.haml:24 +msgid "Repository Url" +msgstr "" + +#: app/controllers/providers_controller.rb:49 +msgid "Repository created." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:19 +msgid "Requires" +msgstr "" + +#: app/controllers/roles_controller.rb:33 app/views/roles/_edit.html.haml:5 +msgid "Role" +msgstr "" + +#: app/controllers/roles_controller.rb:51 +msgid "Role created." +msgstr "" + +#: app/controllers/roles_controller.rb:65 +msgid "Role updated." +msgstr "" + +#: app/controllers/roles_controller.rb:31 app/views/users/_edit.html.haml:42 +#: config/navigation.rb:86 +msgid "Roles" +msgstr "" + +#: app/controllers/sync_management_controller.rb:26 +msgid "Running." +msgstr "" + +#: app/views/providers/_form.html.haml:29 +#: app/views/sync_plans/_form.html.haml:32 +#: app/views/organizations/_new.html.haml:16 +#: app/views/roles/_permission.html.haml:39 +#: app/views/common/_edit_i18n.html.haml:3 app/views/users/_edit.html.haml:35 +msgid "Save" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:57 +msgid "Save Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:101 +msgid "Save Repository" +msgstr "" + +#: app/views/users/_edit.html.haml:48 +msgid "Save Roles" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:9 +msgid "Save Subscriptions" +msgstr "" + +#: app/views/users/_new.html.haml:28 +msgid "Save User" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Saving..." +msgstr "" + +#: app/views/providers/schedule.html.haml:4 +msgid "Schedule" +msgstr "" + +#: app/views/roles/_permission.html.haml:20 +#: app/views/roles/_closed_permission.html.haml:8 +msgid "Scope" +msgstr "" + +#: app/views/notices/show.html.haml:8 app/views/common/_panel.html.haml:44 +msgid "Search" +msgstr "" + +#: app/views/sync_management/_products.html.haml:74 +msgid "Select All" +msgstr "" + +#: app/views/sync_management/_products.html.haml:71 +msgid "Select None" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:33 +msgid "Select Plans to apply to selected Products" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:27 +msgid "Select Products to schedule" +msgstr "" + +#: app/views/common/_panel.html.haml:11 +msgid "Select Result" +msgstr "" + +#: app/views/packages/_show.html.haml:42 +msgid "Signature" +msgstr "" + +#: app/views/packages/_show.html.haml:96 +msgid "Source Package" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:35 +msgid "Specify Local Manifest" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:21 +#: app/views/sync_plans/_form.html.haml:20 +msgid "Start Date" +msgstr "" + +#: app/views/sync_management/_products.html.haml:7 +msgid "Start Time" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Strong" +msgstr "" + +#: app/controllers/providers_controller.rb:96 +msgid "Subscription uploaded successfully" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:4 config/navigation.rb:29 +#: config/navigation.rb:65 +msgid "Subscriptions" +msgstr "" + +#: app/views/products/index.haml:21 +msgid "Sync" +msgstr "" + +#: config/navigation.rb:35 +msgid "Sync Management" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:19 config/navigation.rb:37 +msgid "Sync Plans" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:57 +msgid "Sync Plans applied successfully." +msgstr "" + +#: config/navigation.rb:38 +msgid "Sync Schedule" +msgstr "" + +#: config/navigation.rb:36 +msgid "Sync Status" +msgstr "" + +#: app/controllers/sync_management_controller.rb:24 +#: app/views/sync_management/index.html.haml:3 +msgid "Sync complete." +msgstr "" + +#: app/views/products/index.haml:11 +msgid "Synced" +msgstr "" + +#: app/views/sync_management/_products.html.haml:75 +msgid "Synchronize Now" +msgstr "" + +#: app/views/systems/_edit.html.haml:3 app/views/systems/_packages.html.haml:1 +#: app/views/systems/_facts.html.haml:1 +#: app/views/systems/_subscriptions.html.haml:1 +msgid "System" +msgstr "" + +#: app/views/systems/_edit.html.haml:50 +msgid "System Events" +msgstr "" + +#: app/views/systems/_edit.html.haml:9 +msgid "System Info" +msgstr "" + +#: app/views/systems/_edit.html.haml:21 +msgid "System Properties" +msgstr "" + +#: app/controllers/systems_controller.rb:43 +msgid "System subscriptions updated." +msgstr "" + +#: app/controllers/systems_controller.rb:64 +msgid "System updated." +msgstr "" + +#: app/controllers/systems_controller.rb:26 config/navigation.rb:59 +msgid "Systems" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "The passwords do not match" +msgstr "" + +#: app/controllers/providers_controller.rb:99 +msgid "There was a format error with your Subscription Manifest" +msgstr "" + +#: app/views/dashboard/index.html.haml:6 +msgid "" +"This is to be the Dashboard area containing Monitors, Reporting, and " +"Workflow branches." +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:25 +#: app/views/sync_plans/_form.html.haml:25 +msgid "Time" +msgstr "" + +#: app/views/providers/_edit.html.haml:24 +#: app/views/providers/_edit_repository.html.haml:17 +#: app/views/providers/_form.html.haml:18 +#: app/views/roles/_permission.html.haml:13 +#: app/views/roles/_closed_permission.html.haml:3 +#: app/views/errata/_show.html.haml:12 +msgid "Type" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:44 +msgid "Types" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:12 +#: app/views/providers/_products_repos.html.haml:39 +#: app/views/providers/_products_repos.html.haml:96 +#: app/views/providers/_edit_product.html.haml:19 +msgid "URL" +msgstr "" + +#: app/views/systems/_edit.html.haml:17 +msgid "UUID" +msgstr "" + +#: app/views/products/index.haml:13 +msgid "Unsynced" +msgstr "" + +#: app/views/errata/_show.html.haml:25 +msgid "Updated" +msgstr "" + +#: config/navigation.rb:54 +msgid "Updates Bundle" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:38 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Upload" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:32 +msgid "Upload Subscription Manifest" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Uploading" +msgstr "" + +#: app/controllers/users_controller.rb:35 +msgid "User" +msgstr "" + +#: app/views/notices/show.html.haml:11 +msgid "User Notifications" +msgstr "" + +#: app/views/notices/show.html.haml:15 +msgid "" +"User notifications lists all notifications generated by a user as well as " +"global notifications that are sent to all users." +msgstr "" + +#: app/controllers/users_controller.rb:72 +msgid "User updated successfully." +msgstr "" + +#: app/views/users/_edit.html.haml:7 app/views/users/_new.html.haml:7 +msgid "Username" +msgstr "" + +#: app/controllers/users_controller.rb:33 config/navigation.rb:85 +msgid "Users" +msgstr "" + +#: app/views/systems/_facts.html.haml:11 +msgid "Value" +msgstr "" + +#: app/views/roles/_permission.html.haml:30 +#: app/views/roles/_closed_permission.html.haml:15 +msgid "Verbs" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Very Weak" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Weak" +msgstr "" + +#: app/controllers/application_controller.rb:205 +msgid "Welcome Back!" +msgstr "" + +#: config/navigation.rb:16 +msgid "Workflow" +msgstr "" + +#: app/views/common/403.html.haml:3 +msgid "You are not authorised to perform this action." +msgstr "" + +#: app/controllers/application_controller.rb:162 +#: app/controllers/application_controller.rb:195 +msgid "You must be logged in to access that page." +msgstr "" + +#: app/controllers/application_controller.rb:176 +msgid "" +"You must have at least one organization in your database to access that " +"page. Might need to run 'rake db:seed'" +msgstr "" + +#: app/controllers/failed_authentication_controller.rb:18 +msgid "" +"You've entered an incorrect username or password combination, please try " +"again." +msgstr "" + +#: app/views/providers/_products_repos.html.haml:47 +msgid "Yum" +msgstr "" + +#: app/models/katello_name_format_validator.rb:20 +msgid "can't be blank" +msgstr "" + +#: app/models/katello_name_format_validator.rb:16 +msgid "cannot contain characters other than alpha numerals, space,'_', '-'." +msgstr "" + +#: app/models/username_validator.rb:16 +msgid "cannot contain characters other than alpha numerals,'_', '-'." +msgstr "" + +#: app/controllers/changesets_controller.rb:40 +msgid "changeset" +msgstr "" + +#: app/models/kp_environment.rb:27 +msgid "environment cannot be a prior to a different environment" +msgstr "" + +#: app/models/kp_environment.rb:69 +msgid "must be unique within one organization" +msgstr "" + +#: app/models/no_trailing_space_validator.rb:20 +msgid "must not contain leading or trailing white spaces." +msgstr "" + +#: app/controllers/organizations_controller.rb:37 +msgid "organization" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:22 +#: app/controllers/sync_schedules_controller.rb:36 +msgid "plan" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:30 +msgid "product" +msgstr "" + +#: app/controllers/sync_management_controller.rb:150 +msgid "product was synced successfully" +msgstr "" + +#: app/controllers/sync_management_controller.rb:147 +msgid "product was synced successfully with errors. See log for details" +msgstr "" + +#: app/controllers/providers_controller.rb:142 +msgid "provider" +msgstr "" + +#: app/controllers/roles_controller.rb:34 +msgid "role" +msgstr "" + +#: app/controllers/sync_management_controller.rb:155 +msgid "sync did not complete successfully" +msgstr "" + +#: app/controllers/systems_controller.rb:29 +msgid "system" +msgstr "" + +#: app/controllers/users_controller.rb:36 +msgid "user" +msgstr "" diff --git a/locale/zh-CN/app.po b/locale/zh-CN/app.po new file mode 100644 index 00000000000..b67f1d08bc7 --- /dev/null +++ b/locale/zh-CN/app.po @@ -0,0 +1,1189 @@ +# Language zh-CN translations for version package. +# Copyright (C) 2011 THE version'S COPYRIGHT HOLDER +# This file is distributed under the same license as the version package. +# Jason E. Rist , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2011-06-01 15:16-0600\n" +"PO-Revision-Date: 2011-01-07 16:46-0700\n" +"Last-Translator: Jason E. Rist \n" +"Language-Team: Language zh-CN\n" +"Language: zh-CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: app/views/layouts/_footer.haml:7 +msgid " Red Hat, Inc." +msgstr "" + +#: app/controllers/users_controller.rb:52 +msgid " created successfully." +msgstr "" + +#: app/models/kp_environment.rb:38 +msgid " environment cannot be set to an environment already on its path" +msgstr "" + +#: app/helpers/translation_helper.rb:15 +msgid "%{relative_time} ago" +msgstr "" + +#: app/views/common/_panel.html.haml:39 +msgid "+ New " +msgstr "" + +#: app/views/products/index.haml:4 +msgid "Actions" +msgstr "" + +#: app/views/promotions/_packages.html.haml:14 +#: app/views/promotions/_products.html.haml:11 +#: app/views/promotions/_errata.html.haml:13 +msgid "Add" +msgstr "" + +#: app/views/organizations/_edit.html.haml:36 +msgid "Add New Environment" +msgstr "" + +#: app/views/roles/_edit.html.haml:20 +msgid "Add Permission" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:23 +msgid "Add Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:85 +msgid "Add Repository" +msgstr "" + +#: app/views/operations/index.html.haml:2 config/navigation.rb:84 +msgid "Administration" +msgstr "" + +#: app/views/roles/_permission.html.haml:23 +#: app/views/roles/_permission.html.haml:33 +#: app/views/roles/_closed_permission.html.haml:11 +#: app/views/roles/_closed_permission.html.haml:18 +msgid "All" +msgstr "" + +#: app/helpers/promotions_helper.rb:33 +#: app/views/promotions/_detail.html.haml:8 +msgid "All Errata" +msgstr "" + +#: app/views/sync_schedules/index.html.haml:12 +msgid "Apply Selected Plans to Selected Products" +msgstr "" + +#: app/views/systems/_edit.html.haml:41 +#: app/views/systems/_packages.html.haml:8 +msgid "Arch" +msgstr "" + +#: app/views/packages/_show.html.haml:25 +msgid "Architecture" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +#: app/views/sync_plans/_edit.html.haml:28 +#: app/views/organizations/_edit.html.haml:38 +#: app/views/environments/_edit.html.haml:29 +#: app/views/roles/_edit.html.haml:24 app/views/notices/show.html.haml:37 +#: app/views/common/_common_i18n.html.haml:3 +#: app/views/users/_edit.html.haml:50 +msgid "Are you sure?" +msgstr "" + +#: app/views/errata/_show.html.haml:39 +msgid "Associated Bugs" +msgstr "" + +#: app/views/promotions/show.html.haml:59 +msgid "Available Content" +msgstr "" + +#: app/views/common/403.html.haml:7 +msgid "Back" +msgstr "" + +#: config/navigation.rb:27 +msgid "Basics" +msgstr "" + +#: app/views/packages/_show.html.haml:70 +msgid "Build Date" +msgstr "" + +#: app/views/packages/_show.html.haml:64 +msgid "Build Host" +msgstr "" + +#: app/controllers/api/environments_controller.rb:38 +msgid "Can't update locker environment" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:24 +#: app/views/providers/_products_repos.html.haml:59 +#: app/views/providers/_products_repos.html.haml:103 +#: app/views/providers/_edit_product.html.haml:34 +#: app/views/roles/_permission.html.haml:42 +#: app/views/sync_management/index.html.haml:3 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Cancel" +msgstr "" + +#: app/views/users/_edit.html.haml:23 +msgid "Change Password" +msgstr "" + +#: app/views/packages/_changelog.html.haml:9 config/navigation.rb:45 +msgid "Changelog" +msgstr "" + +#: config/navigation.rb:53 +msgid "Changeset History" +msgstr "" + +#: app/views/changesets/_changeset.html.haml:21 +msgid "Changeset Summary" +msgstr "" + +#: app/controllers/changesets_controller.rb:27 +msgid "Changeset storage errors" +msgstr "" + +#: app/controllers/changesets_controller.rb:37 +msgid "Changesets" +msgstr "" + +#: app/views/systems/_edit.html.haml:54 +msgid "Checked In" +msgstr "" + +#: app/views/users/_edit.html.haml:20 +msgid "Clear" +msgstr "" + +#: app/views/users/_edit.html.haml:17 +msgid "Clear Disabled Helptips" +msgstr "" + +#: app/controllers/users_controller.rb:103 +msgid "Cleared" +msgstr "" + +#: app/views/common/_panel.html.haml:7 +msgid "Click New to create a new" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:21 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Click to edit" +msgstr "" + +#: app/views/promotions/show.html.haml:51 app/views/common/_panel.html.haml:17 +#: app/views/common/_panel.html.haml:26 +msgid "Close" +msgstr "" + +#: app/views/common/_env_select.html.haml:7 +msgid "Collapse" +msgstr "" + +#: app/views/users/_edit.html.haml:30 app/views/users/_new.html.haml:19 +msgid "Confirm" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:22 +msgid "Consumed Subscriptions" +msgstr "" + +#: app/helpers/promotions_helper.rb:31 app/views/content/index.html.haml:1 +msgid "Content" +msgstr "" + +#: config/navigation.rb:22 +msgid "Content Management" +msgstr "" + +#: app/views/layouts/_footer.haml:7 +msgid "Copyright © " +msgstr "" + +#: app/views/environments/_new.html.haml:24 config/navigation.rb:24 +msgid "Create" +msgstr "" + +#: app/views/environments/_new.html.haml:2 +msgid "Create Environment" +msgstr "" + +#: app/views/notices/show.html.haml:19 +msgid "Created" +msgstr "" + +#: app/views/promotions/show.html.haml:40 +msgid "Current Changeset" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:18 +msgid "Current Subscriptions" +msgstr "" + +#: app/views/dashboard/index.html.haml:2 config/navigation.rb:8 +msgid "Dashboard" +msgstr "" + +#: app/views/notices/show.html.haml:37 +msgid "Delete All" +msgstr "" + +#: app/views/packages/_dependencies.html.haml:12 +#: app/views/changesets/_changeset.html.haml:45 config/navigation.rb:44 +msgid "Dependencies" +msgstr "" + +#: app/views/providers/_edit.html.haml:19 +#: app/views/providers/_form.html.haml:12 +#: app/views/providers/_products_repos.html.haml:34 +#: app/views/providers/_edit_product.html.haml:12 +#: app/views/sync_plans/_edit.html.haml:13 +#: app/views/sync_plans/_form.html.haml:10 +#: app/views/organizations/_edit.html.haml:12 +#: app/views/organizations/_new.html.haml:12 +#: app/views/environments/_edit.html.haml:18 +#: app/views/environments/_new.html.haml:14 +#: app/views/systems/_edit.html.haml:29 app/views/packages/_show.html.haml:19 +#: app/views/notices/show.html.haml:23 app/views/errata/_show.html.haml:45 +msgid "Description" +msgstr "" + +#: app/views/changesets/_edit.html.haml:9 config/navigation.rb:43 +#: config/navigation.rb:49 +msgid "Details" +msgstr "" + +#: app/controllers/users_controller.rb:102 +msgid "Disabled help tips have been re-enabled." +msgstr "" + +#: app/views/packages/_show.html.haml:89 +msgid "Download" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:3 +msgid "Edit Product" +msgstr "" + +#: app/views/providers/_edit.html.haml:4 +msgid "Edit Provider" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:3 +msgid "Edit Repository" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:5 +msgid "Edit Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:2 +msgid "Edit User" +msgstr "" + +#: app/views/users/_edit.html.haml:12 +msgid "Enable inline help" +msgstr "" + +#: app/views/environments/_edit.html.haml:6 +msgid "Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:16 +msgid "Environment Promotion Paths" +msgstr "" + +#: app/models/kp_environment.rb:15 +msgid "Environment cannot be in its own promotion path" +msgstr "" + +#: app/helpers/promotions_helper.rb:49 +#: app/views/promotions/_detail.html.haml:18 +#: app/views/changesets/_edit.html.haml:33 +#: app/views/changesets/_changeset.html.haml:30 +msgid "Errata" +msgstr "" + +#: app/views/sync_management/index.html.haml:3 +msgid "Error" +msgstr "" + +#: app/controllers/sync_management_controller.rb:25 +msgid "Error syncing!" +msgstr "" + +#: app/views/sync_management/_products.html.haml:9 +msgid "Est Size (Packages)" +msgstr "" + +#: app/views/common/_env_select.html.haml:5 +msgid "Expand" +msgstr "" + +#: app/views/systems/_facts.html.haml:10 +msgid "Fact" +msgstr "" + +#: config/navigation.rb:68 +msgid "Facts" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:52 +msgid "File" +msgstr "" + +#: app/views/packages/_filelist.html.haml:8 config/navigation.rb:46 +msgid "Filelist" +msgstr "" + +#: app/views/products/index.haml:8 +msgid "Filter" +msgstr "" + +#: app/views/sync_management/_products.html.haml:8 +msgid "Finish Time" +msgstr "" + +#: config/navigation.rb:63 +msgid "General" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Good" +msgstr "" + +#: app/views/systems/_facts.html.haml:9 +msgid "Group" +msgstr "" + +#: config/navigation.rb:76 +msgid "Groups" +msgstr "" + +#: app/views/systems/_edit.html.haml:13 +msgid "ID" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:17 +#: app/views/sync_plans/_form.html.haml:15 +msgid "Interval" +msgstr "" + +#: app/views/errata/_show.html.haml:19 +msgid "Issued" +msgstr "" + +#: app/helpers/application_helper.rb:19 +msgid "Katello" +msgstr "" + +#: app/views/systems/_edit.html.haml:62 +msgid "Last Booted" +msgstr "" + +#: app/views/notices/show.html.haml:21 +msgid "Level" +msgstr "" + +#: app/views/packages/_show.html.haml:77 +msgid "License" +msgstr "" + +#: config/navigation.rb:80 +msgid "List" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:16 +msgid "" +"Listed below are the products available from the selected provider, as well " +"as the related subscription information. If you have a subscription " +"manifest you may upload it below. This manifest may be obtained by visiting " +"the Red Hat Customer Portal or by contacting your support representative." +msgstr "" + +#: app/views/systems/_edit.html.haml:45 +msgid "Location" +msgstr "" + +#: app/controllers/environments_controller.rb:39 +#: app/controllers/environments_controller.rb:73 +#: app/views/environments/_new.html.haml:21 +#: app/views/common/_env_select.html.haml:14 +#: app/views/common/_env_select.html.haml:29 +msgid "Locker" +msgstr "" + +#: app/views/user_sessions/new.html.haml:5 +#: app/views/user_sessions/new.html.haml:18 +msgid "Log In" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:41 +msgid "Login Successful" +msgstr "" + +#: app/views/layouts/_footer.haml:5 app/views/layouts/_header.haml:23 +#: app/views/accounts/show.html.haml:6 +msgid "Logout" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:50 +msgid "Logout Successful" +msgstr "" + +#: app/views/providers/schedule.html.haml:2 +msgid "Manage Providers" +msgstr "" + +#: config/navigation.rb:10 +msgid "Monitors" +msgstr "" + +#: app/views/providers/_edit.html.haml:14 +#: app/views/providers/_edit_repository.html.haml:7 +#: app/views/providers/_form.html.haml:6 +#: app/views/providers/_products_repos.html.haml:29 +#: app/views/providers/_products_repos.html.haml:91 +#: app/views/providers/_edit_product.html.haml:7 +#: app/views/providers/_subscriptions.html.haml:21 +#: app/views/sync_plans/_edit.html.haml:9 +#: app/views/sync_plans/_form.html.haml:5 +#: app/views/organizations/_new.html.haml:7 +#: app/views/environments/_edit.html.haml:13 +#: app/views/environments/_new.html.haml:8 +#: app/views/systems/_edit.html.haml:25 +#: app/views/systems/_packages.html.haml:7 app/views/roles/_edit.html.haml:10 +#: app/views/roles/_new.html.haml:8 app/views/packages/_show.html.haml:11 +#: app/views/changesets/_edit.html.haml:14 +msgid "Name" +msgstr "" + +#: app/views/changesets/_name.html.haml:3 +msgid "Name:" +msgstr "" + +#: app/views/organizations/_new.html.haml:2 +msgid "New Organization" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:25 +msgid "New Product" +msgstr "" + +#: app/views/providers/_new.html.haml:4 +msgid "New Provider" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:87 +msgid "New Repository" +msgstr "" + +#: app/views/roles/_new.html.haml:3 +msgid "New Role" +msgstr "" + +#: app/views/sync_plans/_new.html.haml:4 +msgid "New Sync Plan" +msgstr "" + +#: app/views/users/_new.html.haml:2 +msgid "New User" +msgstr "" + +#: app/views/organizations/_edit.html.haml:31 +msgid "" +"No environments are available in this organization. Please add some " +"environments to be able register systems to this organization." +msgstr "" + +#: app/views/promotions/_errata.html.haml:3 +msgid "No errata available." +msgstr "" + +#: app/views/promotions/_packages.html.haml:3 +msgid "No packages available for promotion" +msgstr "" + +#: app/views/promotions/_products.html.haml:3 +msgid "No products" +msgstr "" + +#: app/views/systems/_edit.html.haml:63 +msgid "None" +msgstr "" + +#: app/controllers/providers_controller.rb:109 +msgid "None Imported" +msgstr "" + +#: app/controllers/sync_management_controller.rb:27 +msgid "Not synced." +msgstr "" + +#: config/navigation.rb:14 +msgid "Notifications" +msgstr "" + +#: app/views/systems/_edit.html.haml:33 +msgid "OS" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:18 +msgid "" +"On Products & Repositories you can add your own Products and Repositories to " +"your Provider. This allows you to synchronize content from any remote " +"repository to this server. Simply add a Product and then setup one or more " +"repositories to add to this Provider. This feature is only available for " +"Custom Providers." +msgstr "" + +#: app/models/provider.rb:46 +msgid "Only one Red Hat provider permitted for an Organization" +msgstr "" + +#: app/helpers/application_helper.rb:23 +msgid "Open Source Systems Management" +msgstr "" + +#: app/controllers/organizations_controller.rb:36 +msgid "Organization" +msgstr "" + +#: app/controllers/organizations_controller.rb:34 config/navigation.rb:79 +msgid "Organizations" +msgstr "" + +#: app/views/organizations/index.html.haml:14 +msgid "" +"Organizations allow content and systems to be separated by logical " +"divisions. To edit the environments within an organization, click on that " +"organization and then click on the desired environment." +msgstr "" + +#: app/views/promotions/show.html.haml:13 +msgid "Package Dependencies" +msgstr "" + +#: app/views/packages/_show.html.haml:83 +msgid "Package Group" +msgstr "" + +#: app/views/packages/_show.html.haml:51 +msgid "Package Size" +msgstr "" + +#: app/helpers/promotions_helper.rb:45 +#: app/views/promotions/_detail.html.haml:14 +#: app/views/changesets/_edit.html.haml:39 +#: app/views/changesets/_changeset.html.haml:36 +#: app/views/changesets/_changeset.html.haml:47 +#: app/views/errata/_packages.html.haml:10 config/navigation.rb:50 +#: config/navigation.rb:71 +msgid "Packages" +msgstr "" + +#: app/views/users/_new.html.haml:12 +msgid "Password" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Password Strength" +msgstr "" + +#: app/views/roles/_permission.html.haml:4 +msgid "Permission" +msgstr "" + +#: app/controllers/roles_controller.rb:116 +msgid "Permission created." +msgstr "" + +#: app/views/common/403.html.haml:1 +msgid "Permission denied" +msgstr "" + +#: app/controllers/roles_controller.rb:106 +msgid "Permission updated." +msgstr "" + +#: app/controllers/sync_plans_controller.rb:21 +#: app/controllers/sync_schedules_controller.rb:29 +#: app/controllers/sync_schedules_controller.rb:35 +msgid "Plan" +msgstr "" + +#: app/views/common/403.html.haml:4 +msgid "Please request the required privileges from an administrator." +msgstr "" + +#: app/views/environments/_new.html.haml:19 +msgid "Prior Environment" +msgstr "" + +#: app/views/environments/_edit.html.haml:24 +msgid "Prior Environments" +msgstr "" + +#: app/views/sync_management/_products.html.haml:6 +msgid "Product" +msgstr "" + +#: app/controllers/providers_controller.rb:71 +msgid "Product created." +msgstr "" + +#: app/controllers/providers_controller.rb:84 +msgid "Product removed." +msgstr "" + +#: app/helpers/promotions_helper.rb:35 app/views/products/index.haml:15 +#: app/views/promotions/_detail.html.haml:5 +#: app/views/sync_management/_products.html.haml:2 +#: app/views/changesets/_edit.html.haml:27 +#: app/views/changesets/_changeset.html.haml:25 +msgid "Products" +msgstr "" + +#: config/navigation.rb:31 +msgid "Products & Repositories" +msgstr "" + +#: app/views/sync_management/_products.html.haml:10 +msgid "Progress" +msgstr "" + +#: app/views/promotions/show.html.haml:46 +msgid "Promote to" +msgstr "" + +#: app/views/promotions/_packages.html.haml:8 +msgid "Promoted" +msgstr "" + +#: app/views/changesets/_edit.html.haml:19 +msgid "Promotion Date" +msgstr "" + +#: config/navigation.rb:41 +msgid "Promotions" +msgstr "" + +#: app/views/promotions/show.html.haml:36 +msgid "" +"Promotions allow you to promote content from one environment to the next " +"along a promotion path. Clicking \"Add\" next to one or more products will " +"add them to the change set. If products already exist in the next " +"environment, you may promote other types of content. Once you have created a " +"change set, click the \"Promote\" button to commit it to the next " +"environment." +msgstr "" + +#: app/controllers/providers_controller.rb:141 +msgid "Provider" +msgstr "" + +#: app/controllers/providers_controller.rb:139 config/navigation.rb:23 +msgid "Providers" +msgstr "" + +#: app/views/providers/index.html.haml:13 +msgid "" +"Providers provide many types of content such as packages, errata, kickstart " +"trees, and installation disc images. A provider may be delivering all of " +"your paid content or it could simply be a local yum repostory providing a " +"few yum repos." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:27 +msgid "Provides" +msgstr "" + +#: config/navigation.rb:87 +msgid "Proxies" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:23 +msgid "Quantity Available" +msgstr "" + +#: app/controllers/sync_management_controller.rb:23 +msgid "Queued." +msgstr "" + +#: app/views/systems/_edit.html.haml:58 config/navigation.rb:61 +msgid "Registered" +msgstr "" + +#: app/views/systems/_edit.html.haml:37 +msgid "Release" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:22 +#: app/views/providers/_edit_product.html.haml:32 +#: app/views/promotions/_packages.html.haml:11 +#: app/views/promotions/_products.html.haml:8 +#: app/views/promotions/_errata.html.haml:10 +msgid "Remove" +msgstr "" + +#: app/views/environments/_edit.html.haml:30 +msgid "Remove Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:39 +msgid "Remove Organization" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +msgid "Remove Provider" +msgstr "" + +#: app/views/roles/_edit.html.haml:24 +msgid "Remove Role" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:28 +msgid "Remove Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:50 +msgid "Remove User" +msgstr "" + +#: app/controllers/providers_controller.rb:57 +msgid "Repo removed." +msgstr "" + +#: config/navigation.rb:12 +msgid "Reports" +msgstr "" + +#: app/views/providers/_edit.html.haml:30 +#: app/views/providers/_form.html.haml:24 +msgid "Repository Url" +msgstr "" + +#: app/controllers/providers_controller.rb:49 +msgid "Repository created." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:19 +msgid "Requires" +msgstr "" + +#: app/controllers/roles_controller.rb:33 app/views/roles/_edit.html.haml:5 +msgid "Role" +msgstr "" + +#: app/controllers/roles_controller.rb:51 +msgid "Role created." +msgstr "" + +#: app/controllers/roles_controller.rb:65 +msgid "Role updated." +msgstr "" + +#: app/controllers/roles_controller.rb:31 app/views/users/_edit.html.haml:42 +#: config/navigation.rb:86 +msgid "Roles" +msgstr "" + +#: app/controllers/sync_management_controller.rb:26 +msgid "Running." +msgstr "" + +#: app/views/providers/_form.html.haml:29 +#: app/views/sync_plans/_form.html.haml:32 +#: app/views/organizations/_new.html.haml:16 +#: app/views/roles/_permission.html.haml:39 +#: app/views/common/_edit_i18n.html.haml:3 app/views/users/_edit.html.haml:35 +msgid "Save" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:57 +msgid "Save Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:101 +msgid "Save Repository" +msgstr "" + +#: app/views/users/_edit.html.haml:48 +msgid "Save Roles" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:9 +msgid "Save Subscriptions" +msgstr "" + +#: app/views/users/_new.html.haml:28 +msgid "Save User" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Saving..." +msgstr "" + +#: app/views/providers/schedule.html.haml:4 +msgid "Schedule" +msgstr "" + +#: app/views/roles/_permission.html.haml:20 +#: app/views/roles/_closed_permission.html.haml:8 +msgid "Scope" +msgstr "" + +#: app/views/notices/show.html.haml:8 app/views/common/_panel.html.haml:44 +msgid "Search" +msgstr "" + +#: app/views/sync_management/_products.html.haml:74 +msgid "Select All" +msgstr "" + +#: app/views/sync_management/_products.html.haml:71 +msgid "Select None" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:33 +msgid "Select Plans to apply to selected Products" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:27 +msgid "Select Products to schedule" +msgstr "" + +#: app/views/common/_panel.html.haml:11 +msgid "Select Result" +msgstr "" + +#: app/views/packages/_show.html.haml:42 +msgid "Signature" +msgstr "" + +#: app/views/packages/_show.html.haml:96 +msgid "Source Package" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:35 +msgid "Specify Local Manifest" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:21 +#: app/views/sync_plans/_form.html.haml:20 +msgid "Start Date" +msgstr "" + +#: app/views/sync_management/_products.html.haml:7 +msgid "Start Time" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Strong" +msgstr "" + +#: app/controllers/providers_controller.rb:96 +msgid "Subscription uploaded successfully" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:4 config/navigation.rb:29 +#: config/navigation.rb:65 +msgid "Subscriptions" +msgstr "" + +#: app/views/products/index.haml:21 +msgid "Sync" +msgstr "" + +#: config/navigation.rb:35 +msgid "Sync Management" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:19 config/navigation.rb:37 +msgid "Sync Plans" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:57 +msgid "Sync Plans applied successfully." +msgstr "" + +#: config/navigation.rb:38 +msgid "Sync Schedule" +msgstr "" + +#: config/navigation.rb:36 +msgid "Sync Status" +msgstr "" + +#: app/controllers/sync_management_controller.rb:24 +#: app/views/sync_management/index.html.haml:3 +msgid "Sync complete." +msgstr "" + +#: app/views/products/index.haml:11 +msgid "Synced" +msgstr "" + +#: app/views/sync_management/_products.html.haml:75 +msgid "Synchronize Now" +msgstr "" + +#: app/views/systems/_edit.html.haml:3 app/views/systems/_packages.html.haml:1 +#: app/views/systems/_facts.html.haml:1 +#: app/views/systems/_subscriptions.html.haml:1 +msgid "System" +msgstr "" + +#: app/views/systems/_edit.html.haml:50 +msgid "System Events" +msgstr "" + +#: app/views/systems/_edit.html.haml:9 +msgid "System Info" +msgstr "" + +#: app/views/systems/_edit.html.haml:21 +msgid "System Properties" +msgstr "" + +#: app/controllers/systems_controller.rb:43 +msgid "System subscriptions updated." +msgstr "" + +#: app/controllers/systems_controller.rb:64 +msgid "System updated." +msgstr "" + +#: app/controllers/systems_controller.rb:26 config/navigation.rb:59 +msgid "Systems" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "The passwords do not match" +msgstr "" + +#: app/controllers/providers_controller.rb:99 +msgid "There was a format error with your Subscription Manifest" +msgstr "" + +#: app/views/dashboard/index.html.haml:6 +msgid "" +"This is to be the Dashboard area containing Monitors, Reporting, and " +"Workflow branches." +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:25 +#: app/views/sync_plans/_form.html.haml:25 +msgid "Time" +msgstr "" + +#: app/views/providers/_edit.html.haml:24 +#: app/views/providers/_edit_repository.html.haml:17 +#: app/views/providers/_form.html.haml:18 +#: app/views/roles/_permission.html.haml:13 +#: app/views/roles/_closed_permission.html.haml:3 +#: app/views/errata/_show.html.haml:12 +msgid "Type" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:44 +msgid "Types" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:12 +#: app/views/providers/_products_repos.html.haml:39 +#: app/views/providers/_products_repos.html.haml:96 +#: app/views/providers/_edit_product.html.haml:19 +msgid "URL" +msgstr "" + +#: app/views/systems/_edit.html.haml:17 +msgid "UUID" +msgstr "" + +#: app/views/products/index.haml:13 +msgid "Unsynced" +msgstr "" + +#: app/views/errata/_show.html.haml:25 +msgid "Updated" +msgstr "" + +#: config/navigation.rb:54 +msgid "Updates Bundle" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:38 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Upload" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:32 +msgid "Upload Subscription Manifest" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Uploading" +msgstr "" + +#: app/controllers/users_controller.rb:35 +msgid "User" +msgstr "" + +#: app/views/notices/show.html.haml:11 +msgid "User Notifications" +msgstr "" + +#: app/views/notices/show.html.haml:15 +msgid "" +"User notifications lists all notifications generated by a user as well as " +"global notifications that are sent to all users." +msgstr "" + +#: app/controllers/users_controller.rb:72 +msgid "User updated successfully." +msgstr "" + +#: app/views/users/_edit.html.haml:7 app/views/users/_new.html.haml:7 +msgid "Username" +msgstr "" + +#: app/controllers/users_controller.rb:33 config/navigation.rb:85 +msgid "Users" +msgstr "" + +#: app/views/systems/_facts.html.haml:11 +msgid "Value" +msgstr "" + +#: app/views/roles/_permission.html.haml:30 +#: app/views/roles/_closed_permission.html.haml:15 +msgid "Verbs" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Very Weak" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Weak" +msgstr "" + +#: app/controllers/application_controller.rb:205 +msgid "Welcome Back!" +msgstr "" + +#: config/navigation.rb:16 +msgid "Workflow" +msgstr "" + +#: app/views/common/403.html.haml:3 +msgid "You are not authorised to perform this action." +msgstr "" + +#: app/controllers/application_controller.rb:162 +#: app/controllers/application_controller.rb:195 +msgid "You must be logged in to access that page." +msgstr "" + +#: app/controllers/application_controller.rb:176 +msgid "" +"You must have at least one organization in your database to access that " +"page. Might need to run 'rake db:seed'" +msgstr "" + +#: app/controllers/failed_authentication_controller.rb:18 +msgid "" +"You've entered an incorrect username or password combination, please try " +"again." +msgstr "" + +#: app/views/providers/_products_repos.html.haml:47 +msgid "Yum" +msgstr "" + +#: app/models/katello_name_format_validator.rb:20 +msgid "can't be blank" +msgstr "" + +#: app/models/katello_name_format_validator.rb:16 +msgid "cannot contain characters other than alpha numerals, space,'_', '-'." +msgstr "" + +#: app/models/username_validator.rb:16 +msgid "cannot contain characters other than alpha numerals,'_', '-'." +msgstr "" + +#: app/controllers/changesets_controller.rb:40 +msgid "changeset" +msgstr "" + +#: app/models/kp_environment.rb:27 +msgid "environment cannot be a prior to a different environment" +msgstr "" + +#: app/models/kp_environment.rb:69 +msgid "must be unique within one organization" +msgstr "" + +#: app/models/no_trailing_space_validator.rb:20 +msgid "must not contain leading or trailing white spaces." +msgstr "" + +#: app/controllers/organizations_controller.rb:37 +msgid "organization" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:22 +#: app/controllers/sync_schedules_controller.rb:36 +msgid "plan" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:30 +msgid "product" +msgstr "" + +#: app/controllers/sync_management_controller.rb:150 +msgid "product was synced successfully" +msgstr "" + +#: app/controllers/sync_management_controller.rb:147 +msgid "product was synced successfully with errors. See log for details" +msgstr "" + +#: app/controllers/providers_controller.rb:142 +msgid "provider" +msgstr "" + +#: app/controllers/roles_controller.rb:34 +msgid "role" +msgstr "" + +#: app/controllers/sync_management_controller.rb:155 +msgid "sync did not complete successfully" +msgstr "" + +#: app/controllers/systems_controller.rb:29 +msgid "system" +msgstr "" + +#: app/controllers/users_controller.rb:36 +msgid "user" +msgstr "" diff --git a/locale/zh-TW/app.po b/locale/zh-TW/app.po new file mode 100644 index 00000000000..352e7cc8080 --- /dev/null +++ b/locale/zh-TW/app.po @@ -0,0 +1,1189 @@ +# Language zh-TW translations for version package. +# Copyright (C) 2011 THE version'S COPYRIGHT HOLDER +# This file is distributed under the same license as the version package. +# Jason E. Rist , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: version 0.0.1\n" +"POT-Creation-Date: 2011-06-01 15:16-0600\n" +"PO-Revision-Date: 2011-01-07 16:47-0700\n" +"Last-Translator: Jason E. Rist \n" +"Language-Team: Language zh-TW\n" +"Language: zh-TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: app/views/layouts/_footer.haml:7 +msgid " Red Hat, Inc." +msgstr "" + +#: app/controllers/users_controller.rb:52 +msgid " created successfully." +msgstr "" + +#: app/models/kp_environment.rb:38 +msgid " environment cannot be set to an environment already on its path" +msgstr "" + +#: app/helpers/translation_helper.rb:15 +msgid "%{relative_time} ago" +msgstr "" + +#: app/views/common/_panel.html.haml:39 +msgid "+ New " +msgstr "" + +#: app/views/products/index.haml:4 +msgid "Actions" +msgstr "" + +#: app/views/promotions/_packages.html.haml:14 +#: app/views/promotions/_products.html.haml:11 +#: app/views/promotions/_errata.html.haml:13 +msgid "Add" +msgstr "" + +#: app/views/organizations/_edit.html.haml:36 +msgid "Add New Environment" +msgstr "" + +#: app/views/roles/_edit.html.haml:20 +msgid "Add Permission" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:23 +msgid "Add Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:85 +msgid "Add Repository" +msgstr "" + +#: app/views/operations/index.html.haml:2 config/navigation.rb:84 +msgid "Administration" +msgstr "" + +#: app/views/roles/_permission.html.haml:23 +#: app/views/roles/_permission.html.haml:33 +#: app/views/roles/_closed_permission.html.haml:11 +#: app/views/roles/_closed_permission.html.haml:18 +msgid "All" +msgstr "" + +#: app/helpers/promotions_helper.rb:33 +#: app/views/promotions/_detail.html.haml:8 +msgid "All Errata" +msgstr "" + +#: app/views/sync_schedules/index.html.haml:12 +msgid "Apply Selected Plans to Selected Products" +msgstr "" + +#: app/views/systems/_edit.html.haml:41 +#: app/views/systems/_packages.html.haml:8 +msgid "Arch" +msgstr "" + +#: app/views/packages/_show.html.haml:25 +msgid "Architecture" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +#: app/views/sync_plans/_edit.html.haml:28 +#: app/views/organizations/_edit.html.haml:38 +#: app/views/environments/_edit.html.haml:29 +#: app/views/roles/_edit.html.haml:24 app/views/notices/show.html.haml:37 +#: app/views/common/_common_i18n.html.haml:3 +#: app/views/users/_edit.html.haml:50 +msgid "Are you sure?" +msgstr "" + +#: app/views/errata/_show.html.haml:39 +msgid "Associated Bugs" +msgstr "" + +#: app/views/promotions/show.html.haml:59 +msgid "Available Content" +msgstr "" + +#: app/views/common/403.html.haml:7 +msgid "Back" +msgstr "" + +#: config/navigation.rb:27 +msgid "Basics" +msgstr "" + +#: app/views/packages/_show.html.haml:70 +msgid "Build Date" +msgstr "" + +#: app/views/packages/_show.html.haml:64 +msgid "Build Host" +msgstr "" + +#: app/controllers/api/environments_controller.rb:38 +msgid "Can't update locker environment" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:24 +#: app/views/providers/_products_repos.html.haml:59 +#: app/views/providers/_products_repos.html.haml:103 +#: app/views/providers/_edit_product.html.haml:34 +#: app/views/roles/_permission.html.haml:42 +#: app/views/sync_management/index.html.haml:3 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Cancel" +msgstr "" + +#: app/views/users/_edit.html.haml:23 +msgid "Change Password" +msgstr "" + +#: app/views/packages/_changelog.html.haml:9 config/navigation.rb:45 +msgid "Changelog" +msgstr "" + +#: config/navigation.rb:53 +msgid "Changeset History" +msgstr "" + +#: app/views/changesets/_changeset.html.haml:21 +msgid "Changeset Summary" +msgstr "" + +#: app/controllers/changesets_controller.rb:27 +msgid "Changeset storage errors" +msgstr "" + +#: app/controllers/changesets_controller.rb:37 +msgid "Changesets" +msgstr "" + +#: app/views/systems/_edit.html.haml:54 +msgid "Checked In" +msgstr "" + +#: app/views/users/_edit.html.haml:20 +msgid "Clear" +msgstr "" + +#: app/views/users/_edit.html.haml:17 +msgid "Clear Disabled Helptips" +msgstr "" + +#: app/controllers/users_controller.rb:103 +msgid "Cleared" +msgstr "" + +#: app/views/common/_panel.html.haml:7 +msgid "Click New to create a new" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:21 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Click to edit" +msgstr "" + +#: app/views/promotions/show.html.haml:51 app/views/common/_panel.html.haml:17 +#: app/views/common/_panel.html.haml:26 +msgid "Close" +msgstr "" + +#: app/views/common/_env_select.html.haml:7 +msgid "Collapse" +msgstr "" + +#: app/views/users/_edit.html.haml:30 app/views/users/_new.html.haml:19 +msgid "Confirm" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:22 +msgid "Consumed Subscriptions" +msgstr "" + +#: app/helpers/promotions_helper.rb:31 app/views/content/index.html.haml:1 +msgid "Content" +msgstr "" + +#: config/navigation.rb:22 +msgid "Content Management" +msgstr "" + +#: app/views/layouts/_footer.haml:7 +msgid "Copyright © " +msgstr "" + +#: app/views/environments/_new.html.haml:24 config/navigation.rb:24 +msgid "Create" +msgstr "" + +#: app/views/environments/_new.html.haml:2 +msgid "Create Environment" +msgstr "" + +#: app/views/notices/show.html.haml:19 +msgid "Created" +msgstr "" + +#: app/views/promotions/show.html.haml:40 +msgid "Current Changeset" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:18 +msgid "Current Subscriptions" +msgstr "" + +#: app/views/dashboard/index.html.haml:2 config/navigation.rb:8 +msgid "Dashboard" +msgstr "" + +#: app/views/notices/show.html.haml:37 +msgid "Delete All" +msgstr "" + +#: app/views/packages/_dependencies.html.haml:12 +#: app/views/changesets/_changeset.html.haml:45 config/navigation.rb:44 +msgid "Dependencies" +msgstr "" + +#: app/views/providers/_edit.html.haml:19 +#: app/views/providers/_form.html.haml:12 +#: app/views/providers/_products_repos.html.haml:34 +#: app/views/providers/_edit_product.html.haml:12 +#: app/views/sync_plans/_edit.html.haml:13 +#: app/views/sync_plans/_form.html.haml:10 +#: app/views/organizations/_edit.html.haml:12 +#: app/views/organizations/_new.html.haml:12 +#: app/views/environments/_edit.html.haml:18 +#: app/views/environments/_new.html.haml:14 +#: app/views/systems/_edit.html.haml:29 app/views/packages/_show.html.haml:19 +#: app/views/notices/show.html.haml:23 app/views/errata/_show.html.haml:45 +msgid "Description" +msgstr "" + +#: app/views/changesets/_edit.html.haml:9 config/navigation.rb:43 +#: config/navigation.rb:49 +msgid "Details" +msgstr "" + +#: app/controllers/users_controller.rb:102 +msgid "Disabled help tips have been re-enabled." +msgstr "" + +#: app/views/packages/_show.html.haml:89 +msgid "Download" +msgstr "" + +#: app/views/providers/_edit_product.html.haml:3 +msgid "Edit Product" +msgstr "" + +#: app/views/providers/_edit.html.haml:4 +msgid "Edit Provider" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:3 +msgid "Edit Repository" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:5 +msgid "Edit Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:2 +msgid "Edit User" +msgstr "" + +#: app/views/users/_edit.html.haml:12 +msgid "Enable inline help" +msgstr "" + +#: app/views/environments/_edit.html.haml:6 +msgid "Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:16 +msgid "Environment Promotion Paths" +msgstr "" + +#: app/models/kp_environment.rb:15 +msgid "Environment cannot be in its own promotion path" +msgstr "" + +#: app/helpers/promotions_helper.rb:49 +#: app/views/promotions/_detail.html.haml:18 +#: app/views/changesets/_edit.html.haml:33 +#: app/views/changesets/_changeset.html.haml:30 +msgid "Errata" +msgstr "" + +#: app/views/sync_management/index.html.haml:3 +msgid "Error" +msgstr "" + +#: app/controllers/sync_management_controller.rb:25 +msgid "Error syncing!" +msgstr "" + +#: app/views/sync_management/_products.html.haml:9 +msgid "Est Size (Packages)" +msgstr "" + +#: app/views/common/_env_select.html.haml:5 +msgid "Expand" +msgstr "" + +#: app/views/systems/_facts.html.haml:10 +msgid "Fact" +msgstr "" + +#: config/navigation.rb:68 +msgid "Facts" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:52 +msgid "File" +msgstr "" + +#: app/views/packages/_filelist.html.haml:8 config/navigation.rb:46 +msgid "Filelist" +msgstr "" + +#: app/views/products/index.haml:8 +msgid "Filter" +msgstr "" + +#: app/views/sync_management/_products.html.haml:8 +msgid "Finish Time" +msgstr "" + +#: config/navigation.rb:63 +msgid "General" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Good" +msgstr "" + +#: app/views/systems/_facts.html.haml:9 +msgid "Group" +msgstr "" + +#: config/navigation.rb:76 +msgid "Groups" +msgstr "" + +#: app/views/systems/_edit.html.haml:13 +msgid "ID" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:17 +#: app/views/sync_plans/_form.html.haml:15 +msgid "Interval" +msgstr "" + +#: app/views/errata/_show.html.haml:19 +msgid "Issued" +msgstr "" + +#: app/helpers/application_helper.rb:19 +msgid "Katello" +msgstr "" + +#: app/views/systems/_edit.html.haml:62 +msgid "Last Booted" +msgstr "" + +#: app/views/notices/show.html.haml:21 +msgid "Level" +msgstr "" + +#: app/views/packages/_show.html.haml:77 +msgid "License" +msgstr "" + +#: config/navigation.rb:80 +msgid "List" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:16 +msgid "" +"Listed below are the products available from the selected provider, as well " +"as the related subscription information. If you have a subscription " +"manifest you may upload it below. This manifest may be obtained by visiting " +"the Red Hat Customer Portal or by contacting your support representative." +msgstr "" + +#: app/views/systems/_edit.html.haml:45 +msgid "Location" +msgstr "" + +#: app/controllers/environments_controller.rb:39 +#: app/controllers/environments_controller.rb:73 +#: app/views/environments/_new.html.haml:21 +#: app/views/common/_env_select.html.haml:14 +#: app/views/common/_env_select.html.haml:29 +msgid "Locker" +msgstr "" + +#: app/views/user_sessions/new.html.haml:5 +#: app/views/user_sessions/new.html.haml:18 +msgid "Log In" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:41 +msgid "Login Successful" +msgstr "" + +#: app/views/layouts/_footer.haml:5 app/views/layouts/_header.haml:23 +#: app/views/accounts/show.html.haml:6 +msgid "Logout" +msgstr "" + +#: app/controllers/user_sessions_controller.rb:50 +msgid "Logout Successful" +msgstr "" + +#: app/views/providers/schedule.html.haml:2 +msgid "Manage Providers" +msgstr "" + +#: config/navigation.rb:10 +msgid "Monitors" +msgstr "" + +#: app/views/providers/_edit.html.haml:14 +#: app/views/providers/_edit_repository.html.haml:7 +#: app/views/providers/_form.html.haml:6 +#: app/views/providers/_products_repos.html.haml:29 +#: app/views/providers/_products_repos.html.haml:91 +#: app/views/providers/_edit_product.html.haml:7 +#: app/views/providers/_subscriptions.html.haml:21 +#: app/views/sync_plans/_edit.html.haml:9 +#: app/views/sync_plans/_form.html.haml:5 +#: app/views/organizations/_new.html.haml:7 +#: app/views/environments/_edit.html.haml:13 +#: app/views/environments/_new.html.haml:8 +#: app/views/systems/_edit.html.haml:25 +#: app/views/systems/_packages.html.haml:7 app/views/roles/_edit.html.haml:10 +#: app/views/roles/_new.html.haml:8 app/views/packages/_show.html.haml:11 +#: app/views/changesets/_edit.html.haml:14 +msgid "Name" +msgstr "" + +#: app/views/changesets/_name.html.haml:3 +msgid "Name:" +msgstr "" + +#: app/views/organizations/_new.html.haml:2 +msgid "New Organization" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:25 +msgid "New Product" +msgstr "" + +#: app/views/providers/_new.html.haml:4 +msgid "New Provider" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:87 +msgid "New Repository" +msgstr "" + +#: app/views/roles/_new.html.haml:3 +msgid "New Role" +msgstr "" + +#: app/views/sync_plans/_new.html.haml:4 +msgid "New Sync Plan" +msgstr "" + +#: app/views/users/_new.html.haml:2 +msgid "New User" +msgstr "" + +#: app/views/organizations/_edit.html.haml:31 +msgid "" +"No environments are available in this organization. Please add some " +"environments to be able register systems to this organization." +msgstr "" + +#: app/views/promotions/_errata.html.haml:3 +msgid "No errata available." +msgstr "" + +#: app/views/promotions/_packages.html.haml:3 +msgid "No packages available for promotion" +msgstr "" + +#: app/views/promotions/_products.html.haml:3 +msgid "No products" +msgstr "" + +#: app/views/systems/_edit.html.haml:63 +msgid "None" +msgstr "" + +#: app/controllers/providers_controller.rb:109 +msgid "None Imported" +msgstr "" + +#: app/controllers/sync_management_controller.rb:27 +msgid "Not synced." +msgstr "" + +#: config/navigation.rb:14 +msgid "Notifications" +msgstr "" + +#: app/views/systems/_edit.html.haml:33 +msgid "OS" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:18 +msgid "" +"On Products & Repositories you can add your own Products and Repositories to " +"your Provider. This allows you to synchronize content from any remote " +"repository to this server. Simply add a Product and then setup one or more " +"repositories to add to this Provider. This feature is only available for " +"Custom Providers." +msgstr "" + +#: app/models/provider.rb:46 +msgid "Only one Red Hat provider permitted for an Organization" +msgstr "" + +#: app/helpers/application_helper.rb:23 +msgid "Open Source Systems Management" +msgstr "" + +#: app/controllers/organizations_controller.rb:36 +msgid "Organization" +msgstr "" + +#: app/controllers/organizations_controller.rb:34 config/navigation.rb:79 +msgid "Organizations" +msgstr "" + +#: app/views/organizations/index.html.haml:14 +msgid "" +"Organizations allow content and systems to be separated by logical " +"divisions. To edit the environments within an organization, click on that " +"organization and then click on the desired environment." +msgstr "" + +#: app/views/promotions/show.html.haml:13 +msgid "Package Dependencies" +msgstr "" + +#: app/views/packages/_show.html.haml:83 +msgid "Package Group" +msgstr "" + +#: app/views/packages/_show.html.haml:51 +msgid "Package Size" +msgstr "" + +#: app/helpers/promotions_helper.rb:45 +#: app/views/promotions/_detail.html.haml:14 +#: app/views/changesets/_edit.html.haml:39 +#: app/views/changesets/_changeset.html.haml:36 +#: app/views/changesets/_changeset.html.haml:47 +#: app/views/errata/_packages.html.haml:10 config/navigation.rb:50 +#: config/navigation.rb:71 +msgid "Packages" +msgstr "" + +#: app/views/users/_new.html.haml:12 +msgid "Password" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Password Strength" +msgstr "" + +#: app/views/roles/_permission.html.haml:4 +msgid "Permission" +msgstr "" + +#: app/controllers/roles_controller.rb:116 +msgid "Permission created." +msgstr "" + +#: app/views/common/403.html.haml:1 +msgid "Permission denied" +msgstr "" + +#: app/controllers/roles_controller.rb:106 +msgid "Permission updated." +msgstr "" + +#: app/controllers/sync_plans_controller.rb:21 +#: app/controllers/sync_schedules_controller.rb:29 +#: app/controllers/sync_schedules_controller.rb:35 +msgid "Plan" +msgstr "" + +#: app/views/common/403.html.haml:4 +msgid "Please request the required privileges from an administrator." +msgstr "" + +#: app/views/environments/_new.html.haml:19 +msgid "Prior Environment" +msgstr "" + +#: app/views/environments/_edit.html.haml:24 +msgid "Prior Environments" +msgstr "" + +#: app/views/sync_management/_products.html.haml:6 +msgid "Product" +msgstr "" + +#: app/controllers/providers_controller.rb:71 +msgid "Product created." +msgstr "" + +#: app/controllers/providers_controller.rb:84 +msgid "Product removed." +msgstr "" + +#: app/helpers/promotions_helper.rb:35 app/views/products/index.haml:15 +#: app/views/promotions/_detail.html.haml:5 +#: app/views/sync_management/_products.html.haml:2 +#: app/views/changesets/_edit.html.haml:27 +#: app/views/changesets/_changeset.html.haml:25 +msgid "Products" +msgstr "" + +#: config/navigation.rb:31 +msgid "Products & Repositories" +msgstr "" + +#: app/views/sync_management/_products.html.haml:10 +msgid "Progress" +msgstr "" + +#: app/views/promotions/show.html.haml:46 +msgid "Promote to" +msgstr "" + +#: app/views/promotions/_packages.html.haml:8 +msgid "Promoted" +msgstr "" + +#: app/views/changesets/_edit.html.haml:19 +msgid "Promotion Date" +msgstr "" + +#: config/navigation.rb:41 +msgid "Promotions" +msgstr "" + +#: app/views/promotions/show.html.haml:36 +msgid "" +"Promotions allow you to promote content from one environment to the next " +"along a promotion path. Clicking \"Add\" next to one or more products will " +"add them to the change set. If products already exist in the next " +"environment, you may promote other types of content. Once you have created a " +"change set, click the \"Promote\" button to commit it to the next " +"environment." +msgstr "" + +#: app/controllers/providers_controller.rb:141 +msgid "Provider" +msgstr "" + +#: app/controllers/providers_controller.rb:139 config/navigation.rb:23 +msgid "Providers" +msgstr "" + +#: app/views/providers/index.html.haml:13 +msgid "" +"Providers provide many types of content such as packages, errata, kickstart " +"trees, and installation disc images. A provider may be delivering all of " +"your paid content or it could simply be a local yum repostory providing a " +"few yum repos." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:27 +msgid "Provides" +msgstr "" + +#: config/navigation.rb:87 +msgid "Proxies" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:23 +msgid "Quantity Available" +msgstr "" + +#: app/controllers/sync_management_controller.rb:23 +msgid "Queued." +msgstr "" + +#: app/views/systems/_edit.html.haml:58 config/navigation.rb:61 +msgid "Registered" +msgstr "" + +#: app/views/systems/_edit.html.haml:37 +msgid "Release" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:22 +#: app/views/providers/_edit_product.html.haml:32 +#: app/views/promotions/_packages.html.haml:11 +#: app/views/promotions/_products.html.haml:8 +#: app/views/promotions/_errata.html.haml:10 +msgid "Remove" +msgstr "" + +#: app/views/environments/_edit.html.haml:30 +msgid "Remove Environment" +msgstr "" + +#: app/views/organizations/_edit.html.haml:39 +msgid "Remove Organization" +msgstr "" + +#: app/views/providers/_edit.html.haml:33 +msgid "Remove Provider" +msgstr "" + +#: app/views/roles/_edit.html.haml:24 +msgid "Remove Role" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:28 +msgid "Remove Sync Plan" +msgstr "" + +#: app/views/users/_edit.html.haml:50 +msgid "Remove User" +msgstr "" + +#: app/controllers/providers_controller.rb:57 +msgid "Repo removed." +msgstr "" + +#: config/navigation.rb:12 +msgid "Reports" +msgstr "" + +#: app/views/providers/_edit.html.haml:30 +#: app/views/providers/_form.html.haml:24 +msgid "Repository Url" +msgstr "" + +#: app/controllers/providers_controller.rb:49 +msgid "Repository created." +msgstr "" + +#: app/views/packages/_dependencies.html.haml:19 +msgid "Requires" +msgstr "" + +#: app/controllers/roles_controller.rb:33 app/views/roles/_edit.html.haml:5 +msgid "Role" +msgstr "" + +#: app/controllers/roles_controller.rb:51 +msgid "Role created." +msgstr "" + +#: app/controllers/roles_controller.rb:65 +msgid "Role updated." +msgstr "" + +#: app/controllers/roles_controller.rb:31 app/views/users/_edit.html.haml:42 +#: config/navigation.rb:86 +msgid "Roles" +msgstr "" + +#: app/controllers/sync_management_controller.rb:26 +msgid "Running." +msgstr "" + +#: app/views/providers/_form.html.haml:29 +#: app/views/sync_plans/_form.html.haml:32 +#: app/views/organizations/_new.html.haml:16 +#: app/views/roles/_permission.html.haml:39 +#: app/views/common/_edit_i18n.html.haml:3 app/views/users/_edit.html.haml:35 +msgid "Save" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:57 +msgid "Save Product" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:101 +msgid "Save Repository" +msgstr "" + +#: app/views/users/_edit.html.haml:48 +msgid "Save Roles" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:9 +msgid "Save Subscriptions" +msgstr "" + +#: app/views/users/_new.html.haml:28 +msgid "Save User" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Saving..." +msgstr "" + +#: app/views/providers/schedule.html.haml:4 +msgid "Schedule" +msgstr "" + +#: app/views/roles/_permission.html.haml:20 +#: app/views/roles/_closed_permission.html.haml:8 +msgid "Scope" +msgstr "" + +#: app/views/notices/show.html.haml:8 app/views/common/_panel.html.haml:44 +msgid "Search" +msgstr "" + +#: app/views/sync_management/_products.html.haml:74 +msgid "Select All" +msgstr "" + +#: app/views/sync_management/_products.html.haml:71 +msgid "Select None" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:33 +msgid "Select Plans to apply to selected Products" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:27 +msgid "Select Products to schedule" +msgstr "" + +#: app/views/common/_panel.html.haml:11 +msgid "Select Result" +msgstr "" + +#: app/views/packages/_show.html.haml:42 +msgid "Signature" +msgstr "" + +#: app/views/packages/_show.html.haml:96 +msgid "Source Package" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:35 +msgid "Specify Local Manifest" +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:21 +#: app/views/sync_plans/_form.html.haml:20 +msgid "Start Date" +msgstr "" + +#: app/views/sync_management/_products.html.haml:7 +msgid "Start Time" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Strong" +msgstr "" + +#: app/controllers/providers_controller.rb:96 +msgid "Subscription uploaded successfully" +msgstr "" + +#: app/views/systems/_subscriptions.html.haml:4 config/navigation.rb:29 +#: config/navigation.rb:65 +msgid "Subscriptions" +msgstr "" + +#: app/views/products/index.haml:21 +msgid "Sync" +msgstr "" + +#: config/navigation.rb:35 +msgid "Sync Management" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:19 config/navigation.rb:37 +msgid "Sync Plans" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:57 +msgid "Sync Plans applied successfully." +msgstr "" + +#: config/navigation.rb:38 +msgid "Sync Schedule" +msgstr "" + +#: config/navigation.rb:36 +msgid "Sync Status" +msgstr "" + +#: app/controllers/sync_management_controller.rb:24 +#: app/views/sync_management/index.html.haml:3 +msgid "Sync complete." +msgstr "" + +#: app/views/products/index.haml:11 +msgid "Synced" +msgstr "" + +#: app/views/sync_management/_products.html.haml:75 +msgid "Synchronize Now" +msgstr "" + +#: app/views/systems/_edit.html.haml:3 app/views/systems/_packages.html.haml:1 +#: app/views/systems/_facts.html.haml:1 +#: app/views/systems/_subscriptions.html.haml:1 +msgid "System" +msgstr "" + +#: app/views/systems/_edit.html.haml:50 +msgid "System Events" +msgstr "" + +#: app/views/systems/_edit.html.haml:9 +msgid "System Info" +msgstr "" + +#: app/views/systems/_edit.html.haml:21 +msgid "System Properties" +msgstr "" + +#: app/controllers/systems_controller.rb:43 +msgid "System subscriptions updated." +msgstr "" + +#: app/controllers/systems_controller.rb:64 +msgid "System updated." +msgstr "" + +#: app/controllers/systems_controller.rb:26 config/navigation.rb:59 +msgid "Systems" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "The passwords do not match" +msgstr "" + +#: app/controllers/providers_controller.rb:99 +msgid "There was a format error with your Subscription Manifest" +msgstr "" + +#: app/views/dashboard/index.html.haml:6 +msgid "" +"This is to be the Dashboard area containing Monitors, Reporting, and " +"Workflow branches." +msgstr "" + +#: app/views/sync_plans/_edit.html.haml:25 +#: app/views/sync_plans/_form.html.haml:25 +msgid "Time" +msgstr "" + +#: app/views/providers/_edit.html.haml:24 +#: app/views/providers/_edit_repository.html.haml:17 +#: app/views/providers/_form.html.haml:18 +#: app/views/roles/_permission.html.haml:13 +#: app/views/roles/_closed_permission.html.haml:3 +#: app/views/errata/_show.html.haml:12 +msgid "Type" +msgstr "" + +#: app/views/providers/_products_repos.html.haml:44 +msgid "Types" +msgstr "" + +#: app/views/providers/_edit_repository.html.haml:12 +#: app/views/providers/_products_repos.html.haml:39 +#: app/views/providers/_products_repos.html.haml:96 +#: app/views/providers/_edit_product.html.haml:19 +msgid "URL" +msgstr "" + +#: app/views/systems/_edit.html.haml:17 +msgid "UUID" +msgstr "" + +#: app/views/products/index.haml:13 +msgid "Unsynced" +msgstr "" + +#: app/views/errata/_show.html.haml:25 +msgid "Updated" +msgstr "" + +#: config/navigation.rb:54 +msgid "Updates Bundle" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:38 +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Upload" +msgstr "" + +#: app/views/providers/_subscriptions.html.haml:32 +msgid "Upload Subscription Manifest" +msgstr "" + +#: app/views/common/_edit_i18n.html.haml:3 +msgid "Uploading" +msgstr "" + +#: app/controllers/users_controller.rb:35 +msgid "User" +msgstr "" + +#: app/views/notices/show.html.haml:11 +msgid "User Notifications" +msgstr "" + +#: app/views/notices/show.html.haml:15 +msgid "" +"User notifications lists all notifications generated by a user as well as " +"global notifications that are sent to all users." +msgstr "" + +#: app/controllers/users_controller.rb:72 +msgid "User updated successfully." +msgstr "" + +#: app/views/users/_edit.html.haml:7 app/views/users/_new.html.haml:7 +msgid "Username" +msgstr "" + +#: app/controllers/users_controller.rb:33 config/navigation.rb:85 +msgid "Users" +msgstr "" + +#: app/views/systems/_facts.html.haml:11 +msgid "Value" +msgstr "" + +#: app/views/roles/_permission.html.haml:30 +#: app/views/roles/_closed_permission.html.haml:15 +msgid "Verbs" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Very Weak" +msgstr "" + +#: app/views/users/index.html.haml:3 +msgid "Weak" +msgstr "" + +#: app/controllers/application_controller.rb:205 +msgid "Welcome Back!" +msgstr "" + +#: config/navigation.rb:16 +msgid "Workflow" +msgstr "" + +#: app/views/common/403.html.haml:3 +msgid "You are not authorised to perform this action." +msgstr "" + +#: app/controllers/application_controller.rb:162 +#: app/controllers/application_controller.rb:195 +msgid "You must be logged in to access that page." +msgstr "" + +#: app/controllers/application_controller.rb:176 +msgid "" +"You must have at least one organization in your database to access that " +"page. Might need to run 'rake db:seed'" +msgstr "" + +#: app/controllers/failed_authentication_controller.rb:18 +msgid "" +"You've entered an incorrect username or password combination, please try " +"again." +msgstr "" + +#: app/views/providers/_products_repos.html.haml:47 +msgid "Yum" +msgstr "" + +#: app/models/katello_name_format_validator.rb:20 +msgid "can't be blank" +msgstr "" + +#: app/models/katello_name_format_validator.rb:16 +msgid "cannot contain characters other than alpha numerals, space,'_', '-'." +msgstr "" + +#: app/models/username_validator.rb:16 +msgid "cannot contain characters other than alpha numerals,'_', '-'." +msgstr "" + +#: app/controllers/changesets_controller.rb:40 +msgid "changeset" +msgstr "" + +#: app/models/kp_environment.rb:27 +msgid "environment cannot be a prior to a different environment" +msgstr "" + +#: app/models/kp_environment.rb:69 +msgid "must be unique within one organization" +msgstr "" + +#: app/models/no_trailing_space_validator.rb:20 +msgid "must not contain leading or trailing white spaces." +msgstr "" + +#: app/controllers/organizations_controller.rb:37 +msgid "organization" +msgstr "" + +#: app/controllers/sync_plans_controller.rb:22 +#: app/controllers/sync_schedules_controller.rb:36 +msgid "plan" +msgstr "" + +#: app/controllers/sync_schedules_controller.rb:30 +msgid "product" +msgstr "" + +#: app/controllers/sync_management_controller.rb:150 +msgid "product was synced successfully" +msgstr "" + +#: app/controllers/sync_management_controller.rb:147 +msgid "product was synced successfully with errors. See log for details" +msgstr "" + +#: app/controllers/providers_controller.rb:142 +msgid "provider" +msgstr "" + +#: app/controllers/roles_controller.rb:34 +msgid "role" +msgstr "" + +#: app/controllers/sync_management_controller.rb:155 +msgid "sync did not complete successfully" +msgstr "" + +#: app/controllers/systems_controller.rb:29 +msgid "system" +msgstr "" + +#: app/controllers/users_controller.rb:36 +msgid "user" +msgstr "" diff --git a/public/404.html b/public/404.html new file mode 100644 index 00000000000..9a48320a5f1 --- /dev/null +++ b/public/404.html @@ -0,0 +1,26 @@ + + + + The page you were looking for doesn't exist (404) + + + + + +
+

The page you were looking for doesn't exist.

+

You may have mistyped the address or the page may have moved.

+
+ + diff --git a/public/422.html b/public/422.html new file mode 100644 index 00000000000..83660ab1878 --- /dev/null +++ b/public/422.html @@ -0,0 +1,26 @@ + + + + The change you wanted was rejected (422) + + + + + +
+

The change you wanted was rejected.

+

Maybe you tried to change something you didn't have access to.

+
+ + diff --git a/public/500.html b/public/500.html new file mode 100644 index 00000000000..b80307fc166 --- /dev/null +++ b/public/500.html @@ -0,0 +1,26 @@ + + + + We're sorry, but something went wrong (500) + + + + + +
+

We're sorry, but something went wrong.

+

We've been notified about this issue and we'll take a look at it shortly.

+
+ + diff --git a/public/fakedata.html b/public/fakedata.html new file mode 100644 index 00000000000..ecad1093f21 --- /dev/null +++ b/public/fakedata.html @@ -0,0 +1,16 @@ + + + + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..124a3f1cd0038b9ce906682183c04d836fd4502e GIT binary patch literal 90022 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 A!~g&Q literal 0 HcmV?d00001 diff --git a/public/fonts/LiberationSans-Bold-webfont.svg b/public/fonts/LiberationSans-Bold-webfont.svg new file mode 100755 index 00000000000..47a23148be1 --- /dev/null +++ b/public/fonts/LiberationSans-Bold-webfont.svg @@ -0,0 +1,154 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data 2007 Ascender Corporation All rights reserved +Designer : Steve Matteson +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/LiberationSans-Bold-webfont.ttf b/public/fonts/LiberationSans-Bold-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..24a4eff1b7b0e682e832baa0927d180d1c347e02 GIT binary patch literal 32428 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 literal 0 HcmV?d00001 diff --git a/public/fonts/LiberationSans-BoldItalic-webfont.eot b/public/fonts/LiberationSans-BoldItalic-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..659f54058787d2ed565665f2f2cad5f66feed08f GIT binary patch literal 36814 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data 2007 Ascender Corporation All rights reserved +Designer : Steve Matteson +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/LiberationSans-BoldItalic-webfont.ttf b/public/fonts/LiberationSans-BoldItalic-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..2adeefbd493d9534a4324cb2a7bd345c012aa3a2 GIT binary patch literal 36584 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data 2007 Ascender Corporation All rights reserved +Designer : Steve Matteson +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/LiberationSans-Italic-webfont.ttf b/public/fonts/LiberationSans-Italic-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..101d7f04b2c2d040761e4fb75e1611bdd6aad2a6 GIT binary patch literal 36172 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 literal 0 HcmV?d00001 diff --git a/public/fonts/LiberationSans-Italic-webfont.woff b/public/fonts/LiberationSans-Italic-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..d696805d18f122d2352d5e4683cbbe90a79fd8eb GIT binary patch literal 23036 zcmY&fb8sh3wEe|4Hnwfs_QuJ^wr$(CZEkGawzIMM^1b)h>#9>T_w>1ar)qkp`rher zl@}8O00DlQ#s>iLzhkt_|JnbY|NkZ?rXmXf09pO8*gwG0v~%kh7ZDZv;lh4w+#e7C zS^%K(%JfV>T-lHP=LdSv=pk5!*7|k;05IeaPxFKQCXi!LLl-9k004yLMkrnP5qDF7@>*2)KuT`#}|y@M+5u600BUlTDhD2a6ABjygC5ji-E=?>|iX@f57%~jRbD?L;i51KQ_@1NZ|Lui_NT^+j6{0E?FkU$%KYvUiz=|=50t6g&_sZap8@{sH_g^rx?dOVIN)yac#F7zb{9`0x zh`g_7yl-NtZ(y)*WT4U8+r;OWzt0YWiopfW&CI|=@nNFh^+6vnm$nsS?+6Ss@bSKa ziJ?xTf$cAaih%*tB8HgzzvJuanfU2pf{TG8wt*Zn2E5Y1Lijbo2Li_p4JeG%`ROwb zD1{`$USPB^tWerfhEYgRjZ#rimQkKk4^mets(AF?_@A*)e18k*KnpBI_ExL}{AQ+r zq>!K(%_}$gn0opC{vP>8_~d{2?)~oicKzIWGwlnkf+$Bwz$4)ab4Pq7xbdI=w0uTE z(*)I2*UF}_UX0)irQ0u!ihtZS%uv~#e(zqz}GfrN&N42uYtmXMO17#$y@ zrl6v%EUPHDG_x?jI6XhZ#=yeNOv^~uQrFbjSY2P^=HTM&X#3ml>E_}7{_^$;0SXQl z8Wa*NE+Qs6GB`X$PJ+BQeu%2K%4Af;YT7TNR8Ltc53G!q%-Z~WNzViYMA#CWZ~O6E0z?CH0j+>)KoOuF zFa$^iR06^QwSW>p6TlA;3~+Q?*HP?{(-K77fV$@C#FS{L<$n175G6I<^ire$OHIQr||6WeFPawLZ(;69@@E-bbnmxunZ z-Is|!aF6eMf(Ifn#Uvv~)0B`msMm|x#{7o0P{Z|8@J~ILHXL{e>VnGVoSxFWDn24P|lg^R~EpxYvUG60f z*J_cJ<1P?<-S3=$(1Sv#;0M}pCTZcIz*Q={)#*8wP*PmbI}S{pUISX}|zb0Py!W0K{#5 zunW!$dnuishZ)OTGex{G-pHLLWyH|ED(WblCndR_X2Jz^$R1~eW7s*G(fm9F5laYi zEvba%0-Oy_Bc((^N_pIYlHVqE;wZ*wVZLc2qan%IQ$v?7)ydQIy|2NF{=K2gbA#p@ z%izd+8gncK_jIGn)3@hWqIjX>@xdhL%*eO4FEwXAqm~|nyePdW;BpbGVDcWK~K=e%mSj4h( z8>hSlI-HG9{`Xp-tx1n}@hKckc6N4%C@oVol8O!UM0SlP1^qe=opJt-i7S<;cr><@M4=>Y81`Fv z{(zkm2AmAxp*kCmOy8BdZY8V}#uYqqFY1TFnF%!O%^YBB1+dks*S8o_hGc-AMF@cd zng*tp2M+%+DO9}!N6wJu!FYrydIEaOY4@AA8~SQY?Fyx4Q(WMLhDCKcD$haMm)E#{ z4OdPrx+CS*;Y*;7Z?QKtcvxa2^usi!jK2J}s0eZ^=F8k?jOa}?@=*9&sX#ty2ct{o zt;8ms$QJx=eWQ>>$HVeGWo$l`%qE>f77vG(SA_3D@@|xTEK~|&wnskY>b=N4XacI= z;b=a&@PYG!TO_6}WmVpWC<JZMG+R z9k-D$uTqUmlc@IMe!7*0d_T~K0fNU4FRA>UBfko;RL|*B^=OvH*~D#xY}iMTGQ4D& zf&?KCem;ACuK1UfiRz+v*QtNC4>W7nE@qNJ!0n0>u!8h@l-N;wzy5I`CfPsdo$9NGFzUlIOm z;ZnMjmZSvxO`_HwIu-NnwROy!pmWS?{Ct2X7Zz6jGP-?s7*}zNM4E%0vE7l{)2wf0 z*&+;ee^m?a{E3p-{_pHdL?x-9^a-B_Prt;1h#r?iz^5r@uRUmynXj7^Gt#bGEo6R8 zH5kStJ#4e6HO^IpxjG!&-}v&dRv0Lsb(y)%kuB9$?Njis#uLY@jJ2Yi_x4sUner%I zf`SmCg#76!^ce=}T%Pir(Zph%h{`L-Fd!<`E660RM9*{MXhsp1IIP|+7diQyI43R= zAnSNFPPzfJ>>18hki9C0Lv}^zEpiJmixjHDW$F7@LS`3eL1m?smxu6+CL$A|&2n$x zgN-q^M|Rh?$R7RPXjAN_sR1z(rPuZ!S>SNG5P}_PXeDe6C2U`-)|724Q}9fGE9O0u z@o}Tw8X5K+%io`VA{Fc)z46w@E9k4WK_D0}1CD##Y`uH}kQD7%O$C9=LLK3CbdbK70>*w;~! ziUBjALt%I*N8pqc3{|88TH1Xv>heU@)^o@esO2XT85KtxyJYDit#~U$c8SadNj5eq zL`npM4(UxqB4CsR3_cSKE5F7zIXSUn8S#dR#XXf4a&*Oc>@AE`eshF8*e4{M>)30Z z>~Nb)&d7G?D7s6#ysfsZ!51$RkCyN8uGI33KRP@8_!socO3)LFf-5Qa!RB&z;o9t* zs?$|iNuE4Amo?i+${E{mFz|7o-HGh(hkuUxXhPnOb3fEpnTB12@e@qP^Akp(^tMLg zw<6>AHV}t}wrcLsz4^KRy6&rLpXJ?i1O)mZF`q__X*27^_+7^sMw{W7LgxnBcD_cN zLQ~FWK4)tG8t=+Wf191g$km|2v8TtLlK!RpvZvLWHWZ3+a9k`j8L@a6jL-YIfZq5* zHr!@kj##V1wpa`^miv7frjexwYh509OM`tzT8Q?b?OJg_S`c@B?|{!T3-tg>4Z(PY0D^vTRu4B2#+Q{qXIIWloBS{8&L zyc}I-({wHtDfh6lk*RfL+WxNQV#KTOM4l_QhpFc9Gz<%8u6S6 z4;eIpb))iYzPCMV1+3ZY*k)V?G!)51ljuhCKt_RtQW+&h8`gP|^=0$liU&(v=A6?T z+Va~~DFQ;{_9&d{B_&(FG%d>ZUlC^;e>e!U-7ppn9-7j0-=p0v3dRaw_ zBlni^d#hhCE^ay5ltNAk&&uVi#P8YlyM1Ipts(X zm7kuK@w{JS=Uc2sF>A`qrUkigPPsay{I6G zI1tDfHl2m^V#(&YKyV=~+NV*WD~Pq0o74(XxY+z233$6Ch+nP>Ain^L2+bhudOb}$#fxAjt zw5%P$t*-qEcE8Ovb6qKQ5Z(|IyUMl1GnWf;qaTrWpmD#sJx%PBt>4~^ssCIU5cZ$~ z{w7_lPTv~AE`3t4IF{9ezbL z2zNcy4+*J`tpxeW0KXC_M8U#=WJ4&9XtUQ9{7?9%yaB8l21ad&Rwp^#VTHn|LNiK9 z$C5x;m)y54@qDx*r*ik#Bh)YaP1Ni8P_e|nsD>O&7#0y0;a@26UD~m6QKE*AgaD|3 zUfYQC5pwb(gBcyy@7M0lu#|mwrg(+>bo2AYnEWt?xb&^(^n;F40VL_eHY|`6BJen} zRh-CDrL!0ji5oY(63W&Id<#V6`s&-xUgjK`QmHe}J=%Yrb8g zIPGFGZV&(8Hn>P~uzg87G>fhY)j|_lJ~-1*{WFHF61U|=E?5}lGUHtmh(-Z!8UjQY zk-aFe)JF8~zevr9U=8Sf>sUDb%mYGdBR)zL`zEP03G`HNn*pS^^R3_7FE%>{f6O6X z*D0CaM^bEc@m>?>9gUvk%S>grBS37ofUY;>afl*3f?GicwPbs>>htJ&--i)x;q>O@ z0Mc+N157o(>;8YF{8Hh5(n;CNh7rWnFd_AzVY;ATGW*{nr~$nJdLl2N@WE9l?R?16 zh7jTI(s$u5b9aP98v0c)2Y7$VB&Ep2#9K_b_o3)W!rqaYU#-T~8zkbBm0O{sFyKj# z4ku?Nq)>>JSW{~{ zGp%Yy$l9=to$=amIFf3wNTVS{zJ0naVdB>Cp_{22tc)Gk!<{*j6!m4-P<+Xln0V90 z$_rjL22VGK%O5_1aXo>U-h$v6b)WD z4$ipug9M*=gLY;H=HSOG*Qg=V3$p+YS%fo%RFnXB0xvNj;g?GE-$*co2ji}>#PCM` zFB#6F3&syUeD8@6>#;h2r!|3^2!WMLn0mc@Yac6l^f|@6brN8rO5zn7KO>ipYv;ZO z)Gv8v5aM)|+KNG;Uj-Y?p(a;usb5R4j-@~_R>#u^uDWh_-QR9kf(=kZKncCn z@BV5YVX=s<$gU`&aQbc4Y0MEgcY^Ty2SaO?Ebwk7%TkvDJdU9EGV4!I0o<}2N&TpH z@)?w{AS-_UtWU&n_#tXNaL^&8otLdRSzX4JES`uM;S}0|+DlI?{wiNpu6_Ep@rZ%A zMsTjdiGFAazvU`bqf7nVKQ0X8F0_?s+R^NSMO$&A4g;c9hRmwKQ+bS(A}Zc)ztZJo zk(tjf$YZauF=a{nG+;pu!#@w|gJ_^&i6cs%antyjICG?K`&}{Uh)VvpoWxe%dg#Ux zdECuenV`G``f8p`Z`L{f#g3}pU`@+jX*Fv=B}cfNLZA#cqQ%`}eY(BHeGQ_z$&W+E zo*i*qlM!dq5bp@q%Pb=8I2j(6_d7LYQD=P1)=q4aOP!B=~m6SkR~WUKoTEsmC7cK|A~-ve^!CxWm0l8*uzUH07Rc z5u_UI3o2F#CuR-K=P5)cgL#Wy)ePC{Rtm65yUc^RT3 z?9mYGG7qmgeJJ+4$-w-4dO7)Rv`SXax}C0+XhB29WHUeVR4(Pgk!`L9LdZakV!?y8 zmBZWceeanlsg#s(ws~{9_vtu5oQcXrWVA4}QE==17`}T?J`;0go;dc;{d_AcAxr`< zL|?z^;2>R&Hy;k1ldtORRcH3(AP><;^umqreDZI5!|VPBxc2< zqbVTTIuAcB0FCcvFuj?{-Xsu&BA=SnMa94!eC^N0lB3y;EzeV+I`4<)5!ytbnyw(5 z5cu~Ua#JcH$G&~RXuQpMRo3MVV+cqUm8F)L0=}S0W^(W{ zK&6h`%S;L+qBEHY9t~|TszMJdD`ZI<>;}XtgqVKf_kaohU6ajSABRlS{GB)DCIs+SFTS&9nw40d|f42=&S0Z@8d6H zc0VIni*kWLY(0&?Hyh z{QBu7^Yn?a+4SD^PFK_=**WB;r<@bqX{K0Ix*SjL@p@b;gD56#z4HA%?rqU}?ul6* zyFd|cyFmM{Jqx*NShn3LeS}($dum(BYG794O7LZOsAgsFT|1P?P6?6^atk+dwmIL> z?rEJzUgl56Zn@%pczFFD8a&?|-U=?OTmzfEgg>*1O!bTv`>x#OwGc%pD@$t%TPh`tXn1l6b|dHdUv} z{9@zTIS5OvEBIqY52ti(|HbrbaSoC#FPzdz`{k`I^^0kFU zBQ;kwS0$>AN)tx`_TD%GGgX+1nhdLT#8a^q2+sSc-f=jdA#2i~x zCXc<|dPCP-?>*_0oXE;41KXLLdhcD|&;UGk(KVrseN9&jqmQD^?%62sg0dU;&W!$VwgelFIm+@Ga4C!fnnc!0}5UJ%>zMi8<$we0qZZ5iU3bAKX&A)cbSbV+)(wc8*}?O z$X*k_aiFn z)0fbc@X2tB&=++-PR#6Cf|(GKEDF10%n{92q^U^I_n-X+yXlc<@BFJ+irxHIu@Iz} z?2Wf(os0gY79ltoi~VAQgMY|>KNS7DCUH3(G<;EFj7U>rF5m`xR8Xxl0tJM}2$$0o z^BrpKBQQSs)tAT-m05JdY<;gGjzp4^7=F16bIK_JA@#Tn^cAHh`rv?V>9}Pcy@UNI z{B30Nb(}^}9TQ`QtRPzgsdR#v3btG?G?@=Szm7)rSE zPjZ$~(amgxzcDeGFbqCX<1AfCp5sB7W)7i5J#UVtuu8BCk`;I0O{}YEJ$1h@pi8gRhN)kR7>UL&_=cM#b}Bp^*3N9@n28 z*Nw$KTCUgP%iXaq3!H;MVzur1?hwO*4D)!HOsaUl5C<95k2Vu#GUy0L6f;%)K2olg zB;#gzgj%yuMmh-L-I<>4Jx!{BfoY#da=mxN+D*95eR3m%l1WN`=+e>C z>J1fQ2P8+)ON*K~Mm11BT%$=eGY>+7+6F%yz{Y;m>Cqm&C;P>S7aAOad!4jdXOGv{ zOZ{58Hxl7OqoskvQ%O5<@wZ&ajQ87%cnR0O;_KkUq3rhr7yX1Gv90gx;$Gm2ZxcU$ zJ?#_8IEpLdufUc3i-FYKw1%L8)Sa~EtO)fJe7eUR z`d55i>p$@8CnWGmyo9AK%RHfI>@)ruCrXN6y`d~KHf%FrwU&4+(+-pluSeLl0dB9? z2*MMpbi56Bz!obwqy5+fFrQ|0AR{PRc{?~|`aWjrp%vT~XoiidrvMDR>p?|P#2CBZ zD)sZ@90VCIH@<8TefSbI{st0xWd@#Jjs~<9WiAAvoUpTl*R*cu%V1*w4+RRYWkG)u z!m{0+U3gQ;S&S68c3Q`-vw_fVmoJD?QxkrEJoP)sz4X`EZQuPE@nj5o66HjcktZ8@ zoy5h02GtDo^0D^Q!`;)DNw`+;&zJbIIrXS;w*}$-+V^h=>)rgQ%ejBX7; zDbwOlyB{y=L~mvN4UEMy=~EK!oBfN}yvw7YHuaW2^cp}ijxw3heZ6HvX!9<2hM&vZ zE|k?YUCSdX+v%F{*Y&9E48b2?F5Nxf+60^NAi0z^K71qw;RR!H-HRlx);__#<{@?z z8R;;2LTx)gzIqSodpVJ82b~v^W6?ZVQxBe(TfjyvgvY1;%(5&{;;>;B3E}E2$%9V74 z`~;7WL0nF1L>@G-dhP%ukx5&b1;E-b>{st@c;qmxsG^_hbN3YKZq)f9&?B?GCeawj27C zjUzxsh_&ALdmIQ>lV%dwy1oFhbm%YNpt-C5WW9$<`hB3Fe0)Y?k_0#M*>yIbbhfW+ zaQ?n+lEDr?i+x`yC@IC1LKznKszWKUxu=h~=B2qmE zquq)zqe&l$BkyZpMSj?yPZ~e7oqytqgoj#mDfOfmq)(M|37O?6U&6r$?(qu!5yUTa zL;*7iR!0J;LPb{PRePX#s!cQG{6#6h1Rjy3*@^IRm%jDD0e;+DI+%jWR_E{R^TEy+ zPAUX9tZyh1Xk@Sn2f&f7q0+U|KUK3%fg&_@crl_JPMNy|UM4$C_tf*O6=A2HM*AfpY$l2s#@gPl?-!eXh2DD1X>j+qeK|yKq5(RWGF6hR{(7_- zk{O!ZzximnE=byHszT?13T(Emy23Hlf%0E_S7ik{>}+RZnYux2H6T6Uwb=Swh=BbN z8aC7DTE0Pcu?@DNrRf@*bqm)Zu;Q+R0hC4(mWNX==2FZW>z~5bjy3K;}pfwBDCve1A;@vXEJol_0& zUw$E;+U&m+RUeO&Mm7xT@#8#PRrV=>Kxfr_!3J7wbh(wMK*DO+#NE6nIc+SS1XWI! zZPLl20)wObU;_mSkGD)iDDExXlDu;2v+CJ1!7aP->n*6-qbJ<{vBy$bySiQAIjlE8 zc_m#27nW{7-yfFlkDLC^PVAnAyf~ry3B!2`514e<*s6C=H;axw8<~2j7ru;!45ti8 z7`neI9CK(F7Pvd>AUmxy%`d%9%duHAP~I|zHqF2KGNXJ<(nPE2*n?m*IyQ`b^F1%UWI2LUu0l#3K&62QbOr>oQxv3~x zQ!yp=yZY`mT7eUMSi*EDUlY!EL|91TZm>QrAY{cIxH|#LR2b`-}83;JPCaY-n5ey!$57}dno57H$_eU z7@eL|JKMQoD21+6=lVuL)V@)o~v|j4RU6OU=U)O10A7x z;ef&ziKP%iAsAOm{w90PpV6_L?Hd1+C=yw_U$A#2Y=b2_&;fUxQIwW2v&G~pZ+^aO zez)l8X$qpJRm#S~nvl|bz zFJ_R@D^Os^n+GW?I*nnD(~H9diNiFy>#laA1;gHVLJ;8-2;aG^bt%DqVWQ~*>1Lb= zj#go#eXY~vfP02(Y+4;F^CefKF?FY%I;Zh^L7=?(dr~DkTW9GaV;}y0;uNr3j5gxf092{#LLAHEjO6j zijAp=G*AwPA%h&b8m)!TVdHm|%eU-EZTh8DL!dqD;7XfBM$1?HfIbWu_knQW0{m}G z{I5*m(4IF!*f#5%-F$9TQSxyfH!QbV>7ej$1+j=`Jo;6uM1+CfP}s=VIRE?#kY4gK zu^WRvAj1VWR_YK&Y7c*ifiyJw&YRa(234kWt|-ka92gsPmOr%0H+2&szmjs;qZV-s z(18(&*RF{qT&qiCZX5Ow$3G67>l5@M zUBIDwOKrS}yS3cmHijnyl(xAmVe2s-jD1!KqgFiG}&8* z5@as!f~dV44jyZw0Z~RS`FVD&E2l4YDlyOk? z%Fre_{}1Ha5OU3~UyM|cd5AcDeG?pW6J~s%czfS>L1560STo;sDGmg7qu|zru66$7 zT^?(0NPf8-xJerFt=w3SBQI?huV8n^bB?(7ZZ`Cfm<6kmIoKOXVw&*0KK@2WY<3zF z#DxV(YK!;MC=<_BL|mESr=#FJNLw3qUil{zzPUq7=4Ds9R2`Y<5`V&$WV$ z!*URTz#wVMdgsGU=*kEs&SARhQr*ws-4S4bUT8>ugYyvfLNkiJk$jG{^T;EVr*UyB&=?{<2PsGJnYBOQp)~DMe|S_3J;_VZD$i0%}Al2 zbs+Yx(-Kp+057C?<$ONygzZ_mz2`ZHulmat9n2biVIF@skXCo#Ci;d-yY%1Z=Z+bV zP8|Xd#=)UZs|p3!u6W|2*WNI&51{E8phs6z%EUfeoodPU)TB9xaeLqtU;CsIT6C!s zUc%PuWig+B8{8CrP%N??1yJ2NUi-z#w|`)PAoH!DNC#6)e4+LkYNJdAaC79u->`PM zCh{kqxk<#6?jfTr6Ad+;A;@i~oHXPD9G&LLI9TK%A8PIg!-dOFkKCDaU&sj>5enRX zNv0qL3}^%zK^SYJQ&z%xzS!VERMh9wP&SSCOHol|0Pj!%F+6(KUW+o>?G5ej@M%r= ziY!Q>PWy;0NXePBJE%@s)IgY-LEP;~jzd|g>B!cq9`r^O{{0)GQMckpf@Wa_&&+OQ z*lgL1WpgFOPL4h*MR2T@Ofntq$RmduEeM23PO1EylH-BoRr>w4KHftf+o|s1e1!bS z_BcB(PvLHCB3fXghDUueqK~~xfJYYLf_&1Ww*fL9I_!O-0yi-vx-MoFvh9%G^(cII z{dH0SEW}Ah0s8kt=P>{=A2)lG)mN^r)FWUq%DFLD$T~dMZwe67{?}v4EFsb`MRnu9LX)yW~jy zkk8|8uko7ymf?74p5!s)(YWqlrS~36NTVsE@s%WFt@QSmOZw}N@B7Nd!I|oERB0o} zU@*$n1YBKjA*oX1#G&Gy^y9aJ$CcV+vE=*h>rvzVs!Mjq9sKLTI2IgCcw=|NQRw%PHfdz|!`^JhP^%SXT*~i)Ha=Zq5<4AX2uTB^dKmhP-?yP52Jrtu6-gGznpeeSIMAFrA9 z<5&=}`hAmXbavBebs~gCuUSS>JRfR@b0gCHR9!;6VxI=0MOW&a*5?IX zYE~)FHBkc?kU{#2bK?v#s^j>{!AxfVB2Rze7ti$ce4imX(xO<$eH(bAOj{DeRz|eY z-sHhpxh>L|T&3gg!H-AWeI4+$L9Se_u(nXU=_BNX`5>J-DfB(!`0e(C|c zoMhGt^T#E|_~_^YZyhjq7c!>$Snve{+`jz&K=mns|ugLx#!%+hQJt zkQ6UrOhSa{H57HZTeC6XK{tyng!diZ6x|`PF=&j{bX6dSOFwp&j*1q29t?z%x5f@4 z_aT})#`-B9th!8#zMIFYqMSU%EU*cNlN^*k#OSoP4sm=t(us$m5TC2KP>ME@&6YV-Rxd(DDk4=feyHJJLtuNGOrtit`WSk#6xu6Pz6S zWHtv^_3$X#Gxzq5q-A2WT0l$74lE9j6l=A4r(O;`&>QO22~sJKM~|sZKfk?`%M3W8 zYd&e?*vr+vUkAi2Ge*qNK}eExTSDa1wP5n1^4#(e_hYiP{T3#ny zL%O)*hsM0NhjLZnq%(3+J?=Ay<}*tWXqP0IIH$y7X-m?8*wV!Ea_Lp=al;x_xG@CbPff(tF z<#LQMfM^}0qPBpAkx8(Fog7$V-I0&@`Js5qQIrpX3NS>`E2Rf62xjqMDH^+g))M1X zortG#sHsb0RciyofW=z`Qe{)ECx>>vP%l0aPhBzn#6dD%t#yH8P5P)q64n7_`XBTNk?)-O`v>M|+Y4}JNZ@A^C#I*`|bz4raE`=Rd_i33jL+nzv z)bTYT`>oz~t?^j=9`b1GM|5)5<7PSMuQzK6n==G8_-OyoT6GKyaF~}4uyw!CQEO<>j9uX7 z2U)<(A0AvcdIcb1iXl_T>ASkJOwfdxdNbskyvJUVu22f6;yy)jmJIL@m$Vlr~-Q@u1 zumR?4WpiHx+n$SQ%IkB3fwN!S^McVVSzN>uFUF*IfOBmC8&=!;wme5DT8epIL$rR8 z{#~JOCyY2qUO-xP(V(WdGLn?t@iddo;WQ<|HFi&-u;2NCjm;X@!Ch@;K!d734H>OO z#mU6gYC98_vp-O)sEm4KC`ws#IyPOD5j8vtf&cw5mYzNx)LV)?AdFuh4liFxd~P5r zXg7#c>L^?k3UwFlP{dCi`rEe;Oz(c^1IUx#tJ1*}8veQJJ ztXn&WH?G-$HhO@PqO#mfup%~PQYRyC1ICCt!m(L@@_^MfXg%%4aGG>U!1T2^(2zqik%Wm{Q@85#@DOVp+jIx*Hg-1Ag*lvyhGkk8Hj*gIN8jre*fvO z$zk&(?sCuHV-sSnW!L@q&)@i<#bO6$$lF5j`;kpZ-dc;vB0c!;It#Rs;khtsjgFah z{2suf!_FOf0kwpS&lI~cZfzOn&pYE*ggLyT(-Pci7SU!ARR-{k#)Nq%kUSQ-{f)>< zq#a?!Mg{gK0ahMhZJld*Wj;gZEd8sx-I{&V#d8HBn73_dVZN*9U{Fe+P~RDDvM<)} z?f^MZ{S{34qEvPkl~{^kII?>sWq>8l@^zq6Rju&=?K3f&}g&g6&ij~_x}|1F%~OZP!8e%NAWOZ2__%bIOuY>0b{jg${gKb`NLa&zZkf;%u=ALwc*)R*ykIlRxD8<5;moTI(DGjK*c0rfZzGi zegEmNqDwBd9PJ-=>=&qKbc8l2F}@l;tnA=Vk|Ik*!K|BYINrFRb&I_>wT1K7PLK6_ zSr^`*!pTh#*;Rn8-`7TzPV5a;RM8B*`+lx1X=u=QzYG&98*=AEXwQPgj51A61&rU3 z_J|uSGcU~vOnw%1Gz^UYC7~T09O@ym{aPEZ9oyok(0Ln#M&NhriFKeEYe$z}A9X>UPOXR`%`bwFNBt$;Q`h~GBc}4U$_D&om*UoSne1YN zFI2BZey%4-EjD{XW__z!B^*Vw8;Gqk;BG%>SYvPRjD^SihZtVF*;QC8Bu`#EU%r*N zW}F^Vc(OkxUy(tN8;Q2x9?fP43O8e?-f{7A_Twr4&c0okS5AT4pP(#J_qw1-vg242 z^m@N)4yxivQvhv7eN{lAKX2xYc2+mbqw{ZLj)~l@VX$(s^|&YJqyL!3Zyvvz+f9sZ z2T(%??J(jyY?XNw_@DZ##GB--xGJ>gpi&@WBuVnu!Nxr-y|nfC2*j07ufAgr&9-?V zPLs16bltQY$>3LCe>NLTFz|ze6Ef^L87YoItQOgRK5Al9$gYb`Ciywi`6f|yxDsf2 zt?p;qJSKv80YcW^TOA%Zl07#OJR=Sc7DBKIL{n@vPm5}bnnB(!^4j7fb!_dp3gU1_ zs5-@n>4pKem?xtm+pn|A5l-D0;RhRx6O5=v;DgN&n&3{O!L(pmMldl9v*zMBcFI+y zG)FRgh9>*kc)vZFUOT$|y^occ<4~+v1Pn^f0+v7^%)h>FgK{16bU987^)Iju1PwGy z_)N%SVaOuHj64pSN~CC7$hw%ZgwjOUqgR3{K|=N5TtJ_jLYE{VVFsXklWv@gfp2bk zQ4~{KP6c_51+e3OA`6{v?6|z=qLrQD{Q@{|!{Vp-os)XP4<&(bI_YwE>)>3Rhjb+m zU-7r;?STh{S`S52dl4kfdz+JoU)~*JwqraKOw~%B1E#8R$qv;=;3hHqjB9E8moS8NO!h-LKq@SJLS_s=18L>zGtRl zt&}8YnboSxRHv;oIulqJrGt@0-d{63>Sy$;jIczT)0be%yfb8rHbJu2&O4)LHH9;? zMcScLos0TyN)V^T^uAdcOCksMqZSQWJih_FpQpIa)3zs~QMB<5v_ivtJ9_!|YCR;6S=dwS=+~Qp3E1h z8nmX5PxFFEo^GbW9{e47hwTghXAd5_vlh^ECTt*dRA!yBXy-sg(Zo0L?VpDz7wAlo zc#jH(2ao+$IwYwO#19-G4l0Kril2vLrC!|wam5b3vA0pbPKO5@2qdU-OrU}K8c)A>=Dfq++CLu;Vlk7()Tv89Wc+ArXY6l7x$JKZo zj3*KEv42RsU3B4iD*Mqq2ZVFHG=B=>K{DnX13{?ig?;D#OL*jB5%ERS+;Qy77Z&q4 zV&ZAEvdxze=~a>EJIyYT^p-9ruRcPvXTC>+#&`@tQ=vhYjfq=-cC8EXI6#1>1^4;m zIFZd(Ob1D2#i7IAf&{ip328pES9voPv}=W|XgQIMDAvL^uI`ghHL=(?{!ai<8L#HK zw@{Ycu%A^`M%ubvms95A3#pOj z5jCSkMP7=gv%4oJCbL8PB*F7oFq8d+9!m;h0A#>38b6e8&&i4yA*IMbdS>G2)JR@S zMxM2PaZ#32Y!)$LN|e92%1(2dH6zpKJ&w zJW`MqB9fLEo)}1X!~z`S5k)0o;`5m+?@%YL3eikVnJ5CU(6gETTzPKWaCa7MR=k0_ z18uV?VeNx}goo+u#NIvHAEIE7AWa{LzzFbQe!K+&Z+)8T%91z^r`b`g4eR^z{6(eT zW^6T|`Aoyfn?9w!82U>LU=5&bhjjI3oKf)On#{#R8$qYFyluX% zX&L#h$YZrTZD<2Jr>z=v(sm~XohUEQSrx6XLE(uMuwaw7xT!Ih0sNBH$JlluOb*zBz_d!1gNR=oCP(S;%B0=HIakSM^Wsjw$H~)F>s?v1h_1RP{ zAR+)xf!gH@sV9CphpYWi%|e~qftJj;(V`mo%GE7jSejlQt1O+NDK}m;&! zvVpC(TF+IeXtkE}2d+9{U3!Zzfc7E4x!rwa)`D^kj$D|dtTq&EqG`t3BnsrozgRi{ zI<2n^dSb42w<`{K!y!2b`cu@>`!AZjz8`$*B#glpFerFdtRwD)L@z7}ms5BkIA+1m1<}+Sq8EC0zV!eu4>1c3 zA+)`7Bc>vvXj#%`ydWuoskuZ+t6Hd(tXi%F53L#}21TKZP>;T7<>gCg`}Blvbn8WE zL)FOvy$BDlDrnRV5yqGE)G@3-)X*rls-4O1KoCu9e{gahk52V*_+;qkD83-|;a61S zViHZOZ_!Oo-~#^D|4|+UUZNzB$n4{!JTw2!{J$KQCZ+ugtrp;vFz=}$CzlkP2%>Ly zcx>dTvGVS#QK)h-H8#d2mVWrxz(FF#yBxBM5$arFYFod|Qg5yBwlQ{co5#!5u@N`* zi}zooF4*KcR`v%s^IS*3(;gUF8Af?7PlKGNfyZiyzu%B^M{Ufxt7uXy`fU&3w@S9% zw_m@`%(hGY?WZ?n+p%W09lLx%ef{-M|E_Gis_GBQwlklxmThMy)fItOjk8_6@6kg_I>I;l;qOmaQ9{kP`MkFIhsw1&Y*@#;~E9NIgS-!A;*n@4OmH=24T8*E;8OeV*FxblTeM<$;9 z_$U9%Kdj3vwEljXg$i#8uRI}GQVo~ipq}8*SfXdoT>j}< zQ?GNSNz0)1WnvH7$1sg%3wum#U59cD8FS{EB+_-YN;xGD?-{x6;$o-yGXP^~j}5uJ zX=LXZAPuP*kcN!Xu!sWD0|heL)s^%XnkD#T*g_3&?jBchE|71YChco(Ma2#Go2fh& z8^S0y4$WlSf&qN0iF-37nz=?G#fKe5E;Ja9Nl`B7&hxv*&U`-9A8!@;5aagbYyu}r zax9jYW41o*sZ&yPXQF;@vMU}DJsxBabqA?#CSN;A0}P48;u-Sh`-Vs6>)Z{Yn3yen zHJXZvVj$?C*n~DBL`u)u{50owcpWw`otC2W9NUcMzImFn1zog{CL87GL{v8Si!ABn z2^{-I`@7St%hFLAUIMz<{HScY?bW=mKT*={5B$p~QT|_PlDZeJ9Va)H^FPgzC~l(7 zi7+%qxoyOz+Dhsb&Ms)YxESKYVoOV~bFs%9tRBYbN8=R$?HN$wu6Dx&LW}$C11LeCAEy8W8 zxu0&YyGI%Dh$Dzh2>-8w`qd!=a7j}-_Q<|LjxVvRBOU@~s z(H*{^onkw+QNEGvr{S?4hu2nSB|jGt)kK2!xj7p1Qt1u3Wg;rkCuuk4&A!q@=Y~g2 z89qV9=))G7P>F95p!v)5{R;tWn?qS_E(g9htA#{)b=LjQTTN%Ul`&eD3Qler?7>2f zlf~QmB3g^72U7;oBGgum-s(CA6vuNqYtS56Yt_!bh|(E(R$+-9qB`8?2WHCoe8`n;X&fZrruf+~&Ql zY1xpLtmdYbXp1c;-sioIS!iiPi-+YloaM7%bxCce_OaTWE~!Ost779qcM``Nh{9&V z4E@->g=9DIbi{#va*JQx*F6hey*j~j_0Gs>*P6Ax+&jx-B)P-;deR~OJN&aLwna>( zMu!g!>w`)v6mdV!ZPAC0W;3B4@;qO8U>~{c`?+R3a%0@kk)1>bDpZfxxor|;;l^gC#c7DN9*J*Bl?7|qm;+n6oF-Xi4KO%~a2)AvQpEVyJs8l6`@S6rca}@lU?N%vmPqgRi1F( zkU@;rj<2nzy-F2TfLt~d)YMbs)8jL956z#Q*|$Y+2x{8#sp;{#Z_kZS4-XA))`FoM z5{ajd9{Jo|w;g>dk=Xat(cA7ib?ecm_Wd@*$F;LJj-)b@QXk@OW9nG6DR_Hse?%0# zbI<9F! zo`gmyx$MOB`1Nyl-F5^X3Jo}N+g=g7oHQaBZ%i@VIKA*PyDXH9v3>C(^4 z)o!DVv3tp5>|%_OCBhg1wj9}AX3LLU0|;(&rUoOpJ-fZ^0^&(z>1Mpf(EkyxB)wue z1Hva+q!9M@P|#f=|4j@>PLkTa4{6D3fBwZ6|J^sol$aWyc=F%INh?3IWKZ65pf}?y zJw}d|4AM|yBe|9+(#=oP26ei!j)z#cj)%l6=$z&{o&rtcAN0d4Kq4BOSuu&;Z@#{I9KOU7cZsptDJ{?%62ueGus&;OKLxv__|jRj|t zF}ZfC<$3VV%`STt|58@;dBMhbyr{9b4>QlN_M!PL)~!mYspvP>$aBX8y6BIp& zCl4YXlGKBiQi^&|q=;t^o`jw}3RTlO@9oAa7IDLTOy2CU17S07-n{ufXL!g+r&}ZR z$?(NgGTYvoN**z;T287@i$q$}DJO@#sH=oX&ryr3i3G`<=PNVWwml)Ps_3_@Kb5(Z zzm&PW#6k$8Rv6eo!A(+8HaWnnGT4G{jMbx+*S)fud6f~~X4U~VG9U5cPt$h4uuVQc zmC0378;3C!8vgqs?!OaZTtlu!&y%e1nW$MoTd)1B*|qgpE3t76I7cQy=B-k;s)r$) zmzUF^$V>Te9}L0FK?=M&GRmFrL$NSW20o*2Cx0@ zp+xqAfB4agi;T&Vz^~gQmrHkVzdt)VabDMzr_nJkk$bs%!uuXQ9#Jc>*|Zc)(&C|d}G6b**8mS{ZDo5>pHkaIxg>zFQmV9>JvLDIzn5>-SRp!H4RfkHJY)FQXZvrJ)Xxc-g+?=4|DmgE0(B&>&Zmizt& z3L(3@a2|*m;-=a|P7D1fEWk>WOof40001Z z+GAj3U|_fV=gZ*2A@^VUzaNJ#Lkfc^12X6U0DTh$nE(KI+BK0eNJ3E*hJT;;sY6q= zWkE?g1hv}@&!?I=)r+N+=ss;_eoXqOLHFS)2me>w< zEhzXpIUBHOdDsOQgFNg*Z}d+k^y@H3jT5UA*_v)L(|Qcc{)+pGVOM)lG~W$WOck_c zXUlc+zfrtKyb)>b|E|UUb@UY#I(HZvX&z+GAjV13!iu#wex<%NeL^4DPwI#CBN;iFWipTC8srt^+vJZauqc=* zR4E)&c%;atB&2jjIYwogs*mb5bqDol8a5hhG_^G2w8FHxw3q07(p{$Krmv?z$-vE! z!^q0$jPVBJFD5HYj+tIFt1+uFw=@4?(Pg>8@|@K%t2fx8HJ7!9wVQR4b)EGF>qj;g zHeEKCY~{f4ioKhCh<$>6j(v@N4*;@KS<(Oi0RR91i2$kq1prt81ONg60RRF3761SN z00Mjf0{{Vd+J%r!N&`Uj?LN!-U1 zcmxmPF|zP=O;2P%kfyp{RlWDRyMS%(X%V$|fHy^jBMy{Rc!OQu18%X$N5E~4_zZZH zeZB+U;*eFqU*u7T3&xBTrQ(&0JDeg>o(L@!T~4%mLT3~V#mU9USg3N&ROih0#5|_z z#>Sm!In}-YgL;K!nNF{Lvb$og)laSRt9J~P(V(|Nhp44CsMr-en1SzM2N-yM?DQR(nK>Yw9-a99dy!#hK@mqFcG?m5+hCzz4Xz~0D}yX zV3-j`Ns?lWaVD5#ifLw;WsZ3kSY(N1R#;_?bvD>!i*0t;WsiN*lE)R-*$?l<%pH$n z5v$n5F8Sh+0&$8<+~Sc!DUxDdc;$mn-gxJRXYopj_;?V%1f*2TBxuW=oobk>&S+Pb2D_9}05LrvG6jE3r iuz*<|um&q!SOBmEAVshPD?|aX1|UVS11m&XuoNr0jwMe3 literal 0 HcmV?d00001 diff --git a/public/fonts/LiberationSans-Regular-webfont.eot b/public/fonts/LiberationSans-Regular-webfont.eot new file mode 100755 index 0000000000000000000000000000000000000000..e7f411842bba5ae989e97cf32e75fe9b8ff1ab8d GIT binary patch literal 32962 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Digitized data 2007 Ascender Corporation All rights reserved +Designer : Steve Matteson +Foundry : Ascender Corporation +Foundry URL : httpwwwascendercorpcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/LiberationSans-Regular-webfont.ttf b/public/fonts/LiberationSans-Regular-webfont.ttf new file mode 100755 index 0000000000000000000000000000000000000000..3501bcfb4e861b244184b2e96439a3b5f049002b GIT binary patch literal 32748 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 literal 0 HcmV?d00001 diff --git a/public/fonts/LiberationSans-Regular-webfont.woff b/public/fonts/LiberationSans-Regular-webfont.woff new file mode 100755 index 0000000000000000000000000000000000000000..6e3f0e0163545364490c5bec0fdd67aeef423184 GIT binary patch literal 20796 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 aSOBmEAVshPD?|aX1|UVS11m&XuoNr#LJfHU literal 0 HcmV?d00001 diff --git a/public/fonts/Red Hat Liberation License.txt b/public/fonts/Red Hat Liberation License.txt new file mode 100755 index 00000000000..c5417561fb3 --- /dev/null +++ b/public/fonts/Red Hat Liberation License.txt @@ -0,0 +1,78 @@ +LICENSE AGREEMENT AND LIMITED PRODUCT WARRANTY LIBERATION FONT SOFTWARE +This agreement governs the use of the Software and any updates to the +Software, regardless of the delivery mechanism. Subject to the following +terms, Red Hat, Inc. ("Red Hat") grants to the user ("Client") a license to +this collective work pursuant to the GNU General Public License v.2 with the +exceptions set forth below and such other terms as our set forth in this End +User License Agreement. +1. The Software and License Exception. LIBERATION font software (the +"Software") consists of TrueType-OpenType formatted font software for +rendering LIBERATION typefaces in sans serif, serif, and monospaced character +styles. You are licensed to use, modify, copy, and distribute the Software +pursuant to the GNU General Public License v.2 with the following exceptions: +1) As a special exception, if you create a document which uses this font, and +embed this font or unaltered portions of this font into the document, this +font does not by itself cause the resulting document to be covered by the GNU +General Public License.  This exception does not however invalidate any other +reasons why the document might be covered by the GNU General Public License.  +If you modify this font, you may extend this exception to your version of the +font, but you are not obligated to do so. If you do not wish to do so, delete +this exception statement from your version. + +2) As a further exception, any distribution of the object code of the Software +in a physical product must provide you the right to access and modify the +source code for the Software and to reinstall that modified version of the +Software in object code form on the same physical product on which you +received it. +2. Intellectual Property Rights. The Software and each of its components, +including the source code, documentation, appearance, structure and +organization are owned by Red Hat and others and are protected under copyright +and other laws. Title to the Software and any component, or to any copy, +modification, or merged portion shall remain with the aforementioned, subject +to the applicable license. The "LIBERATION" trademark is a trademark of Red +Hat, Inc. in the U.S. and other countries. This agreement does not permit +Client to distribute modified versions of the Software using Red Hat's +trademarks. If Client makes a redistribution of a modified version of the +Software, then Client must modify the files names to remove any reference to +the Red Hat trademarks and must not use the Red Hat trademarks in any way to +reference or promote the modified Software. +3. Limited Warranty. To the maximum extent permitted under applicable law, the +Software is provided and licensed "as is" without warranty of any kind, +expressed or implied, including the implied warranties of merchantability, +non-infringement or fitness for a particular purpose. Red Hat does not warrant +that the functions contained in the Software will meet Client's requirements +or that the operation of the Software will be entirely error free or appear +precisely as described in the accompanying documentation. +4. Limitation of Remedies and Liability. To the maximum extent permitted by +applicable law, Red Hat or any Red Hat authorized dealer will not be liable to +Client for any incidental or consequential damages, including lost profits or +lost savings arising out of the use or inability to use the Software, even if +Red Hat or such dealer has been advised of the possibility of such damages. +5. Export Control. As required by U.S. law, Client represents and warrants +that it: (a) understands that the Software is subject to export controls under +the U.S. Commerce Department's Export Administration Regulations ("EAR"); (b) +is not located in a prohibited destination country under the EAR or U.S. +sanctions regulations (currently Cuba, Iran, Iraq, Libya, North Korea, Sudan +and Syria); (c) will not export, re-export, or transfer the Software to any +prohibited destination, entity, or individual without the necessary export +license(s) or authorizations(s) from the U.S. Government; (d) will not use or +transfer the Software for use in any sensitive nuclear, chemical or biological +weapons, or missile technology end-uses unless authorized by the U.S. +Government by regulation or specific license; (e) understands and agrees that +if it is in the United States and exports or transfers the Software to +eligible end users, it will, as required by EAR Section 740.17(e), submit +semi-annual reports to the Commerce Department's Bureau of Industry & Security +(BIS), which include the name and address (including country) of each +transferee; and (f) understands that countries other than the United States +may restrict the import, use, or export of encryption products and that it +shall be solely responsible for compliance with any such import, use, or +export restrictions. +6. General. If any provision of this agreement is held to be unenforceable, +that shall not affect the enforceability of the remaining provisions. This +agreement shall be governed by the laws of the State of North Carolina and of +the United States, without regard to any conflict of laws provisions, except +that the United Nations Convention on the International Sale of Goods shall +not apply. +Copyright © 2007 Red Hat, Inc. All rights reserved. LIBERATION is a trademark +of Red Hat, Inc. + diff --git a/public/fonts/demo.html b/public/fonts/demo.html new file mode 100755 index 00000000000..651508a528b --- /dev/null +++ b/public/fonts/demo.html @@ -0,0 +1,48 @@ + + + + + + + Font Face Demo + + + + + +
+

Font-face Demo for the Liberation Sans Font

+ + + +

Liberation Sans Regular - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + + +

Liberation Sans Italic - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + + +

Liberation Sans Bold - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + + +

Liberation Sans Bold Italic - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ +
+ + diff --git a/public/fonts/overpass_bold-web.eot b/public/fonts/overpass_bold-web.eot new file mode 100755 index 0000000000000000000000000000000000000000..2a2784ee1c52ec2e3278248fa55a157a4835540b GIT binary patch literal 32369 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 + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 by Red Hat Inc All rights reserved +Designer : Delve Withrington +Foundry : Delve Fonts +Foundry URL : httpwwwredhatcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/overpass_bold-web.ttf b/public/fonts/overpass_bold-web.ttf new file mode 100755 index 0000000000000000000000000000000000000000..24830387be30822e09727346fe5c12a3c9c985d4 GIT binary patch literal 63656 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

pey@r6V)(q;&-~gb-%|gOe>m+9 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 literal 0 HcmV?d00001 diff --git a/public/fonts/overpass_regular-web.eot b/public/fonts/overpass_regular-web.eot new file mode 100755 index 0000000000000000000000000000000000000000..612b64ad2bef97551718b2911878a68368f4d948 GIT binary patch literal 31030 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 HL22N?D48I3 literal 0 HcmV?d00001 diff --git a/public/fonts/overpass_regular-web.svg b/public/fonts/overpass_regular-web.svg new file mode 100755 index 00000000000..80651dd13f6 --- /dev/null +++ b/public/fonts/overpass_regular-web.svg @@ -0,0 +1,470 @@ + + + + +This is a custom SVG webfont generated by Font Squirrel. +Copyright : Copyright c 2011 by Red Hat Inc All rights reserved +Designer : Delve Withrington +Foundry : Delve Fonts +Foundry URL : httpwwwredhatcom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/overpass_regular-web.ttf b/public/fonts/overpass_regular-web.ttf new file mode 100755 index 0000000000000000000000000000000000000000..243b98660c88335081126c53e693d57a14050c5c GIT binary patch literal 61808 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 Q`3HN5;zM|B^a}ES0lW%GK>z>% literal 0 HcmV?d00001 diff --git a/public/fonts/overpass_regular-web.woff b/public/fonts/overpass_regular-web.woff new file mode 100755 index 0000000000000000000000000000000000000000..eb994e440a82fa20454814fc280312c2f38a0b43 GIT binary patch literal 36352 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

') + .attr('class', 'progress') + .attr('id', "progress_" + repo) + .text(" "); + progressBar.progressbar({ + value: 0 + }); + progressBar.appendTo(updateField); + cancelButton.appendTo(updateField); + updateField.fadeIn('fast'); + var pu = $.PeriodicalUpdater('/sync_management/status/', { + data: {repo_id:repo, sync_id:sync}, + method: 'get', + type: 'json', + global: false + }, function(data,success) { + if (success == "notmodified") { + return; + } + var pb = $('#progress_' + data.repo_id); + var prod_id = getProductId(updateField); + $("#repo_sync_start_" + data.repo_id).text(data.start_time); + // Only stop when we reach 100% and the finish_time is done + // sometimes they arent both complete + if (data.progress.progress == 100 && data.finish_time != null) { + pu.stop(); + updateField.html(data.state); + fadeUpdate("#repo_sync_finish_" + data.repo_id, data.finish_time); + fadeUpdate("#repo_sync_size_" + data.repo_id, + data.size + ' (' + data.packages + ')'); + content.updateProduct(prod_id, data.repo_id); + } else if (data.progress.progress < 0) { + pu.stop(); + updateField.html(i18n.error); + content.updateProduct(prod_id, data.repo_id); + } else { + pb.progressbar({ value : data.progress.progress}); + fadeUpdate("#repo_sync_size_" + data.repo_id, data.size + ' (' + data.packages + ')'); + } + }); + cancelButton.click(function(){ + content.cancelSync(repo, sync, updateField, pu); + }) + return false; + }, + updateProduct : function (prod_id, repo_id) { + $.ajax({ + type: 'GET', + url: '/sync_management/product_status/', + data: { product_id: prod_id, repo_id: repo_id}, + dataType: 'json', + success: function(data) { + $('#table_' + prod_id).find('div.productstatus').html(data.state); + fadeUpdate("#prod_sync_finish_" + data.product_id, data.finish_time); + fadeUpdate("#prod_sync_start_" + data.product_id, data.start_time); + fadeUpdate("#prod_size_" + data.product_id, data.size); + }, + error: function(data) { + fadeUpdate("#prod_sync_finish_" + data.product_id, data.finish_time); + fadeUpdate("#prod_sync_start_" + data.product_id, data.start_time); + fadeUpdate("#prod_size_" + data.product_id, data.size); + alert("got a update product error"); + } + }); + }, + cancelSync : function(repoid, syncid, updateField, pu){ + var btn = $('#' + common.escapeId("cancel_" + repoid)); + btn.addClass("disabled"); + pu.stop(); + $.ajax({ + type: 'DELETE', + url: '/sync_management/' + syncid, + data: { repo_id: repoid }, + dataType: 'script', + success: function(data) { + var prod_id = getProductId(updateField); + content.updateProduct(prod_id, repoid); + updateField.html('Sync Cancelled.'); + }, + error: function(data) { + btn.removeClass("disabled"); + } + }); + } + } +})(); diff --git a/public/javascripts/env_select.js b/public/javascripts/env_select.js new file mode 100644 index 00000000000..77d29ea0d38 --- /dev/null +++ b/public/javascripts/env_select.js @@ -0,0 +1,101 @@ +/** + Copyright 2011 Red Hat, Inc. + + This software is licensed to you under the GNU General Public + License as published by the Free Software Foundation; either version + 2 of the License (GPLv2) or (at your option) any later version. + There is NO WARRANTY for this software, express or implied, + including the implied warranties of MERCHANTABILITY, + NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should + have received a copy of GPLv2 along with this software; if not, see + http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +*/ + +$(document).ready(function() { + + $('#path-expanded').hide(); + $('#path-collapsed').live('click', env_select.expand); + $('#path-expanded').live('click', env_select.close); + $('.path_link').live('click', env_select.env_selected); + $('.path_entry').live('click', env_select.path_selected); + + //If we mouse over the entries box, deselect what is already selected + $('#path-entries').mouseover(env_select.disable_active); + $('#path-entries').mouseout(env_select.highlight_selected); + + + env_select.active_div = $(".active").parents(".path_entry"); + env_select.highlight_selected(); + + //Close the drop down if the user clicks somewhere else + $('body').click(function(event){ + if (!($(event.target).parents("#path-entries").size() > 0) && env_select.is_open()) { + env_select.close(); + } + }); + + $('#path-widget').hoverIntent({ + over:env_select.expand, + timeout:750, + interval: 200, + out:env_select.close + }); + +}); + + + + +var env_select = { + /* Click callback should be a function: + * + * function(env_id, env_next_id, is_locker) + * env_next_id may be undefined + * + */ + click_callback: undefined, + active_div: undefined, + expand: function() { + $('#path-collapsed').hide(); + $('#path-expanded').show(); + + $('#path-entries').show(); + + }, + close: function() { + $('#path-collapsed').show(); + $('#path-expanded').hide(); + + $('#path-entries').hide(); + }, + path_selected: function() { + env_select.close(); + var content = $(this).html(); + $('#path-selected').find('ul').html(content); + env_select.active_div = $(this); + env_select.highlight_selected(); + }, + env_selected: function() { + env_select.close(); + var id = $(this).attr('data-env_id') ; + + $('a[data-env_id]').removeClass('active'); + $('a[data-env_id="'+ id + '"]').addClass('active'); + if (env_select.click_callback) { + env_select.click_callback(id, $(this)); + } + }, + disable_active: function() { + //This is used when the user is highlighting entries, to clear + // what we manually highlighted. CSS Hover will take care of it from here. + $(".path_entry").removeClass("path_entry_selected"); + }, + is_open: function() { + return $('#path-entries').is(":visible"); + }, + highlight_selected: function () { + $(".path_entry").removeClass("path_entry_selected"); + env_select.active_div.addClass("path_entry_selected"); + } + +}; \ No newline at end of file diff --git a/public/javascripts/environment_edit.js b/public/javascripts/environment_edit.js new file mode 100644 index 00000000000..73e289ce628 --- /dev/null +++ b/public/javascripts/environment_edit.js @@ -0,0 +1,101 @@ +/** + Copyright 2011 Red Hat, Inc. + + This software is licensed to you under the GNU General Public + License as published by the Free Software Foundation; either version + 2 of the License (GPLv2) or (at your option) any later version. + There is NO WARRANTY for this software, express or implied, + including the implied warranties of MERCHANTABILITY, + NON-INFRINGEMENT, or FITNESS FOR A PARTICULAR PURPOSE. You should + have received a copy of GPLv2 along with this software; if not, see + http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. +*/ + + +$(document).ready(function() { + + $(".delete_environment").click(function() { + var button = $(this); + if (button.hasClass('disabled')){ + return false; + } + var answer = confirm(button.attr('data-confirm-text')); + if (answer) { + button.addClass('disabled'); + environment.destroy(button.attr('data-url'), function(){ + panel.panelAjax('', button.attr('data-forward'), $('#panel')); + panel.closeSubPanel($('#subpanel')); + }, function() {button.removeClass('disabled')}); + + } + }); + + + + + $('.edit_env_description').each(function() { + $(this).editable($(this).attr('data-url'), { + type : 'textarea', + width : 270, + rows : 3, + method : 'PUT', + name : $(this).attr('name'), + cancel : i18n.cancel, + submit : i18n.save, + indicator : i18n.saving, + tooltip : i18n.clickToEdit, + placeholder : i18n.clickToEdit, + submitdata : {authenticity_token: AUTH_TOKEN}, + onerror : function(settings, original, xhr) { + original.reset(); + $("#notification").replaceWith(xhr.responseText); + } + }); + }); + + $('.edit_env_name').each(function() { + var button = $(this); + + $(this).editable(button.attr('data-url'), { + type : 'text', + method : 'PUT', + name : $(this).attr('name'), + cancel : i18n.cancel, + submit : i18n.save, + indicator : i18n.saving, + tooltip : i18n.clickToEdit, + placeholder : i18n.clickToEdit, + submitdata : {authenticity_token: AUTH_TOKEN}, + rows : 8, + cols : 60, + onsuccess : function() {panel.panelAjax('', button.attr("data-forward") ,$('#panel')); }, + onerror : function(settings, original, xhr) { + original.reset(); + $("#notification").replaceWith(xhr.responseText); + } + }); + }); + + $('.edit_prior_envs').each(function() { + var button = $(this); + $(this).editable(button.attr('data-url'), { + type : 'select', + width : 440, + method : 'PUT', + name : $(this).attr('name'), + cancel : i18n.cancel, + submit : i18n.save, + indicator : i18n.saving, + tooltip : i18n.clickToEdit, + placeholder : i18n.clickToEdit, + style : "inherit", + data : document.environment_edit.elements['prior_envs'].value, + onsuccess : function() {panel.panelAjax('', button.attr("data-forward") ,$('#panel')); }, + onerror : function(settings, original, xhr) { + original.reset(); + $("#notification").replaceWith(xhr.responseText); + } + }); + }); + +}); diff --git a/public/javascripts/facebox.js b/public/javascripts/facebox.js new file mode 100644 index 00000000000..e0d4749c90b --- /dev/null +++ b/public/javascripts/facebox.js @@ -0,0 +1,320 @@ +/* + * Facebox (for jQuery) + * version: 1.2 (05/05/2008) + * @requires jQuery v1.2 or later + * + * Examples at http://famspam.com/facebox/ + * + * Licensed under the MIT: + * http://www.opensource.org/licenses/mit-license.php + * + * Copyright 2007, 2008 Chris Wanstrath [ chris@ozmm.org ] + * + * Usage: + * + * jQuery(document).ready(function() { + * jQuery('a[rel*=facebox]').facebox() + * }) + * + * Terms + * Loads the #terms div in the box + * + * Terms + * Loads the terms.html page in the box + * + * Terms + * Loads the terms.png image in the box + * + * + * You can also use it programmatically: + * + * jQuery.facebox('some html') + * + * The above will open a facebox with "some html" as the content. + * + * jQuery.facebox(function($) { + * $.get('blah.html', function(data) { $.facebox(data) }) + * }) + * + * The above will show a loading screen before the passed function is called, + * allowing for a better ajaxy experience. + * + * The facebox function can also display an ajax page or image: + * + * jQuery.facebox({ ajax: 'remote.html' }) + * jQuery.facebox({ image: 'dude.jpg' }) + * + * Want to close the facebox? Trigger the 'close.facebox' document event: + * + * jQuery(document).trigger('close.facebox') + * + * Facebox also has a bunch of other hooks: + * + * loading.facebox + * beforeReveal.facebox + * reveal.facebox (aliased as 'afterReveal.facebox') + * init.facebox + * + * Simply bind a function to any of these hooks: + * + * $(document).bind('reveal.facebox', function() { ...stuff to do after the facebox and contents are revealed... }) + * + */ +(function($) { + $.facebox = function(data, klass) { + $.facebox.loading() + + if (data.ajax) fillFaceboxFromAjax(data.ajax) + else if (data.image) fillFaceboxFromImage(data.image) + else if (data.div) fillFaceboxFromHref(data.div) + else if ($.isFunction(data)) data.call($) + else $.facebox.reveal(data, klass) + } + + /* + * Public, $.facebox methods + */ + + $.extend($.facebox, { + settings: { + opacity : .4, + overlay : true, + loadingImage : '/ovirt/images/loading.gif', + closeImage : '/ovirt/images/closelabel.gif', + imageTypes : [ 'png', 'jpg', 'jpeg', 'gif' ], + faceboxHtml : '\ + ' + }, + + loading: function() { + init() + if ($('#facebox .loading').length == 1) return true + showOverlay() + + $('#facebox .content').empty() + $('#facebox .body').children().hide().end(). + append('
') + + $('#facebox').css({ + top: getPageScroll()[1] + (getPageHeight() / 10), + left: 385.5 + }).show() + + $(document).bind('keydown.facebox', function(e) { + if (e.keyCode == 27) $.facebox.close() + return true + }) + $(document).trigger('loading.facebox') + }, + + reveal: function(data, klass) { + $(document).trigger('beforeReveal.facebox') + if (klass) $('#facebox .content').addClass(klass) + $('#facebox .content').append(data) + $('#facebox .loading').remove() + $('#facebox .body').children().fadeIn('normal') + $('#facebox').css('left', $(window).width() / 2 - ($('#facebox table').width() / 2)) + $(document).trigger('reveal.facebox').trigger('afterReveal.facebox') + }, + + close: function() { + $(document).trigger('close.facebox') + return false + } + }) + + /* + * Public, $.fn methods + */ + + $.fn.facebox = function(settings) { + init(settings) + + function clickHandler() { + $.facebox.loading(true) + + // support for rel="facebox.inline_popup" syntax, to add a class + // also supports deprecated "facebox[.inline_popup]" syntax + var klass = this.rel.match(/facebox\[?\.(\w+)\]?/) + if (klass) klass = klass[1] + + fillFaceboxFromHref(this.href, klass) + return false + } + + return this.click(clickHandler) + } + + /* + * Private methods + */ + + // called one time to setup facebox on this page + function init(settings) { + if ($.facebox.settings.inited) return true + else $.facebox.settings.inited = true + + $(document).trigger('init.facebox') + makeCompatible() + + var imageTypes = $.facebox.settings.imageTypes.join('|') + $.facebox.settings.imageTypesRegexp = new RegExp('\.' + imageTypes + '$', 'i') + + if (settings) $.extend($.facebox.settings, settings) + $('body').append($.facebox.settings.faceboxHtml) + + var preload = [ new Image(), new Image() ] + preload[0].src = $.facebox.settings.closeImage + preload[1].src = $.facebox.settings.loadingImage + + $('#facebox').find('.b:first, .bl, .br, .tl, .tr').each(function() { + preload.push(new Image()) + preload.slice(-1).src = $(this).css('background-image').replace(/url\((.+)\)/, '$1') + }) + + $('#facebox .close').click($.facebox.close) + $('#facebox .close_image').attr('src', $.facebox.settings.closeImage) + $('#facebox .footer').remove() + } + + // getPageScroll() by quirksmode.com + function getPageScroll() { + var xScroll, yScroll; + if (self.pageYOffset) { + yScroll = self.pageYOffset; + xScroll = self.pageXOffset; + } else if (document.documentElement && document.documentElement.scrollTop) { // Explorer 6 Strict + yScroll = document.documentElement.scrollTop; + xScroll = document.documentElement.scrollLeft; + } else if (document.body) {// all other Explorers + yScroll = document.body.scrollTop; + xScroll = document.body.scrollLeft; + } + return new Array(xScroll,yScroll) + } + + // Adapted from getPageSize() by quirksmode.com + function getPageHeight() { + var windowHeight + if (self.innerHeight) { // all except Explorer + windowHeight = self.innerHeight; + } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode + windowHeight = document.documentElement.clientHeight; + } else if (document.body) { // other Explorers + windowHeight = document.body.clientHeight; + } + return windowHeight + } + + // Backwards compatibility + function makeCompatible() { + var $s = $.facebox.settings + + $s.loadingImage = $s.loading_image || $s.loadingImage + $s.closeImage = $s.close_image || $s.closeImage + $s.imageTypes = $s.image_types || $s.imageTypes + $s.faceboxHtml = $s.facebox_html || $s.faceboxHtml + } + + // Figures out what you want to display and displays it + // formats are: + // div: #id + // image: blah.extension + // ajax: anything else + function fillFaceboxFromHref(href, klass) { + // div + if (href.match(/#/)) { + var url = window.location.href.split('#')[0] + var target = href.replace(url,'') + $.facebox.reveal($(target).clone().show(), klass) + + // image + } else if (href.match($.facebox.settings.imageTypesRegexp)) { + fillFaceboxFromImage(href, klass) + // ajax + } else { + fillFaceboxFromAjax(href, klass) + } + } + + function fillFaceboxFromImage(href, klass) { + var image = new Image() + image.onload = function() { + $.facebox.reveal('
', klass) + } + image.src = href + } + + function fillFaceboxFromAjax(href, klass) { + $.get(href, function(data) { $.facebox.reveal(data, klass) }) + } + + function skipOverlay() { + return $.facebox.settings.overlay == false || $.facebox.settings.opacity === null + } + + function showOverlay() { + if (skipOverlay()) return + + if ($('facebox_overlay').length == 0) + $("body").append('
') + + $('#facebox_overlay').hide().addClass("facebox_overlayBG") + .css('opacity', $.facebox.settings.opacity) + .click(function() { $(document).trigger('close.facebox') }) + .fadeIn(200) + return false + } + + function hideOverlay() { + if (skipOverlay()) return + + $('#facebox_overlay').fadeOut(200, function(){ + $("#facebox_overlay").removeClass("facebox_overlayBG") + $("#facebox_overlay").addClass("facebox_hide") + $("#facebox_overlay").remove() + }) + + return false + } + + /* + * Bindings + */ + + $(document).bind('close.facebox', function() { + $(document).unbind('keydown.facebox') + $('#facebox').fadeOut(function() { + $('#facebox .content').removeClass().addClass('content') + hideOverlay() + $('#facebox .loading').remove() + }) + }) + +})(jQuery); diff --git a/public/javascripts/html5.js b/public/javascripts/html5.js new file mode 100644 index 00000000000..3587bf73497 --- /dev/null +++ b/public/javascripts/html5.js @@ -0,0 +1,6 @@ +// html5shiv MIT @rem remysharp.com/html5-enabling-script +// iepp v1.6.2 MIT @jon_neal iecss.com/print-protector +/*@cc_on(function(m,c){var z="abbr|article|aside|audio|canvas|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video";function n(d){for(var a=-1;++ai";if(g.childNodes.length!==1){var i=z.split("|"),o=i.length,s=RegExp("(^|\\s)("+z+")", +"gi"),t=RegExp("<(/*)("+z+")","gi"),u=RegExp("(^|[^\\n]*?\\s)("+z+")([^\\n]*)({[\\n\\w\\W]*?})","gi"),r=c.createDocumentFragment(),k=c.documentElement;g=k.firstChild;var h=c.createElement("body"),l=c.createElement("style"),f;n(c);n(r);g.insertBefore(l, +g.firstChild);l.media="print";m.attachEvent("onbeforeprint",function(){var d=-1,a=p(c.styleSheets,"all"),e=[],b;for(f=f||c.body;(b=u.exec(a))!=null;)e.push((b[1]+b[2]+b[3]).replace(s,"$1.iepp_$2")+b[4]);for(l.styleSheet.cssText=e.join("\n");++d'); + if(settings.width!='none') { + input.width(settings.width); + } + if(settings.height!='none') { + input.height(settings.height); + } + input.attr('autocomplete','off'); + $(this).append(input); + return(input); + } + }); + + // Create a custom input type for checkboxes + $.editable.addInputType("checkbox", { + element : function(settings, original) { + var input = $(''); + $(this).append(input); + + // Update 's value when clicked + $(input).click(function() { + //var value = $(input).attr("checked") ? i18n.checkbox_yes : i18n.checkbox_no; + var value = $(input).attr("checked") ? true : false; + $(input).val(value); + }); + return(input); + }, + content : function(string, settings, original) { + var checked = string.indexOf(i18n.checkbox_yes)!= -1 ? 1 : 0; + var input = $(':input:first', this); + $(input).attr("checked", checked); + var value = $(input).attr("checked") ? i18n.checkbox_yes : i18n.checkbox_no; + //var value = $(input).attr("checked") ? true : false; + + $(input).val(value); + } + }); + + $('.edit_textfield').each(function() { + $(this).editable('edit', { + type : 'text', + width : 270, + method : 'PUT', + name : $(this).attr('name'), + cancel : i18n.cancel, + submit : i18n.save, + indicator : i18n.saving, + tooltip : i18n.clickToEdit, + placeholder : i18n.clickToEdit, + submitdata : {authenticity_token: AUTH_TOKEN}, + onerror : function(settings, original, xhr) { + original.reset(); + $("#notification").replaceWith(xhr.responseText); + } + }); + }); + + $('.edit_textarea').each(function() { + $(this).editable('edit', { + type : 'textarea', + method : 'PUT', + name : $(this).attr('name'), + cancel : i18n.cancel, + submit : i18n.save, + indicator : i18n.saving, + tooltip : i18n.clickToEdit, + placeholder : i18n.clickToEdit, + submitdata : {authenticity_token: AUTH_TOKEN}, + rows : 8, + cols : 60, + onerror : function(settings, original, xhr) { + original.reset(); + $("#notification").replaceWith(xhr.responseText); + } + }); + }); + + +}); diff --git a/public/javascripts/jquery-1.5.2.js b/public/javascripts/jquery-1.5.2.js new file mode 100644 index 00000000000..0cce56b725d --- /dev/null +++ b/public/javascripts/jquery-1.5.2.js @@ -0,0 +1,8374 @@ +/*! + * jQuery JavaScript Library v1.5.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Mar 31 15:28:23 2011 -0400 + */ +(function( window, undefined ) { + +// Use the correct document accordingly with window argument (sandbox) +var document = window.document; +var jQuery = (function() { + +// Define a local copy of jQuery +var jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // (both of which we optimize for) + quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Check for digits + rdigit = /\d/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, + + // [[Class]] -> type pairs + class2type = {}; + +jQuery.fn = jQuery.prototype = { + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = "body"; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + match = quickExpr.exec( selector ); + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = (context ? context.ownerDocument || context : document); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return (context || rootjQuery).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if (selector.selector !== undefined) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.5.2", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + (this.selector ? " " : "") + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.done( fn ); + + return this; + }, + + eq: function( i ) { + return i === -1 ? + this.slice( i ) : + this.slice( i, +i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice +}; + +// Give the init function the jQuery prototype for later instantiation +jQuery.fn.init.prototype = jQuery.fn; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + noConflict: function( deep ) { + window.$ = _$; + + if ( deep ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + // A third-party is pushing the ready event forwards + if ( wait === true ) { + jQuery.readyWait--; + } + + // Make sure that the DOM is not already loaded + if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).unbind( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery._Deferred(); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent("onreadystatechange", DOMContentLoaded); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + // A crude way of determining if an object is a window + isWindow: function( obj ) { + return obj && typeof obj === "object" && "setInterval" in obj; + }, + + isNaN: function( obj ) { + return obj == null || !rdigit.test( obj ) || isNaN( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw msg; + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test(data.replace(rvalidescape, "@") + .replace(rvalidtokens, "]") + .replace(rvalidbraces, "")) ) { + + // Try to use the native JSON parser first + return window.JSON && window.JSON.parse ? + window.JSON.parse( data ) : + (new Function("return " + data))(); + + } else { + jQuery.error( "Invalid JSON: " + data ); + } + }, + + // Cross-browser xml parsing + // (xml & tmp used internally) + parseXML: function( data , xml , tmp ) { + + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + + tmp = xml.documentElement; + + if ( ! tmp || ! tmp.nodeName || tmp.nodeName === "parsererror" ) { + jQuery.error( "Invalid XML: " + data ); + } + + return xml; + }, + + noop: function() {}, + + // Evalulates a script in a global context + globalEval: function( data ) { + if ( data && rnotwhite.test(data) ) { + // Inspired by code by Andrea Giammarchi + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html + var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement, + script = document.createElement( "script" ); + + if ( jQuery.support.scriptEval() ) { + script.appendChild( document.createTextNode( data ) ); + } else { + script.text = data; + } + + // Use insertBefore instead of appendChild to circumvent an IE6 bug. + // This arises when a base node is used (#2709). + head.insertBefore( script, head.firstChild ); + head.removeChild( script ); + } + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction(object); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( var value = object[0]; + i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {} + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // The extra typeof function check is to prevent crashes + // in Safari 2 (See: #3039) + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type(array); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var ret = [], value; + + // Go through the array, translating each of the items to their + // new value (or values). + for ( var i = 0, length = elems.length; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + proxy: function( fn, proxy, thisObject ) { + if ( arguments.length === 2 ) { + if ( typeof proxy === "string" ) { + thisObject = fn; + fn = thisObject[ proxy ]; + proxy = undefined; + + } else if ( proxy && !jQuery.isFunction( proxy ) ) { + thisObject = proxy; + proxy = undefined; + } + } + + if ( !proxy && fn ) { + proxy = function() { + return fn.apply( thisObject || this, arguments ); + }; + } + + // Set the guid of unique handler to the same of original handler, so it can be removed + if ( fn ) { + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + } + + // So proxy can be declared as an argument + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can be optionally by executed if its a function + access: function( elems, key, value, exec, fn, pass ) { + var length = elems.length; + + // Setting many attributes + if ( typeof key === "object" ) { + for ( var k in key ) { + jQuery.access( elems, k, key[k], exec, fn, value ); + } + return elems; + } + + // Setting one attribute + if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = !pass && exec && jQuery.isFunction(value); + + for ( var i = 0; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + + return elems; + } + + // Getting an attribute + return length ? fn( elems[0], key ) : undefined; + }, + + now: function() { + return (new Date()).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySubclass( selector, context ) { + return new jQuerySubclass.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySubclass, this ); + jQuerySubclass.superclass = this; + jQuerySubclass.fn = jQuerySubclass.prototype = this(); + jQuerySubclass.fn.constructor = jQuerySubclass; + jQuerySubclass.subclass = this.subclass; + jQuerySubclass.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) { + context = jQuerySubclass(context); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass ); + }; + jQuerySubclass.fn.init.prototype = jQuerySubclass.fn; + var rootjQuerySubclass = jQuerySubclass(document); + return jQuerySubclass; + }, + + browser: {} +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +browserMatch = jQuery.uaMatch( userAgent ); +if ( browserMatch.browser ) { + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; +} + +// Deprecated, use jQuery.browser.webkit instead +if ( jQuery.browser.webkit ) { + jQuery.browser.safari = true; +} + +if ( indexOf ) { + jQuery.inArray = function( elem, array ) { + return indexOf.call( array, elem ); + }; +} + +// IE doesn't match non-breaking spaces with \s +if ( rnotwhite.test( "\xA0" ) ) { + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; +} + +// All jQuery objects should point back to these +rootjQuery = jQuery(document); + +// Cleanup functions for the document ready method +if ( document.addEventListener ) { + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; + +} else if ( document.attachEvent ) { + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; +} + +// The DOM ready check for Internet Explorer +function doScrollCheck() { + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } + + // and execute any waiting functions + jQuery.ready(); +} + +// Expose jQuery to the global object +return jQuery; + +})(); + + +var // Promise methods + promiseMethods = "then done fail isResolved isRejected promise".split( " " ), + // Static reference to slice + sliceDeferred = [].slice; + +jQuery.extend({ + // Create a simple deferred (one callbacks list) + _Deferred: function() { + var // callbacks list + callbacks = [], + // stored [ context , args ] + fired, + // to avoid firing when already doing so + firing, + // flag to know if the deferred has been cancelled + cancelled, + // the deferred itself + deferred = { + + // done( f1, f2, ...) + done: function() { + if ( !cancelled ) { + var args = arguments, + i, + length, + elem, + type, + _fired; + if ( fired ) { + _fired = fired; + fired = 0; + } + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + deferred.done.apply( deferred, elem ); + } else if ( type === "function" ) { + callbacks.push( elem ); + } + } + if ( _fired ) { + deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); + } + } + return this; + }, + + // resolve with given context and args + resolveWith: function( context, args ) { + if ( !cancelled && !fired && !firing ) { + // make sure args are available (#8421) + args = args || []; + firing = 1; + try { + while( callbacks[ 0 ] ) { + callbacks.shift().apply( context, args ); + } + } + finally { + fired = [ context, args ]; + firing = 0; + } + } + return this; + }, + + // resolve with this as context and given arguments + resolve: function() { + deferred.resolveWith( this, arguments ); + return this; + }, + + // Has this deferred been resolved? + isResolved: function() { + return !!( firing || fired ); + }, + + // Cancel + cancel: function() { + cancelled = 1; + callbacks = []; + return this; + } + }; + + return deferred; + }, + + // Full fledged deferred (two callbacks list) + Deferred: function( func ) { + var deferred = jQuery._Deferred(), + failDeferred = jQuery._Deferred(), + promise; + // Add errorDeferred methods, then and promise + jQuery.extend( deferred, { + then: function( doneCallbacks, failCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ); + return this; + }, + fail: failDeferred.done, + rejectWith: failDeferred.resolveWith, + reject: failDeferred.resolve, + isRejected: failDeferred.isResolved, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + if ( promise ) { + return promise; + } + promise = obj = {}; + } + var i = promiseMethods.length; + while( i-- ) { + obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; + } + return obj; + } + } ); + // Make sure only one callback list will be used + deferred.done( failDeferred.cancel ).fail( deferred.cancel ); + // Unexpose cancel + delete deferred.cancel; + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = arguments, + i = 0, + length = args.length, + count = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + // Strange bug in FF4: + // Values changed onto the arguments object sometimes end up as undefined values + // outside the $.when method. Cloning the object into a fresh array solves the issue + deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); + } + }; + } + if ( length > 1 ) { + for( ; i < length; i++ ) { + if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return deferred.promise(); + } +}); + + + + +(function() { + + jQuery.support = {}; + + var div = document.createElement("div"); + + div.style.display = "none"; + div.innerHTML = "
a"; + + var all = div.getElementsByTagName("*"), + a = div.getElementsByTagName("a")[0], + select = document.createElement("select"), + opt = select.appendChild( document.createElement("option") ), + input = div.getElementsByTagName("input")[0]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return; + } + + jQuery.support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: div.firstChild.nodeType === 3, + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText insted) + style: /red/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: a.getAttribute("href") === "/a", + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55$/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: input.value === "on", + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Will be defined later + deleteExpando: true, + optDisabled: false, + checkClone: false, + noCloneEvent: true, + noCloneChecked: true, + boxModel: null, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableHiddenOffsets: true, + reliableMarginRight: true + }; + + input.checked = true; + jQuery.support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as diabled) + select.disabled = true; + jQuery.support.optDisabled = !opt.disabled; + + var _scriptEval = null; + jQuery.support.scriptEval = function() { + if ( _scriptEval === null ) { + var root = document.documentElement, + script = document.createElement("script"), + id = "script" + jQuery.now(); + + // Make sure that the execution of code works by injecting a script + // tag with appendChild/createTextNode + // (IE doesn't support this, fails, and uses .text instead) + try { + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); + } catch(e) {} + + root.insertBefore( script, root.firstChild ); + + if ( window[ id ] ) { + _scriptEval = true; + delete window[ id ]; + } else { + _scriptEval = false; + } + + root.removeChild( script ); + } + + return _scriptEval; + }; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + + } catch(e) { + jQuery.support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent("onclick", function click() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + jQuery.support.noCloneEvent = false; + div.detachEvent("onclick", click); + }); + div.cloneNode(true).fireEvent("onclick"); + } + + div = document.createElement("div"); + div.innerHTML = ""; + + var fragment = document.createDocumentFragment(); + fragment.appendChild( div.firstChild ); + + // WebKit doesn't clone checked state correctly in fragments + jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked; + + // Figure out if the W3C box model works as expected + // document.body must exist before we can do this + jQuery(function() { + var div = document.createElement("div"), + body = document.getElementsByTagName("body")[0]; + + // Frameset documents with no body should not run this code + if ( !body ) { + return; + } + + div.style.width = div.style.paddingLeft = "1px"; + body.appendChild( div ); + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; + + if ( "zoom" in div.style ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.style.display = "inline"; + div.style.zoom = 1; + jQuery.support.inlineBlockNeedsLayout = div.offsetWidth === 2; + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = ""; + div.innerHTML = "
"; + jQuery.support.shrinkWrapBlocks = div.offsetWidth !== 2; + } + + div.innerHTML = "
t
"; + var tds = div.getElementsByTagName("td"); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + jQuery.support.reliableHiddenOffsets = tds[0].offsetHeight === 0; + + tds[0].style.display = ""; + tds[1].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE < 8 fail this test) + jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0; + div.innerHTML = ""; + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( document.defaultView && document.defaultView.getComputedStyle ) { + div.style.width = "1px"; + div.style.marginRight = "0"; + jQuery.support.reliableMarginRight = ( parseInt(document.defaultView.getComputedStyle(div, null).marginRight, 10) || 0 ) === 0; + } + + body.removeChild( div ).style.display = "none"; + div = tds = null; + }); + + // Technique from Juriy Zaytsev + // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ + var eventSupported = function( eventName ) { + var el = document.createElement("div"); + eventName = "on" + eventName; + + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( !el.attachEvent ) { + return true; + } + + var isSupported = (eventName in el); + if ( !isSupported ) { + el.setAttribute(eventName, "return;"); + isSupported = typeof el[eventName] === "function"; + } + return isSupported; + }; + + jQuery.support.submitBubbles = eventSupported("submit"); + jQuery.support.changeBubbles = eventSupported("change"); + + // release memory in IE + div = all = a = null; +})(); + + + +var rbrace = /^(?:\{.*\}|\[.*\])$/; + +jQuery.extend({ + cache: {}, + + // Please use with caution + uuid: 0, + + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, getByName = typeof name === "string", thisCache, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || (pvt && id && !cache[ id ][ internalKey ])) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ jQuery.expando ] = id = ++jQuery.uuid; + } else { + id = jQuery.expando; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); + } else { + cache[ id ] = jQuery.extend(cache[ id ], name); + } + } + + thisCache = cache[ id ]; + + // Internal jQuery data is stored in a separate object inside the object's data + // cache in order to avoid key collisions between internal data and user-defined + // data + if ( pvt ) { + if ( !thisCache[ internalKey ] ) { + thisCache[ internalKey ] = {}; + } + + thisCache = thisCache[ internalKey ]; + } + + if ( data !== undefined ) { + thisCache[ name ] = data; + } + + // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should + // not attempt to inspect the internal events object using jQuery.data, as this + // internal data object is undocumented and subject to change. + if ( name === "events" && !thisCache[name] ) { + return thisCache[ internalKey ] && thisCache[ internalKey ].events; + } + + return getByName ? thisCache[ name ] : thisCache; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var internalKey = jQuery.expando, isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + var thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; + + if ( thisCache ) { + delete thisCache[ name ]; + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !isEmptyDataObject(thisCache) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( pvt ) { + delete cache[ id ][ internalKey ]; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + var internalCache = cache[ id ][ internalKey ]; + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + if ( jQuery.support.deleteExpando || cache != window ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the entire user cache at once because it's faster than + // iterating through each key, but we need to continue to persist internal + // data if it existed + if ( internalCache ) { + cache[ id ] = {}; + // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery + // metadata on plain JS objects when the object is serialized using + // JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + + cache[ id ][ internalKey ] = internalCache; + + // Otherwise, we need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + } else if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ jQuery.expando ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( jQuery.expando ); + } else { + elem[ jQuery.expando ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } + + return true; + } +}); + +jQuery.fn.extend({ + data: function( key, value ) { + var data = null; + + if ( typeof key === "undefined" ) { + if ( this.length ) { + data = jQuery.data( this[0] ); + + if ( this[0].nodeType === 1 ) { + var attr = this[0].attributes, name; + for ( var i = 0, l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = name.substr( 5 ); + dataAttr( this[0], name, data[ name ] ); + } + } + } + } + + return data; + + } else if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + var parts = key.split("."); + parts[1] = parts[1] ? "." + parts[1] : ""; + + if ( value === undefined ) { + data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); + + // Try to fetch any internally stored data first + if ( data === undefined && this.length ) { + data = jQuery.data( this[0], key ); + data = dataAttr( this[0], key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + + } else { + return this.each(function() { + var $this = jQuery( this ), + args = [ parts[0], value ]; + + $this.triggerHandler( "setData" + parts[1] + "!", args ); + jQuery.data( this, key, value ); + $this.triggerHandler( "changeData" + parts[1] + "!", args ); + }); + } + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } +}); + +function dataAttr( elem, key, data ) { + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + data = elem.getAttribute( "data-" + key ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + !jQuery.isNaN( data ) ? parseFloat( data ) : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON +// property to be considered empty objects; this property always exists in +// order to make sure JSON.stringify does not expose internal metadata +function isEmptyDataObject( obj ) { + for ( var name in obj ) { + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + + + + +jQuery.extend({ + queue: function( elem, type, data ) { + if ( !elem ) { + return; + } + + type = (type || "fx") + "queue"; + var q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( !data ) { + return q || []; + } + + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + + } else { + q.push( data ); + } + + return q; + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(); + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift("inprogress"); + } + + fn.call(elem, function() { + jQuery.dequeue(elem, type); + }); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue", true ); + } + } +}); + +jQuery.fn.extend({ + queue: function( type, data ) { + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + } + + if ( data === undefined ) { + return jQuery.queue( this[0], type ); + } + return this.each(function( i ) { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; + type = type || "fx"; + + return this.queue( type, function() { + var elem = this; + setTimeout(function() { + jQuery.dequeue( elem, type ); + }, time ); + }); + }, + + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + } +}); + + + + +var rclass = /[\n\t\r]/g, + rspaces = /\s+/, + rreturn = /\r/g, + rspecialurl = /^(?:href|src|style)$/, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rradiocheck = /^(?:radio|checkbox)$/i; + +jQuery.props = { + "for": "htmlFor", + "class": "className", + readonly: "readOnly", + maxlength: "maxLength", + cellspacing: "cellSpacing", + rowspan: "rowSpan", + colspan: "colSpan", + tabindex: "tabIndex", + usemap: "useMap", + frameborder: "frameBorder" +}; + +jQuery.fn.extend({ + attr: function( name, value ) { + return jQuery.access( this, name, value, true, jQuery.attr ); + }, + + removeAttr: function( name, fn ) { + return this.each(function(){ + jQuery.attr( this, name, "" ); + if ( this.nodeType === 1 ) { + this.removeAttribute( name ); + } + }); + }, + + addClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.addClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( value && typeof value === "string" ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className ) { + elem.className = value; + + } else { + var className = " " + elem.className + " ", + setClass = elem.className; + + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) { + setClass += " " + classNames[c]; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + if ( jQuery.isFunction(value) ) { + return this.each(function(i) { + var self = jQuery(this); + self.removeClass( value.call(this, i, self.attr("class")) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + var classNames = (value || "").split( rspaces ); + + for ( var i = 0, l = this.length; i < l; i++ ) { + var elem = this[i]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + var className = (" " + elem.className + " ").replace(rclass, " "); + for ( var c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[c] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function(i) { + var self = jQuery(this); + self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspaces ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " "; + for ( var i = 0, l = this.length; i < l; i++ ) { + if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + if ( !arguments.length ) { + var elem = this[0]; + + if ( elem ) { + if ( jQuery.nodeName( elem, "option" ) ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + + // We need to handle select boxes special + if ( jQuery.nodeName( elem, "select" ) ) { + var index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { + var option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery(option).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + } + + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) { + return elem.getAttribute("value") === null ? "on" : elem.value; + } + + // Everything else, we just grab the value + return (elem.value || "").replace(rreturn, ""); + + } + + return undefined; + } + + var isFunction = jQuery.isFunction(value); + + return this.each(function(i) { + var self = jQuery(this), val = value; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call(this, i, self.val()); + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray(val) ) { + val = jQuery.map(val, function (value) { + return value == null ? "" : value + ""; + }); + } + + if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) { + this.checked = jQuery.inArray( self.val(), val ) >= 0; + + } else if ( jQuery.nodeName( this, "select" ) ) { + var values = jQuery.makeArray(val); + + jQuery( "option", this ).each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + this.selectedIndex = -1; + } + + } else { + this.value = val; + } + }); + } +}); + +jQuery.extend({ + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || elem.nodeType === 2 ) { + return undefined; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery(elem)[name](value); + } + + var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ), + // Whether we are setting (or getting) + set = value !== undefined; + + // Try to normalize/fix the name + name = notxml && jQuery.props[ name ] || name; + + // Only do all the following if this is a node (faster for style) + if ( elem.nodeType === 1 ) { + // These attributes require special treatment + var special = rspecialurl.test( name ); + + // Safari mis-reports the default selected property of an option + // Accessing the parent's selectedIndex property fixes it + if ( name === "selected" && !jQuery.support.optSelected ) { + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + + // If applicable, access the attribute via the DOM 0 way + // 'in' checks fail in Blackberry 4.7 #6931 + if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) { + if ( set ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } + + if ( value === null ) { + if ( elem.nodeType === 1 ) { + elem.removeAttribute( name ); + } + + } else { + elem[ name ] = value; + } + } + + // browsers index elements by id/name on forms, give priority to attributes. + if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) { + return elem.getAttributeNode( name ).nodeValue; + } + + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + if ( name === "tabIndex" ) { + var attributeNode = elem.getAttributeNode( "tabIndex" ); + + return attributeNode && attributeNode.specified ? + attributeNode.value : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + + return elem[ name ]; + } + + if ( !jQuery.support.style && notxml && name === "style" ) { + if ( set ) { + elem.style.cssText = "" + value; + } + + return elem.style.cssText; + } + + if ( set ) { + // convert the value to a string (all browsers do this but IE) see #1070 + elem.setAttribute( name, "" + value ); + } + + // Ensure that missing attributes return undefined + // Blackberry 4.7 returns "" from getAttribute #6938 + if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) { + return undefined; + } + + var attr = !jQuery.support.hrefNormalized && notxml && special ? + // Some attributes require a special call on IE + elem.getAttribute( name, 2 ) : + elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return attr === null ? undefined : attr; + } + // Handle everything which isn't a DOM element node + if ( set ) { + elem[ name ] = value; + } + return elem[ name ]; + } +}); + + + + +var rnamespaces = /\.(.*)$/, + rformElems = /^(?:textarea|input|select)$/i, + rperiod = /\./g, + rspace = / /g, + rescape = /[^\w\s.|`]/g, + fcleanup = function( nm ) { + return nm.replace(rescape, "\\$&"); + }; + +/* + * A number of helper functions used for managing events. + * Many of the ideas behind this code originated from + * Dean Edwards' addEvent library. + */ +jQuery.event = { + + // Bind an event to an element + // Original by Dean Edwards + add: function( elem, types, handler, data ) { + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // TODO :: Use a try/catch until it's safe to pull this out (likely 1.6) + // Minor release fix for bug #8018 + try { + // For whatever reason, IE has trouble passing the window object + // around, causing it to be cloned in the process + if ( jQuery.isWindow( elem ) && ( elem !== window && !elem.frameElement ) ) { + elem = window; + } + } + catch ( e ) {} + + if ( handler === false ) { + handler = returnFalse; + } else if ( !handler ) { + // Fixes bug #7229. Fix recommended by jdalton + return; + } + + var handleObjIn, handleObj; + + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + } + + // Make sure that the function being executed has a unique ID + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure + var elemData = jQuery._data( elem ); + + // If no elemData is found then we must be trying to bind to one of the + // banned noData elements + if ( !elemData ) { + return; + } + + var events = elemData.events, + eventHandle = elemData.handle; + + if ( !events ) { + elemData.events = events = {}; + } + + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Handle the second event of a trigger and when + // an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.handle.apply( eventHandle.elem, arguments ) : + undefined; + }; + } + + // Add elem as a property of the handle function + // This is to prevent a memory leak with non-native events in IE. + eventHandle.elem = elem; + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = types.split(" "); + + var type, i = 0, namespaces; + + while ( (type = types[ i++ ]) ) { + handleObj = handleObjIn ? + jQuery.extend({}, handleObjIn) : + { handler: handler, data: data }; + + // Namespaced event handlers + if ( type.indexOf(".") > -1 ) { + namespaces = type.split("."); + type = namespaces.shift(); + handleObj.namespace = namespaces.slice(0).sort().join("."); + + } else { + namespaces = []; + handleObj.namespace = ""; + } + + handleObj.type = type; + if ( !handleObj.guid ) { + handleObj.guid = handler.guid; + } + + // Get the current list of functions bound to this event + var handlers = events[ type ], + special = jQuery.event.special[ type ] || {}; + + // Init the event handler queue + if ( !handlers ) { + handlers = events[ type ] = []; + + // Check for a special event handler + // Only use addEventListener/attachEvent if the special + // events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add the function to the element's handler list + handlers.push( handleObj ); + + // Keep track of which events have been used, for global triggering + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, pos ) { + // don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + if ( handler === false ) { + handler = returnFalse; + } + + var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + events = elemData && elemData.events; + + if ( !elemData || !events ) { + return; + } + + // types is actually an event object here + if ( types && types.type ) { + handler = types.handler; + types = types.type; + } + + // Unbind all events for the element + if ( !types || typeof types === "string" && types.charAt(0) === "." ) { + types = types || ""; + + for ( type in events ) { + jQuery.event.remove( elem, type + types ); + } + + return; + } + + // Handle multiple events separated by a space + // jQuery(...).unbind("mouseover mouseout", fn); + types = types.split(" "); + + while ( (type = types[ i++ ]) ) { + origType = type; + handleObj = null; + all = type.indexOf(".") < 0; + namespaces = []; + + if ( !all ) { + // Namespaced event handlers + namespaces = type.split("."); + type = namespaces.shift(); + + namespace = new RegExp("(^|\\.)" + + jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + eventType = events[ type ]; + + if ( !eventType ) { + continue; + } + + if ( !handler ) { + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( all || namespace.test( handleObj.namespace ) ) { + jQuery.event.remove( elem, origType, handleObj.handler, j ); + eventType.splice( j--, 1 ); + } + } + + continue; + } + + special = jQuery.event.special[ type ] || {}; + + for ( j = pos || 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( handler.guid === handleObj.guid ) { + // remove the given handler for the given type + if ( all || namespace.test( handleObj.namespace ) ) { + if ( pos == null ) { + eventType.splice( j--, 1 ); + } + + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + + if ( pos != null ) { + break; + } + } + } + + // remove generic event handler if no more handlers exist + if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + ret = null; + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + var handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + delete elemData.events; + delete elemData.handle; + + if ( jQuery.isEmptyObject( elemData ) ) { + jQuery.removeData( elem, undefined, true ); + } + } + }, + + // bubbling is internal + trigger: function( event, data, elem /*, bubbling */ ) { + // Event object or event type + var type = event.type || event, + bubbling = arguments[3]; + + if ( !bubbling ) { + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + jQuery.extend( jQuery.Event(type), event ) : + // Just the event type (string) + jQuery.Event(type); + + if ( type.indexOf("!") >= 0 ) { + event.type = type = type.slice(0, -1); + event.exclusive = true; + } + + // Handle a global trigger + if ( !elem ) { + // Don't bubble custom events when global (to avoid too much overhead) + event.stopPropagation(); + + // Only trigger if we've ever bound an event for it + if ( jQuery.event.global[ type ] ) { + // XXX This code smells terrible. event.js should not be directly + // inspecting the data cache + jQuery.each( jQuery.cache, function() { + // internalKey variable is just used to make it easier to find + // and potentially change this stuff later; currently it just + // points to jQuery.expando + var internalKey = jQuery.expando, + internalCache = this[ internalKey ]; + if ( internalCache && internalCache.events && internalCache.events[ type ] ) { + jQuery.event.trigger( event, data, internalCache.handle.elem ); + } + }); + } + } + + // Handle triggering a single element + + // don't do events on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) { + return undefined; + } + + // Clean up in case it is reused + event.result = undefined; + event.target = elem; + + // Clone the incoming data, if any + data = jQuery.makeArray( data ); + data.unshift( event ); + } + + event.currentTarget = elem; + + // Trigger the event, it is assumed that "handle" is a function + var handle = jQuery._data( elem, "handle" ); + + if ( handle ) { + handle.apply( elem, data ); + } + + var parent = elem.parentNode || elem.ownerDocument; + + // Trigger an inline bound script + try { + if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) { + if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) { + event.result = false; + event.preventDefault(); + } + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (inlineError) {} + + if ( !event.isPropagationStopped() && parent ) { + jQuery.event.trigger( event, data, parent, true ); + + } else if ( !event.isDefaultPrevented() ) { + var old, + target = event.target, + targetType = type.replace( rnamespaces, "" ), + isClick = jQuery.nodeName( target, "a" ) && targetType === "click", + special = jQuery.event.special[ targetType ] || {}; + + if ( (!special._default || special._default.call( elem, event ) === false) && + !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) { + + try { + if ( target[ targetType ] ) { + // Make sure that we don't accidentally re-trigger the onFOO events + old = target[ "on" + targetType ]; + + if ( old ) { + target[ "on" + targetType ] = null; + } + + jQuery.event.triggered = event.type; + target[ targetType ](); + } + + // prevent IE from throwing an error for some elements with some event types, see #3533 + } catch (triggerError) {} + + if ( old ) { + target[ "on" + targetType ] = old; + } + + jQuery.event.triggered = undefined; + } + } + }, + + handle: function( event ) { + var all, handlers, namespaces, namespace_re, events, + namespace_sort = [], + args = jQuery.makeArray( arguments ); + + event = args[0] = jQuery.event.fix( event || window.event ); + event.currentTarget = this; + + // Namespaced event handlers + all = event.type.indexOf(".") < 0 && !event.exclusive; + + if ( !all ) { + namespaces = event.type.split("."); + event.type = namespaces.shift(); + namespace_sort = namespaces.slice(0).sort(); + namespace_re = new RegExp("(^|\\.)" + namespace_sort.join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.namespace = event.namespace || namespace_sort.join("."); + + events = jQuery._data(this, "events"); + + handlers = (events || {})[ event.type ]; + + if ( events && handlers ) { + // Clone the handlers to prevent manipulation + handlers = handlers.slice(0); + + for ( var j = 0, l = handlers.length; j < l; j++ ) { + var handleObj = handlers[ j ]; + + // Filter the functions by class + if ( all || namespace_re.test( handleObj.namespace ) ) { + // Pass in a reference to the handler function itself + // So that we can later remove it + event.handler = handleObj.handler; + event.data = handleObj.data; + event.handleObj = handleObj; + + var ret = handleObj.handler.apply( this, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + } + + return event.result; + }, + + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // store a copy of the original event object + // and "clone" to set read-only properties + var originalEvent = event; + event = jQuery.Event( originalEvent ); + + for ( var i = this.props.length, prop; i; ) { + prop = this.props[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary + if ( !event.target ) { + // Fixes #1925 where srcElement might not be defined either + event.target = event.srcElement || document; + } + + // check if target is a textnode (safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && event.fromElement ) { + event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; + } + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && event.clientX != null ) { + var doc = document.documentElement, + body = document.body; + + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); + } + + // Add which for key events + if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { + event.which = event.charCode != null ? event.charCode : event.keyCode; + } + + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) + if ( !event.metaKey && event.ctrlKey ) { + event.metaKey = event.ctrlKey; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && event.button !== undefined ) { + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); + } + + return event; + }, + + // Deprecated, use jQuery.guid instead + guid: 1E8, + + // Deprecated, use jQuery.proxy instead + proxy: jQuery.proxy, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady, + teardown: jQuery.noop + }, + + live: { + add: function( handleObj ) { + jQuery.event.add( this, + liveConvert( handleObj.origType, handleObj.selector ), + jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); + }, + + remove: function( handleObj ) { + jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); + } + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; + +jQuery.Event = function( src ) { + // Allow instantiation without the 'new' keyword + if ( !this.preventDefault ) { + return new jQuery.Event( src ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // timeStamp is buggy for some events on Firefox(#3843) + // So we won't rely on the native value + this.timeStamp = jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +function returnFalse() { + return false; +} +function returnTrue() { + return true; +} + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + preventDefault: function() { + this.isDefaultPrevented = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse +}; + +// Checks if an event happened on an element within another element +// Used in jQuery.event.special.mouseenter and mouseleave handlers +var withinElement = function( event ) { + // Check if mouse(over|out) are still within the same parent element + var parent = event.relatedTarget; + + // Firefox sometimes assigns relatedTarget a XUL element + // which we cannot access the parentNode property of + try { + + // Chrome does something similar, the parentNode property + // can be accessed but is null. + if ( parent && parent !== document && !parent.parentNode ) { + return; + } + // Traverse up the tree + while ( parent && parent !== this ) { + parent = parent.parentNode; + } + + if ( parent !== this ) { + // set the correct event type + event.type = event.data; + + // handle event if we actually just moused on to a non sub-element + jQuery.event.handle.apply( this, arguments ); + } + + // assuming we've left the element since we most likely mousedover a xul element + } catch(e) { } +}, + +// In case of event delegation, we only need to rename the event.type, +// liveHandler will take care of the rest. +delegate = function( event ) { + event.type = event.data; + jQuery.event.handle.apply( this, arguments ); +}; + +// Create mouseenter and mouseleave events +jQuery.each({ + mouseenter: "mouseover", + mouseleave: "mouseout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + setup: function( data ) { + jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); + }, + teardown: function( data ) { + jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); + } + }; +}); + +// submit delegation +if ( !jQuery.support.submitBubbles ) { + + jQuery.event.special.submit = { + setup: function( data, namespaces ) { + if ( this.nodeName && this.nodeName.toLowerCase() !== "form" ) { + jQuery.event.add(this, "click.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { + trigger( "submit", this, arguments ); + } + }); + + jQuery.event.add(this, "keypress.specialSubmit", function( e ) { + var elem = e.target, + type = elem.type; + + if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { + trigger( "submit", this, arguments ); + } + }); + + } else { + return false; + } + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialSubmit" ); + } + }; + +} + +// change delegation, happens here so we have bind. +if ( !jQuery.support.changeBubbles ) { + + var changeFilters, + + getVal = function( elem ) { + var type = elem.type, val = elem.value; + + if ( type === "radio" || type === "checkbox" ) { + val = elem.checked; + + } else if ( type === "select-multiple" ) { + val = elem.selectedIndex > -1 ? + jQuery.map( elem.options, function( elem ) { + return elem.selected; + }).join("-") : + ""; + + } else if ( elem.nodeName.toLowerCase() === "select" ) { + val = elem.selectedIndex; + } + + return val; + }, + + testChange = function testChange( e ) { + var elem = e.target, data, val; + + if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { + return; + } + + data = jQuery._data( elem, "_change_data" ); + val = getVal(elem); + + // the current data will be also retrieved by beforeactivate + if ( e.type !== "focusout" || elem.type !== "radio" ) { + jQuery._data( elem, "_change_data", val ); + } + + if ( data === undefined || val === data ) { + return; + } + + if ( data != null || val ) { + e.type = "change"; + e.liveFired = undefined; + jQuery.event.trigger( e, arguments[1], elem ); + } + }; + + jQuery.event.special.change = { + filters: { + focusout: testChange, + + beforedeactivate: testChange, + + click: function( e ) { + var elem = e.target, type = elem.type; + + if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) { + testChange.call( this, e ); + } + }, + + // Change has to be called before submit + // Keydown will be called before keypress, which is used in submit-event delegation + keydown: function( e ) { + var elem = e.target, type = elem.type; + + if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") || + (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || + type === "select-multiple" ) { + testChange.call( this, e ); + } + }, + + // Beforeactivate happens also before the previous element is blurred + // with this event you can't trigger a change event, but you can store + // information + beforeactivate: function( e ) { + var elem = e.target; + jQuery._data( elem, "_change_data", getVal(elem) ); + } + }, + + setup: function( data, namespaces ) { + if ( this.type === "file" ) { + return false; + } + + for ( var type in changeFilters ) { + jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); + } + + return rformElems.test( this.nodeName ); + }, + + teardown: function( namespaces ) { + jQuery.event.remove( this, ".specialChange" ); + + return rformElems.test( this.nodeName ); + } + }; + + changeFilters = jQuery.event.special.change.filters; + + // Handle when the input is .focus()'d + changeFilters.focus = changeFilters.beforeactivate; +} + +function trigger( type, elem, args ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + // Don't pass args or remember liveFired; they apply to the donor event. + var event = jQuery.extend( {}, args[ 0 ] ); + event.type = type; + event.originalEvent = {}; + event.liveFired = undefined; + jQuery.event.handle.call( elem, event ); + if ( event.isDefaultPrevented() ) { + args[ 0 ].preventDefault(); + } +} + +// Create "bubbling" focus and blur events +if ( document.addEventListener ) { + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + + function handler( donor ) { + // Donor event is always a native one; fix it and switch its type. + // Let focusin/out handler cancel the donor focus/blur event. + var e = jQuery.event.fix( donor ); + e.type = fix; + e.originalEvent = {}; + jQuery.event.trigger( e, null, e.target ); + if ( e.isDefaultPrevented() ) { + donor.preventDefault(); + } + } + }); +} + +jQuery.each(["bind", "one"], function( i, name ) { + jQuery.fn[ name ] = function( type, data, fn ) { + // Handle object literals + if ( typeof type === "object" ) { + for ( var key in type ) { + this[ name ](key, data, type[key], fn); + } + return this; + } + + if ( jQuery.isFunction( data ) || data === false ) { + fn = data; + data = undefined; + } + + var handler = name === "one" ? jQuery.proxy( fn, function( event ) { + jQuery( this ).unbind( event, handler ); + return fn.apply( this, arguments ); + }) : fn; + + if ( type === "unload" && name !== "one" ) { + this.one( type, data, fn ); + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.add( this[i], type, handler, data ); + } + } + + return this; + }; +}); + +jQuery.fn.extend({ + unbind: function( type, fn ) { + // Handle object literals + if ( typeof type === "object" && !type.preventDefault ) { + for ( var key in type ) { + this.unbind(key, type[key]); + } + + } else { + for ( var i = 0, l = this.length; i < l; i++ ) { + jQuery.event.remove( this[i], type, fn ); + } + } + + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.live( types, data, fn, selector ); + }, + + undelegate: function( selector, types, fn ) { + if ( arguments.length === 0 ) { + return this.unbind( "live" ); + + } else { + return this.die( types, null, fn, selector ); + } + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + + triggerHandler: function( type, data ) { + if ( this[0] ) { + var event = jQuery.Event( type ); + event.preventDefault(); + event.stopPropagation(); + jQuery.event.trigger( event, data, this[0] ); + return event.result; + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + i = 1; + + // link all the functions, so any of them can unbind this click handler + while ( i < args.length ) { + jQuery.proxy( fn, args[ i++ ] ); + } + + return this.click( jQuery.proxy( fn, function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + })); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +}); + +var liveMap = { + focus: "focusin", + blur: "focusout", + mouseenter: "mouseover", + mouseleave: "mouseout" +}; + +jQuery.each(["live", "die"], function( i, name ) { + jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { + var type, i = 0, match, namespaces, preType, + selector = origSelector || this.selector, + context = origSelector ? this : jQuery( this.context ); + + if ( typeof types === "object" && !types.preventDefault ) { + for ( var key in types ) { + context[ name ]( key, data, types[key], selector ); + } + + return this; + } + + if ( jQuery.isFunction( data ) ) { + fn = data; + data = undefined; + } + + types = (types || "").split(" "); + + while ( (type = types[ i++ ]) != null ) { + match = rnamespaces.exec( type ); + namespaces = ""; + + if ( match ) { + namespaces = match[0]; + type = type.replace( rnamespaces, "" ); + } + + if ( type === "hover" ) { + types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); + continue; + } + + preType = type; + + if ( type === "focus" || type === "blur" ) { + types.push( liveMap[ type ] + namespaces ); + type = type + namespaces; + + } else { + type = (liveMap[ type ] || type) + namespaces; + } + + if ( name === "live" ) { + // bind live handler + for ( var j = 0, l = context.length; j < l; j++ ) { + jQuery.event.add( context[j], "live." + liveConvert( type, selector ), + { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); + } + + } else { + // unbind live handler + context.unbind( "live." + liveConvert( type, selector ), fn ); + } + } + + return this; + }; +}); + +function liveHandler( event ) { + var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, + elems = [], + selectors = [], + events = jQuery._data( this, "events" ); + + // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) + if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { + return; + } + + if ( event.namespace ) { + namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); + } + + event.liveFired = this; + + var live = events.live.slice(0); + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { + selectors.push( handleObj.selector ); + + } else { + live.splice( j--, 1 ); + } + } + + match = jQuery( event.target ).closest( selectors, event.currentTarget ); + + for ( i = 0, l = match.length; i < l; i++ ) { + close = match[i]; + + for ( j = 0; j < live.length; j++ ) { + handleObj = live[j]; + + if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { + elem = close.elem; + related = null; + + // Those two events require additional checking + if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { + event.type = handleObj.preType; + related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; + } + + if ( !related || related !== elem ) { + elems.push({ elem: elem, handleObj: handleObj, level: close.level }); + } + } + } + } + + for ( i = 0, l = elems.length; i < l; i++ ) { + match = elems[i]; + + if ( maxLevel && match.level > maxLevel ) { + break; + } + + event.currentTarget = match.elem; + event.data = match.handleObj.data; + event.handleObj = match.handleObj; + + ret = match.handleObj.origHandler.apply( match.elem, arguments ); + + if ( ret === false || event.isPropagationStopped() ) { + maxLevel = match.level; + + if ( ret === false ) { + stop = false; + } + if ( event.isImmediatePropagationStopped() ) { + break; + } + } + } + + return stop; +} + +function liveConvert( type, selector ) { + return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspace, "&"); +} + +jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.bind( name, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } +}); + + +/*! + * Sizzle CSS Selector Engine + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rNonWord = /\W/; + +// Here we check if the JavaScript engine is using some sort of +// optimization where it does not always call our comparision +// function. If that is the case, discard the hasDuplicate value. +// Thus far that includes Google Chrome. +[0, 0].sort(function() { + baseHasDuplicate = false; + return 0; +}); + +var Sizzle = function( selector, context, results, seed ) { + results = results || []; + context = context || document; + + var origContext = context; + + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } + + return results; +}; + +Sizzle.uniqueSort = function( results ) { + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } + + return results; +}; + +Sizzle.matches = function( expr, set ) { + return Sizzle( expr, null, null, set ); +}; + +Sizzle.matchesSelector = function( node, expr ) { + return Sizzle( expr, null, null, [node] ).length > 0; +}; + +Sizzle.find = function( expr, context, isXML ) { + var set; + + if ( !expr ) { + return []; + } + + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { + var match, + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + var left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } + + return { set: set, expr: expr }; +}; + +Sizzle.filter = function( expr, set, inplace, not ) { + var match, anyFound, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( var type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + var found, item, + filter = Expr.filter[ type ], + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + var pass = not ^ !!found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } + + old = expr; + } + + return curLoop; +}; + +Sizzle.error = function( msg ) { + throw "Syntax error, unrecognized expression: " + msg; +}; + +var Expr = Sizzle.selectors = { + order: [ "ID", "NAME", "TAG" ], + + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return "radio" === elem.type; + }, + + checkbox: function( elem ) { + return "checkbox" === elem.type; + }, + + file: function( elem ) { + return "file" === elem.type; + }, + password: function( elem ) { + return "password" === elem.type; + }, + + submit: function( elem ) { + return "submit" === elem.type; + }, + + image: function( elem ) { + return "image" === elem.type; + }, + + reset: function( elem ) { + return "reset" === elem.type; + }, + + button: function( elem ) { + return "button" === elem.type || elem.nodeName.toLowerCase() === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + var first = match[2], + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + var doneName = match[0], + parent = elem.parentNode; + + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { + var count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent.sizcache = doneName; + } + + var diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } +}; + +var origPOS = Expr.match.POS, + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; + +for ( var type in Expr.match ) { + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); +} + +var makeArray = function( array, results ) { + array = Array.prototype.slice.call( array, 0 ); + + if ( results ) { + results.push.apply( results, array ); + return results; + } + + return array; +}; + +// Perform a simple check to determine if the browser is capable of +// converting a NodeList to an array using builtin methods. +// Also verifies that the returned array holds DOM nodes +// (which is not the case in the Blackberry browser) +try { + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + +// Provide a fallback method if it does not work +} catch( e ) { + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } + + return ret; + }; +} + +var sortOrder, siblingCheck; + +if ( document.documentElement.compareDocumentPosition ) { + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } + + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; + +} else { + sortOrder = function( a, b ) { + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // If the nodes are siblings (or identical) we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } + + cur = cur.nextSibling; + } + + return 1; + }; +} + +// Utility function for retreiving the text value of an array of DOM nodes +Sizzle.getText = function( elems ) { + var ret = "", elem; + + for ( var i = 0; elems[i]; i++ ) { + elem = elems[i]; + + // Get the text from text nodes and CDATA nodes + if ( elem.nodeType === 3 || elem.nodeType === 4 ) { + ret += elem.nodeValue; + + // Traverse everything else, except comment nodes + } else if ( elem.nodeType !== 8 ) { + ret += Sizzle.getText( elem.childNodes ); + } + } + + return ret; +}; + +// Check to see if the browser returns elements by name when +// querying by getElementById (and provide a workaround) +(function(){ + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } + + root.removeChild( form ); + + // release memory in IE + root = form = null; +})(); + +(function(){ + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") + + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } + + // release memory in IE + div = null; +})(); + +if ( document.querySelectorAll ) { + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); +} + +(function(){ + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } +})(); + +(function(){ + var div = document.createElement("div"); + + div.innerHTML = "
"; + + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; + + // release memory in IE + div = null; +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; + + if ( elem ) { + var match = false; + + elem = elem[dir]; + + while ( elem ) { + if ( elem.sizcache === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem.sizcache = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } +} + +if ( document.documentElement.contains ) { + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; + +} else if ( document.documentElement.compareDocumentPosition ) { + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; + +} else { + Sizzle.contains = function() { + return false; + }; +} + +Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +var posProcess = function( selector, context ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet ); + } + + return Sizzle.filter( later, tmpSet ); +}; + +// EXPOSE +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[":"] = jQuery.expr.filters; +jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + +})(); + + +var runtil = /Until$/, + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.POS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend({ + find: function( selector ) { + var ret = this.pushStack( "", "find", selector ), + length = 0; + + for ( var i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( var n = length; n < ret.length; n++ ) { + for ( var r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && jQuery.filter( selector, this ).length > 0; + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + if ( jQuery.isArray( selectors ) ) { + var match, selector, + matches = {}, + level = 1; + + if ( cur && selectors.length ) { + for ( i = 0, l = selectors.length; i < l; i++ ) { + selector = selectors[i]; + + if ( !matches[selector] ) { + matches[selector] = jQuery.expr.match.POS.test( selector ) ? + jQuery( selector, context || this.context ) : + selector; + } + } + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( selector in matches ) { + match = matches[selector]; + + if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) { + ret.push({ selector: selector, elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + } + + return ret; + } + + var pos = POS.test( selectors ) ? + jQuery( selectors, context || this.context ) : null; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique(ret) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + if ( !elem || typeof elem === "string" ) { + return jQuery.inArray( this[0], + // If it receives a string, the selector is used + // If it receives nothing, the siblings are used + elem ? jQuery( elem ) : this.parent().children() ); + } + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } +}); + +// A painfully simple check to see if an element is disconnected +// from a document (should be improved, where feasible). +function isDisconnected( node ) { + return !node || !node.parentNode || node.parentNode.nodeType === 11; +} + +jQuery.each({ + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( elem.parentNode.firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ), + // The variable 'args' was introduced in + // https://github.com/jquery/jquery/commit/52a0238 + // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. + // http://code.google.com/p/v8/issues/detail?id=1050 + args = slice.call(arguments); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; + + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, args.join(",") ); + }; +}); + +jQuery.extend({ + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } + + return r; + } +}); + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, keep ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return (elem === qualifier) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return (jQuery.inArray( elem, qualifier ) >= 0) === keep; + }); +} + + + + +var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /", "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }; + +wrapMap.optgroup = wrapMap.option; +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// IE can't serialize and \r\n' + + '\r\n' + + '\r\n' + + '\r\n' + + ' Click on circle to change its size\r\n' + + ''], + + ['Masking', maskingDemo, + 'In SVG, you can specify that any other graphics object or \'g\' element ' + + 'can be used as an alpha mask for compositing the current object into the background.
' + + 'See the original document.', + 'Example mask01 - blue text masked with gradient against red background\r\n' + + '\r\n' + + '\r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' Masked text\r\n' + + ' \r\n' + + '\r\n' + + '\r\n' + + '\r\n' + + '\r\n' + + '\r\n' + + ''], + + ['Styles and References', useStyleDemo, + 'Illustrates a \'use\' element with various methods of applying CSS styling.
' + + 'See the original document.', + 'Example Use04 - \'use\' with CSS styling\r\n' + + '\r\n' + + ' \r\n' + + '\r\n' + + '\r\n' + + '\r\n' + + ' \r\n' + + ''], + + ['Text', textDemo, + 'Shows how \'tspan\' elements can be included within \'textPath\' ' + + 'elements to adjust styling attributes and adjust the current text ' + + 'position before rendering a particular glyph. The first occurrence ' + + 'of the word "up" is filled with the color red. Attribute dy is used ' + + 'to lift the word "up" from the baseline.
' + + 'See the original document.', + '\r\n' + + ' \r\n' + + '\r\n' + + 'Example toap02 - tspan within textPath\r\n' + + '\r\n' + + '\r\n' + + ' \r\n' + + ' We go \r\n' + + ' \r\n' + + ' up\r\n' + + ' \r\n' + + ' \r\n' + + ' ,\r\n' + + ' \r\n' + + ' then we go down, then up again\r\n' + + ' \r\n' + + ''], + + ['Transformations', transformDemo, + 'Defines two coordinate systems which are skewed ' + + 'relative to the origin coordinate system.
' + + 'Transformations can be nested to any level. The effect of nested ' + + 'transformations is to post-multiply (i.e., concatenate) the subsequent ' + + 'transformation matrices onto previously defined transformations.
' + + 'See the original documents: skew ' + + 'and nesting.', + 'Example Skew - Show effects of skewX and skewY\r\n' + + '\r\n' + + '\r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' ABC (skewX)\r\n' + + ' \r\n' + + ' \r\n' + + '\r\n' + + '\r\n' + + '\r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' ABC (skewY)\r\n' + + ' \r\n' + + ' \r\n' + + '\r\n' + + '\r\n' + + '\r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' ....Translate(1)\r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' ....Rotate(2)\r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + ' ....Translate(3)\r\n' + + ' \r\n' + + ' \r\n' + + ' \r\n' + + '']]; + +// Populate the examples drop-down +function initExamples() { + var html = ''; + for (var i = 0; i < examples.length; i++) { + html += ''; + } + $('#example').html(html).change(pickExample)[0].selectedIndex = 0; +} + +// Display the selected example +function pickExample() { + var ex = $('#example').val(); + if (!ex) { + return; + } + $('#exampledesc').html(examples[ex][2]); + $('#svgsource pre').text(examples[ex][3]); + $('#svgcode pre').text(codeFormat(examples[ex][1].toString())); + var svg = svgManager.getSVGFor('#svgexample'); + svg.clear(); + examples[ex][1](svg); +} + +// Format the JavaScript SVG code for display +function codeFormat(code) { + var lines = code.split('\n'); + var formatted = ''; + for (var i = 0; i < lines.length; i++) { + var line = $.trim(lines[i]); + if (!line || line.length == 1 || line.substring(0, 9) == 'function ') { + continue; + } + while (line.length > 50) { + var pos = line.substr(0, 50).lastIndexOf(' '); + if (pos == -1) { + break; + } + formatted += line.substr(0, pos) + '\r\n ' + ($.browser.msie ? ' ' : ''); + line = line.substr(pos + 1); + } + formatted += line + '\r\n'; + } + return formatted; +} + +// Demonstrate basic SVG shapes and constructs +function basicShapesDemo(svg) { + svg.rect(null, 20, 50, 100, 50, + {fill: 'yellow', stroke: 'navy', stroke_width: 5}); + svg.roundrect(null, 150, 50, 100, 50, 10, 10, {fill: 'green'}); + var g = svg.group(null, {transform: 'translate(270 80) rotate(-30)'}); + svg.roundrect(g, 0, 0, 100, 50, 10, 10, {fill: 'none', stroke: 'purple', stroke_width: 3}); + svg.circle(null, 70, 220, 50, {fill: 'red', stroke: 'blue', stroke_width: 5}); + var g = svg.group(null, {transform: 'translate(175 220)'}); + svg.ellipse(g, '', '', 75, 50, {fill: 'yellow'}); + svg.ellipse(null, '', '', 75, 50, {transform: 'translate(300 220) rotate(-30)', + fill: 'none', stroke: 'blue', stroke_width: 10}); + var g = svg.group(null, {stroke: 'green'}); + svg.line(g, 450, 120, 550, 20, {stroke_width: 5}); + svg.line(g, 550, 120, 650, 20, {stroke_width: 10}); + svg.line(g, 650, 120, 750, 20, {stroke_width: 15}); + svg.line(g, 750, 120, 850, 20, {stroke_width: 20}); + svg.line(g, 850, 120, 950, 20, {stroke_width: 25}); + svg.polyline(null, [[450,250], + [475,250],[475,220],[500,220],[500,250], + [525,250],[525,200],[550,200],[550,250], + [575,250],[575,180],[600,180],[600,250], + [625,250],[625,160],[650,160],[650,250],[675,250]], + {fill: 'none', stroke: 'blue', stroke_width: 5}); + svg.polygon(null, [[800,150],[900,180],[900,240],[800,270],[700,240],[700,180]], + {fill: 'lime', stroke: 'blue', stroke_width: 10}); +} + +// Demonstrate SVG filter effects +function filterDemo(svg) { + svg.describe(null, 'An example which combines multiple filter primitives ' + + 'to produce a 3D lighting effect on a graphic consisting ' + + 'of the string "SVG" sitting on top of oval filled in red ' + + 'and surrounded by an oval outlined in red.'); + var defs = svg.defs(); + var filter = svg.filter(defs, 'MyFilter', 0, 0, 200, 120, + {filterUnits: 'userSpaceOnUse'}); + svg.filters.gaussianBlur(filter, 'blur', 'SourceAlpha', 4); + svg.filters.offset(filter, 'offsetBlur', 'blur', 4, 4); + var spec = svg.filters.specularLighting(filter, 'specOut', 'blur', + 5, 0.75, 20, {lighting_color: '#bbbbbb'}); + svg.filters.pointLight(spec, '', -5000, -10000, 20000); + svg.filters.composite(filter, 'specOut', 'in', 'specOut', 'SourceAlpha'); + svg.filters.composite(filter, 'litPaint', 'arithmetic', 'SourceGraphic', + 'specOut', 0, 1, 1, 0); + var merge = svg.filters.merge(filter, '', ['offsetBlur', 'litPaint']); + var g1 = svg.group(null, {filter: 'url(#MyFilter)'}); + var g2 = svg.group(g1); + var path = svg.createPath(); + svg.path(g2, path.moveTo(50, 90).curveCTo(0, 90, 0, 30, 50, 30). + lineTo(150, 30).curveCTo(200, 30, 200, 90, 150, 90).close(), + {fill: 'none', stroke: '#D90000', stroke_width: 10}); + svg.path(g2, path.reset().moveTo(60, 80).curveCTo(30, 80, 30, 40, 60, 40). + lineTo(140, 40).curveCTo(170, 40, 170, 80, 140, 80).close(), + {fill: '#D90000'}); + var g3 = svg.group(g2, {fill: '#FFFFFF', stroke: 'black', + font_size: 45, font_family: 'Verdana'}); + svg.text(g3, 52, 76, 'SVG'); +} + +// Demonstrate SVG gradient and pattern fills +function gradientPatternDemo(svg) { + svg.describe(null, 'Example radgrad01 - fill a rectangle by ' + + 'referencing a radial gradient paint server'); + var g = svg.group(); + var defs = svg.defs(g); + svg.radialGradient(defs, 'MyGradient', + [['0%', 'red'], ['50%', 'blue'], ['100%', 'red']], + 200, 100, 150, 200, 100, {gradientUnits: 'userSpaceOnUse'}); + svg.rect(g, 50, 50, 300, 100, + {fill: 'url(#MyGradient)', stroke: 'black', stroke_width: 5}); + g = svg.group(); + defs = svg.defs(g); + var ptn = svg.pattern(defs, 'TrianglePattern', 0, 0, 100, 100, + 0, 0, 10, 10, {patternUnits: 'userSpaceOnUse'}); + var path = svg.createPath(); + svg.path(ptn, path.moveTo(0, 0).lineTo([[7, 0], [3.5, 7]]).close(), + {fill: 'red', stroke: 'blue'}); + svg.ellipse(g, 550, 100, 175, 75, + {fill: 'url(#TrianglePattern)', stroke: 'black', stroke_width: 5}); +} + +// Demonstrate SVG interactivity +function interactiveDemo(svg) { + svg.describe(null, 'Example script01 - invoke an ECMAScript function from an onclick event'); + svg.script(null, 'function circle_click(evt) {\n' + + ' var circle = evt.target;\n' + + ' var currentRadius = circle.getAttribute("r");\n' + + ' if (currentRadius == 100)\n' + + ' circle.setAttribute("r", currentRadius*2);\n' + + ' else\n' + + ' circle.setAttribute("r", currentRadius*0.5);\n' + + '}', 'text/ecmascript'); + svg.circle(null, 300, 150, 100, {onclick: 'circle_click(evt)', fill: 'red'}); + svg.text(null, 300, 280, 'Click on circle to change its size', + {font_family: 'Verdana', font_size: 35, text_anchor: 'middle'}); +} + +// Demonstrate SVG masking operations +function maskingDemo(svg) { + svg.describe(null, 'Example mask01 - blue text masked with gradient against red background'); + var defs = svg.defs(); + svg.linearGradient(defs, 'Gradient', [[0, 'white', 0], [1, 'white', 1]], + 0, 0, 800, 0, {gradientUnits: 'userSpaceOnUse'}); + var mask = svg.mask(defs, 'Mask', 0, 0, 800, 300, {maskUnits: 'userSpaceOnUse'}); + svg.rect(mask, 0, 0, 800, 300, {fill: 'url(#Gradient)'}); + svg.text(defs, 400, 200, 'Masked text', {id: 'Text', + font_family: 'Verdana', font_size: 100, text_anchor: 'middle'}); + svg.rect(null, 0, 0, 800, 300, {fill: '#FF8080'}); + svg.use(null, '#Text', {fill: 'blue', mask: 'url(#Mask)'}); + svg.use(null, '#Text', {fill: 'none', stroke: 'black', stroke_width: 2}); +} + +// Demonstrate SVG text rendering +function textDemo(svg) { + var defs = svg.defs(); + var path = svg.createPath(); + svg.path(defs, path.moveTo(100, 200).curveCTo([[200, 100, 300, 0, 400, 100], + [500, 200, 600, 300, 700, 200], [800, 100, 900, 100, 900, 100]]), + {id: 'MyPath'}); + svg.describe(null, 'Example toap02 - tspan within textPath'); + svg.use(null, '#MyPath', {fill: 'none', stroke: 'red'}); + var text = svg.text(null, '', + {font_family: 'Verdana', font_size: '42.5', fill: 'blue'}); + var texts = svg.createText(); + svg.textpath(text, '#MyPath', texts.string('We go ').span('up', {dy: -30, fill: 'red'}). + span(',', {dy: 30}).string(' then we go down, then up again')); +} + +// Demonstrate SVG transformation support +function transformDemo(svg) { + svg.describe(null, 'Example Skew - Show effects of skewX and skewY'); + var g1 = svg.group(null, {transform: 'translate(30,100)'}); + var g2 = svg.group(g1, {transform: 'skewX(30)'}); + var g3 = svg.group(g2, {fill: 'none', stroke: 'red', stroke_width: 3}); + svg.line(g3, 0, 0, 50, 0); + svg.line(g3, 0, 0, 0, 50); + svg.text(g2, 0, 0, 'ABC (skewX)', + {font_size: 20, font_family: 'Verdana', fill: 'blue'}); + g1 = svg.group(null, {transform: 'translate(200,100)'}); + g2 = svg.group(g1, {transform: 'skewY(30)'}); + g3 = svg.group(g2, {fill: 'none', stroke: 'red', stroke_width: 3}); + svg.line(g3, 0, 0, 50, 0); + svg.line(g3, 0, 0, 0, 50); + svg.text(g2, 0, 0, 'ABC (skewY)', + {font_size: 20, font_family: 'Verdana', fill: 'blue'}); + + g1 = svg.group(null, {transform: 'translate(450,150)'}); + g2 = svg.group(g1, {fill: 'none', stroke: 'red', stroke_width: 3}); + svg.line(g2, 0, 0, 50, 0); + svg.line(g2, 0, 0, 0, 50); + svg.text(g1, 0, 0, '....Translate(1)', + {font_size: 16, font_family: 'Verdana'}); + g2 = svg.group(g1, {transform: 'rotate(-45)'}); + g3 = svg.group(g2, {fill: 'none', stroke: 'green', stroke_width: 3}); + svg.line(g3, 0, 0, 50, 0); + svg.line(g3, 0, 0, 0, 50); + svg.text(g2, 0, 0, '....Rotate(2)', + {font_size: 16, font_family: 'Verdana'}); + g3 = svg.group(g2, {transform: 'translate(130,160)'}); + var g4 = svg.group(g3, {fill: 'none', stroke: 'blue', stroke_width: 3}); + svg.line(g4, 0, 0, 50, 0); + svg.line(g4, 0, 0, 0, 50); + svg.text(g3, 0, 0, '....Translate(3)', + {font_size: 16, font_family: 'Verdana'}); +} + +// Demonstrate SVG referencing and CSS styling +function useStyleDemo(svg) { + svg.describe(null, 'Example Use04 - \'use\' with CSS styling'); + var defs = svg.defs(null, '', {style: ' /* rule 9 */ stroke-miterlimit: 10'}); + var path = svg.createPath(); + svg.path(defs, path.moveTo(100, 50).lineTo([[700, 50], [700, 250], [100, 250]]), + {id: 'MyPath', _class: 'MyPathClass', style: ' /* rule 10 */ stroke-dasharray: 300,100'}); + svg.style(null, '/* rule 1 */ #MyUse { fill: blue } ' + + '/* rule 2 */ #MyPath { stroke: red } ' + + '/* rule 3 */ use { fill-opacity: .5 } ' + + '/* rule 4 */ path { stroke-opacity: .5 } ' + + '/* rule 5 */ .MyUseClass { stroke-linecap: round } ' + + '/* rule 6 */ .MyPathClass { stroke-linejoin: bevel } ' + + '/* rule 7 */ use > path { shape-rendering: optimizeQuality } ' + + '/* rule 8 */ g > path { visibility: hidden }'); + var g = svg.group(null, {style: ' /* rule 11 */ stroke-width: 40'}); + svg.use(g, '#MyPath', {id: 'MyUse', _class: 'MyUseClass', + style: '/* rule 12 */ stroke-dashoffset: 50'}); +} + +// ----------------------------------------------------------------------------- + +// Add a node defined inline +function addInline() { + var svg = svgManager.getSVGFor('#svgload'); + svg.add(null, '#svg1'); +} + +// Load an external document +function loadExternal() { + var svg = svgManager.getSVGFor('#svgload'); + svg.load($('#loadURL').val()); +} + +// ----------------------------------------------------------------------------- + +// Synchronise the drawing section with user selection +function setDrawOptions() { + showHide = function(id, show) { + if (show) { + $(id).show(); + } + else { + $(id).hide(); + } + } + var shape = $('#shape').val(); + showHide('#getRect', (shape == 'rect' || shape == 'roundrect')); + showHide('#getRounded', shape == 'roundrect'); + showHide('#getCentre', (shape == 'circle' || shape == 'ellipse')); + showHide('#getRadius', (shape == 'circle')); + showHide('#getRadii', (shape == 'ellipse')); + showHide('#getLine', (shape == 'line')); + showHide('#getFill', (shape != 'line')); +} + +var drawNodes = []; +var sketchpad = null; + +$(document).ready(function() { + sketchpad = $('#svgsketch')[0]; +}); + +// Draw the selected element on the canvas +function draw() { + var svg = svgManager.getSVGFor(sketchpad); + var rotate = $('#rotate').val(); + var settings = $.extend({fill: $('#fill').val(), + stroke: $('#stroke').val(), stroke_width: $('#swidth').val()}, + (rotate ? {transform: 'rotate(' + rotate + ')'} : {})); + var shape = $('#shape').val(); + var node = null; + if (shape == 'rect') { + node = svg.rect(null, $('#left').val(), $('#top').val(), + $('#width').val(), $('#height').val(), settings); + } + else if (shape == 'roundrect') { + node = svg.roundrect(null, $('#left').val(), $('#top').val(), + $('#width').val(), $('#height').val(), + $('#roundX').val(), $('#roundY').val(), settings); + } + else if (shape == 'circle') { + node = svg.circle(null, $('#centreX').val(), $('#centreY').val(), + $('#radius').val(), settings); + } + else if (shape == 'ellipse') { + node = svg.ellipse(null, $('#centreX').val(), $('#centreY').val(), + $('#radiusX').val(), $('#radiusY').val(), settings); + } + else if (shape == 'line') { + node = svg.line(null, $('#startX').val(), $('#startY').val(), + $('#endX').val(), $('#endY').val(), settings); + } + drawNodes[drawNodes.length] = node; +} + +// Remove the last drawn element +function undo() { + if (!drawNodes.length) { + return; + } + var svg = svgManager.getSVGFor(sketchpad); + svg.remove(drawNodes[drawNodes.length - 1]); + drawNodes.splice(drawNodes.length - 1, 1); +} + +// Clear the canvas +function erase(name) { + svgManager.getSVGFor($(name)).clear(); + drawNodes = []; +} + +// ----------------------------------------------------------------------------- + +// Initialise the graphing options +function setGraphOptions() { + var html = ''; + var chartTypes = svgGraphing.chartTypes(); + for (var id in chartTypes) { + html += ''; + } + $('#chartType').html(html)[0].selectedIndex = 0; +} + +var firstGraph = true; +var chartArea = [[0.1, 0.1, 0.95, 0.9], [0.2, 0.1, 0.95, 0.9], + [0.1, 0.1, 0.8, 0.9], [0.1, 0.25, 0.9, 0.9], [0.1, 0.1, 0.9, 0.8]]; +var legendArea = [[0.0, 0.0, 0.0, 0.0], [0.005, 0.1, 0.125, 0.5], + [0.875, 0.1, 0.995, 0.5], [0.2, 0.1, 0.8, 0.2], [0.2, 0.9, 0.8, 0.995]]; +var fills = [['lightblue', 'url(#fadeBlue)'], ['pink', 'url(#fadeRed)'], + ['lightgreen', 'url(#fadeGreen)']]; + +// Draw a new graph with the selected options +function graphIt() { + var svg = svgManager.getSVGFor('#svggraph'); + if (firstGraph) { + var defs = svg.defs(); + svg.linearGradient(defs, 'fadeBlue', [[0, 'lightblue'], [1, 'blue']]); + svg.linearGradient(defs, 'fadeRed', [[0, 'pink'], [1, 'red']]); + svg.linearGradient(defs, 'fadeGreen', [[0, 'lightgreen'], [1, 'green']]); + svg.graph.noDraw().title('Browser Usage'). + addSeries('IE', [95.97, 91.80, 88.16, 86.64], 'lightblue', 'blue', 3). + addSeries('Netscape', [3.39, 2.83, 1.61, 0.00], 'pink', 'red', 3). + addSeries('Firefox', [0.00, 4.06, 8.13, 9.95], 'lightgreen', 'green', 3). + chartFormat('lightyellow', 'gray'). + gridlines({stroke: 'gray', stroke_dasharray: '2,2'}, 'gray'). + status(setStatus); + svg.graph.xAxis.title('Year').scale(0, 3). + ticks(1, 0).labels(['2002', '2004', '2005', '2006']); + svg.graph.yAxis.title('Percentage').scale(-5, 105).ticks(10, 5); + svg.graph.legend.settings({fill: 'lightgoldenrodyellow', stroke: 'gray'}); + firstGraph = false; + } + var chartType = $('#chartType').val(); + var legendPos = $('#legendPos').val() - 0; + var seriesFill = ($('#seriesFill').val() == 'plain' ? 0 : 1); + svg.graph.legend.show(legendPos).area(legendArea[legendPos]); + for (var i = 0; i < 3; i++) { + svg.graph.series()[i].format((fills[i])[seriesFill]); + } + svg.graph.noDraw().chartArea(chartArea[legendPos]). + chartType(chartType, {explode: [2], explodeDist: 10}).redraw(); + chartType = svgGraphing.chartTypes()[chartType]; + $('#graphDesc').text(chartType.description()); + var options = ''; + for (var i = 0; i < chartType.options().length; i++) { + options += '
  • ' + chartType.options()[i] + '
  • '; + } + $('#graphOptions').html(options || '
  • None
  • '); +} + +// Show the status values in a callback from the graph +function setStatus(value) { + window.status = value; +} \ No newline at end of file diff --git a/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_flat_0_aaaaaa_40x100.png b/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/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/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_flat_75_ffffff_40x100.png b/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/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/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-hard_75_dadada_1x100.png b/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-hard_75_dadada_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..eef96a3ef29b556251e6c97c628cc5936fb4c6f6 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l!m8^V~E7mZ=`+r+DKeP!EHrtDnm{r-UW|uO=Od literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-hard_75_e6e6e6_1x100.png b/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-hard_75_e6e6e6_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..31503e6215c8ba914450dd173a0cad541f833d54 GIT binary patch literal 94 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l&YtTV~E7mBvHrY`~HIpLszI$#gPprAQKooUHx3vIVCg!0E#so-2eap literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-hard_95_ffffff_1x100.png b/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-hard_95_ffffff_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..045ddf5c9c0046ddd43a6b17de645d47cad3ff88 GIT binary patch literal 98 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l%}VPV~E7m+9=V`FQ3 w=xShOWMuI7|9^SwZVuI+o}T7|@>>)bWR=7YE44g)2Gqph>FVdQ&MBb@0E!|UP5=M^ literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-soft_80_e0e0e0_1x100.png b/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_highlight-soft_80_e0e0e0_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..40ac3b9c516ddfcbe622eb829c4da8c06e889efc GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l(wgfV~E7mO&!kw literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_inset-hard_65_ffffff_1x100.png b/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-bg_inset-hard_65_ffffff_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b2f9d983487c8257b9d79a33c0356b8ff456d6 GIT binary patch literal 93 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l!~W|V~E7mS{Ou}E*`%9 zKPdOkfrN+ZlHSt7(uY{3{#;wiJb&Ugx1>W4qtrSDm(4hFaaY-$3p3x|sIU3`%J?Qj YcLn#R=pC)AfTl5cy85}Sb4q9e0MP_2(*OVf literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-icons_8f8f8f_256x240.png b/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-icons_8f8f8f_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..a47d6131a9cd13b726c80618e133cd5a5a15e1f0 GIT binary patch literal 4369 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-icons_97baed_256x240.png b/public/javascripts/jquery-ui-1.8.11.custom/css/custom-theme/images/ui-icons_97baed_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..04511769917277d442ae9cdd5f92bd3bed72cad4 GIT binary patch literal 4369 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 + + + + jQuery UI Accordion - Collapse content + + + + + + + + + + +
    + +
    +

    Section 1

    +
    +

    Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.

    +
    +

    Section 2

    +
    +

    Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna.

    +
    +

    Section 3

    +
    +

    Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.

    +
      +
    • List item one
    • +
    • List item two
    • +
    • List item three
    • +
    +
    +

    Section 4

    +
    +

    Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est.

    Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

    +
    +
    + +
    + + + +
    +

    By default, accordions always keep one section open. To allow for all sections to be be collapsible, set the collapsible option to true. Click on the currently open section to collapse its content pane.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/custom-icons.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/custom-icons.html new file mode 100644 index 00000000000..390b5dd052d --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/custom-icons.html @@ -0,0 +1,69 @@ + + + + + jQuery UI Accordion - Customize icons + + + + + + + + + + + +
    + +
    +

    Section 1

    +
    +

    Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.

    +
    +

    Section 2

    +
    +

    Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna.

    +
    +

    Section 3

    +
    +

    Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.

    +
      +
    • List item one
    • +
    • List item two
    • +
    • List item three
    • +
    +
    +

    Section 4

    +
    +

    Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est.

    Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

    +
    +
    + + + +
    + + + +
    +

    Customize the header icons with the icons option, which accepts classes for the header's default and selected (open) state. Use any class from the UI CSS framework, or create custom classes with background images.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/default.html new file mode 100644 index 00000000000..e24a5863360 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/default.html @@ -0,0 +1,85 @@ + + + + + jQuery UI Accordion - Default functionality + + + + + + + + + + +
    + +
    +

    Section 1

    +
    +

    + Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer + ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit + amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut + odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate. +

    +
    +

    Section 2

    +
    +

    + Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet + purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor + velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In + suscipit faucibus urna. +

    +
    +

    Section 3

    +
    +

    + Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. + Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero + ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis + lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. +

    +
      +
    • List item one
    • +
    • List item two
    • +
    • List item three
    • +
    +
    +

    Section 4

    +
    +

    + Cras dictum. Pellentesque habitant morbi tristique senectus et netus + et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in + faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia + mauris vel est. +

    +

    + Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. + Class aptent taciti sociosqu ad litora torquent per conubia nostra, per + inceptos himenaeos. +

    +
    +
    + +
    + +
    +

    +Click headers to expand/collapse content that is broken into logical sections, much like tabs. +Optionally, toggle sections open/closed on mouseover. +

    +

    +The underlying HTML markup is a series of headers (H3 tags) and content divs so the content is +usable without JavaScript. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/fillspace.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/fillspace.html new file mode 100644 index 00000000000..ffbf8299e34 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/fillspace.html @@ -0,0 +1,76 @@ + + + + + jQuery UI Accordion - Fill space + + + + + + + + + + + + +
    + +

    Resize the outer container:

    + +
    + +
    +

    Section 1

    +
    +

    Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.

    +
    +

    Section 2

    +
    +

    Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna.

    +
    +

    Section 3

    +
    +

    Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.

    +
      +
    • List item one
    • +
    • List item two
    • +
    • List item three
    • +
    +
    +

    Section 4

    +
    +

    Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est.

    Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

    +
    +
    + + +
    + +
    I'm another panel
    + +
    + + + +
    +

    Because the accordion is comprised of block-level elements, by default its width fills the available horizontal space. To fill the vertical space allocated by its container, set the boolean fillSpace option to true, and the script will automatically set the dimensions of the accordion to the height of its parent container. The accordion will also resize with its container if the container is resizable.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/hoverintent.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/hoverintent.html new file mode 100644 index 00000000000..570be752d3d --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/hoverintent.html @@ -0,0 +1,134 @@ + + + + + jQuery UI Accordion - Open on hoverintent + + + + + + + + + + +
    + +
    +

    Section 1

    +
    +

    + Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer + ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit + amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut + odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate. +

    +
    +

    Section 2

    +
    +

    + Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet + purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor + velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In + suscipit faucibus urna. +

    +
    +

    Section 3

    +
    +

    + Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. + Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero + ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis + lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui. +

    +
      +
    • List item one
    • +
    • List item two
    • +
    • List item three
    • +
    +
    +

    Section 4

    +
    +

    + Cras dictum. Pellentesque habitant morbi tristique senectus et netus + et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in + faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia + mauris vel est. +

    +

    + Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. + Class aptent taciti sociosqu ad litora torquent per conubia nostra, per + inceptos himenaeos. +

    +
    +
    + +
    + +
    +

    +Click headers to expand/collapse content that is broken into logical sections, much like tabs. +Optionally, toggle sections open/closed on mouseover. +

    +

    +The underlying HTML markup is a series of headers (H3 tags) and content divs so the content is +usable without JavaScript. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/index.html new file mode 100644 index 00000000000..d107dd881d4 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/index.html @@ -0,0 +1,25 @@ + + + + + jQuery UI Accordion Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/mouseover.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/mouseover.html new file mode 100644 index 00000000000..d2cc7dbc0f1 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/mouseover.html @@ -0,0 +1,57 @@ + + + + + jQuery UI Accordion - Open on mouseover + + + + + + + + + + +
    + +
    +

    Section 1

    +
    +

    Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.

    +
    +

    Section 2

    +
    +

    Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna.

    +
    +

    Section 3

    +
    +

    Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.

    +
      +
    • List item one
    • +
    • List item two
    • +
    • List item three
    • +
    +
    +

    Section 4

    +
    +

    Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est.

    Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

    +
    +
    + +
    + + + +
    +

    Toggle sections open/closed on mouseover with the event option. The default value for event is "click."

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/no-auto-height.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/no-auto-height.html new file mode 100644 index 00000000000..204869253b8 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/no-auto-height.html @@ -0,0 +1,60 @@ + + + + + jQuery UI Accordion - No auto height + + + + + + + + + + +
    + +
    +

    Section 1

    +
    +

    Mauris mauris ante, blandit et, ultrices a, susceros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.

    +
    +

    Section 2

    +
    +

    Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna.

    +
    +

    Section 3

    +
    +

    Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.

    +
      +
    • List item
    • +
    • List item
    • +
    • List item
    • +
    • List item
    • +
    • List item
    • +
    • List item
    • +
    • List item
    • +
    + Link to other content +
    +
    + +
    + + + +
    +

    Setting autoHeight: false allows to accordion panels to keep their native height.

    +

    In addition, the navigation option is enabled, opening the panel based on the current location, eg. no-auto-height.html#panel2 would open the second panel on page load. It also finds anchors within the content, so #othercontent will open the third section, as it contains a link with that href.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/sortable.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/sortable.html new file mode 100644 index 00000000000..1bfce6fe190 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/accordion/sortable.html @@ -0,0 +1,83 @@ + + + + + jQuery UI Accordion - Sortable + + + + + + + + + + + + +
    + +
    +
    +

    Section 1

    +
    +

    Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.

    +
    +
    +
    +

    Section 2

    +
    +

    Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In suscipit faucibus urna.

    +
    +
    +
    +

    Section 3

    +
    +

    Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis. Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.

    +
      +
    • List item one
    • +
    • List item two
    • +
    • List item three
    • +
    +
    +
    +
    +

    Section 4

    +
    +

    Cras dictum. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia mauris vel est.

    Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.

    +
    +
    +
    + +
    + + + +
    +

    Drag the header to re-order panels.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/addClass/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/addClass/default.html new file mode 100644 index 00000000000..73502d6fb55 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/addClass/default.html @@ -0,0 +1,52 @@ + + + + + jQuery UI Effects - addClass demo + + + + + + + + + +
    + +
    +
    + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. +
    +
    + +Run Effect + +
    + + + +
    +

    This demo adds a class which animates: text-indent, letter-spacing, width, height, padding, margin, and font-size.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/addClass/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/addClass/index.html new file mode 100644 index 00000000000..f5bd6a0e424 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/addClass/index.html @@ -0,0 +1,18 @@ + + + + + jQuery UI Effects Demos + + + + +
    +

    Examples

    + +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/animate/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/animate/default.html new file mode 100644 index 00000000000..284f0fe4f16 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/animate/default.html @@ -0,0 +1,61 @@ + + + + + jQuery UI Effects - Animate demo + + + + + + + + + +
    + +
    +
    +

    Animate

    +

    + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. +

    +
    +
    + +Toggle Effect + +
    + + + +
    +

    Click the button above to preview the effect.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/animate/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/animate/index.html new file mode 100644 index 00000000000..f5bd6a0e424 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/animate/index.html @@ -0,0 +1,18 @@ + + + + + jQuery UI Effects Demos + + + + +
    +

    Examples

    + +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/categories.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/categories.html new file mode 100644 index 00000000000..28f3ef18f1e --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/categories.html @@ -0,0 +1,71 @@ + + + + + jQuery UI Autocomplete - Categories + + + + + + + + + + + + + +
    + + +
    + + + +
    +

    A categorized search result. Try typing "a" or "n".

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/combobox.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/combobox.html new file mode 100644 index 00000000000..e4f7ca06f45 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/combobox.html @@ -0,0 +1,171 @@ + + + + + jQuery UI Autocomplete - Combobox + + + + + + + + + + + + + +
    + +
    + + +
    + + +
    + + + +
    +

    A custom widget built by composition of Autocomplete and Button. You can either type something into the field to get filtered suggestions based on your input, or use the button to get the full list of selections.

    +

    The input is read from an existing select-element for progressive enhancement, passed to Autocomplete with a customized source-option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/custom-data.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/custom-data.html new file mode 100644 index 00000000000..d619a4f81de --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/custom-data.html @@ -0,0 +1,95 @@ + + + + + jQuery UI Autocomplete - Custom data and display + + + + + + + + + + + + +
    +
    Select a project (type "j" for a start):
    + + + +

    +
    + + + +
    +

    You can use your own custom data formats and displays by simply overriding the default focus and select actions.

    +

    Try typing "j" to get a list of projects or just press the down arrow.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/default.html new file mode 100644 index 00000000000..16ec893d4c0 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/default.html @@ -0,0 +1,64 @@ + + + + + jQuery UI Autocomplete - Default functionality + + + + + + + + + + + +
    + +
    + + +
    + +
    + + + +
    +

    The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are tags for programming languages, give "ja" (for Java or JavaScript) a try.

    +

    The datasource is a simple JavaScript array, provided to the widget using the source-option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/folding.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/folding.html new file mode 100644 index 00000000000..688db3356d5 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/folding.html @@ -0,0 +1,62 @@ + + + + + jQuery UI Autocomplete - Accent folding + + + + + + + + + + + +
    + +
    +
    + + +
    +
    + +
    + + + +
    +

    The autocomplete field uses a custom source option which will match results that have accented characters even when the text field doesn't contain accented characters. However if the you type in accented characters in the text field it is smart enough not to show results that aren't accented.

    +

    Try typing "Jo" to see "John" and "Jörn", then type "Jö" to see only "Jörn".

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/jquery_32x32.png b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/jquery_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..9312f02d5d396d168510e17e1faedf864f2859b0 GIT binary patch literal 1417 zcmV;41$O$0P)D4i_N~79S57A`TcKK!UD9hqOY5vkep+4;dmsgt0@2wn2rm3=iMS9OB^)$J4jCdV zRdYdvutbWu5E>;gV1YDfj4@(`KY^?#OlB1)HVzdYHf@t2Jyb)7wJA_+6(%$@Wr#X; zofs@V4;LXicAgL&C_{*~CQD`^KUP42trsgh5gsWnTzo1~ZV??Q6(=J}UEn0apWr!zDXDwKF7%DpxAT30Sxe^~MC{SxQY>_HbZY)=J5+E!q zRdOFYQX@rPK7FYqMqepVZ9|B+DpGF@6dO2km@Qd&8!*vf~`4nnk!Us8ZbjWdZiH@C>}UW8ZkpdhqgCxl^{P>8#6{2Ej}49K{s!d6(%(? zV1gq=TtI@aEm(LE948MMBsXxDK!dP2Zwmdww`no zxJ(^R1Iqtgd?N(u)o#<=^8uVytZ#@jk@$d}dU*pGozn$22*Ra$DFdR(Q7a*!LA%a? ztcMe8*JTrc=pDET0zhrv(qUUYg0@cr$$(Z-amAPbJI3aw`blBZ0d`z-I5|bYNU-80 zfx{(Z2KY{*RFD!Tx3MSe*CS$vA10W&+5PgdVEH@~yU^UVy7jOqMhurIOkDn0kHtr~ z59vQ%bW}|otWb6@=s7|sr9-98H1$Q;Kj)ib;2W8i;)%443MRb z8Ox0;bdlPjRjITLU}y)yI^hfs&*C0r<)%zU&h*uJ@uI}^TvxeSbfXeixiWoc8q(mK zv_?NSYraP0l`r7>tM%Jn{D?(STCPfVyT$35bu2+fD#DesYo<5_%zeYXxdGRunm)mTyN=_kv z^_nK?FO*<>^Vav>`{WNFKY4uqf|y1Y3z1*TzW?}H_KVavv0O9-5kio1!oQna|37~L X(@&ZhOk=J^00000NkvXXu0mjf6(|YA literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/jqueryui_32x32.png b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/jqueryui_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e003d16c140584603cfc97a1f151faa99a0d62f7 GIT binary patch literal 1193 zcmV;a1XlZrP)qGdt^MrY9%O%k91A zbI!Tv-g|WOrdf3IG|PVokQ}nbCYx-^zfw^#+hkFa**JhrlIP7Mr*W+w>-WClSP@_kUFmLz!sE$LA|i=cN3k1k6I%jGvDu0P2zhXoOsOe-7Tu z!+~7Xdk`}5{G!2Kb>7)j|>g`ToU5T>A;vFX8%S{ML!4MW~t}MNer}6m$0c z#~PsTEb83qN=?)F$jN=$w4q<{VF7%}09m5E;Q@( zgy;KIu0vxHuJ<em#j=1=TZ>04#R7xX{(NFAE_-js0*5uZl4l?#J<05RuiJCzy%D z52CjniE_$MC9Y<&PQP`HHA{>GBnO*wTXuVy6%iqRL^JW@XGoOMD6Vv%s~)FAxX_BB zJ|xPGemWCs8bd-fVA#Bj(d(iDVnHZ-HpvL{yHE|HX)y-6@sDH#UvK9n8;H3d7P@ws z7v7m|cQ6e=clVNeJs0+x;y1Ry-DzHp-_NBm9vwu-PWaQQ{M7xA2ybsR-)SET-!l-G9``%w+eDx6rH4hFpaob|G%lUaq?X%LL&q!+s z6OTqvYm|&~m*e;#cbux@`#t6@E6B7$fE0ZZ#o=R^IScchlI*tHs8S}^*%5{x7EyBEK6mz_1)dc}3N;_=?`Lc7Q;G|n1@m(~ zIXM;^Z%-IwQ*RwvjAWA-Z4dEC>4S{gCFWr4|L;wwy?y@^4qE3x1s=k^00000NkvXX Hu0mjfdHXk) literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/sizzlejs_32x32.png b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/sizzlejs_32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce0704d1858987f2801f9a302107be004c5eb15 GIT binary patch literal 999 zcmV2PA=hRW&FQh7rqDd4_pj1@I!IX$>u|ZS>PKB9IT zd#l;!<}Ei3ZW`SjaMR@G9XIc~IkesJ_uTY$fycVr**cH4cJEo9XKb@5HbDJTKA1&L zF>4Y@5^GH~%W6<$`(5$A8+J`wSR+!cPK8#C^bx=cpH9=3J!FKE>UrLt7H_8cdR)Jr zjLXw8YeaK}?*N^xRL1hSAIT!s)KkXM_OUMj{ioTznfS>(WF3_SF%$oGF1!^axE656&ZT zB@+!6C}(q(0j{-mmd&xbm$SRV>vwX;mn;i)qMIfrh|9z{a|wStoMHG75iCMQ?47h6 z2D|_a4bgUjnpy(=N8OU22oO_EI@og<63Eg8)bC;N9N-;baFC{YGSXNQL*z|_UCFFT zgpcPAekohnIBE^YIeNJvDSgTe~DWM4f*#;L4 literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/ui-anim_basic_16x16.gif b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/images/ui-anim_basic_16x16.gif new file mode 100644 index 0000000000000000000000000000000000000000..084ecb879b9900663322beff5d735b8d225022b4 GIT binary patch literal 1459 zcmZvbdrVVz6vuzJ+)HoU3%#wi+;+%rOJ!vNECm#Gj}}^J8E6Zl6{jnTpiDO$I@rQo zTiy?~GG(CXplCvv5?;P#X-h%s-013tfTG3B1$AL$ZoZObE1D*1_V4c`=W{;4?>Wip zr1+)TIKaUJCb)3nLQ_*yOiaw=qF!qFketMoIjjxu+*ELIq3^F;|~!D}xJWooB?$cBKq{?z$?hNo|cNFAPo` zO&OTQC}y}+m@%P=WhA$rVnnh{7SX(PoVYv)TAFz|#t}bjGsZt@H(&cIJk_o%TK$P8 z&W+_ANA|oaG-UsCh~PsE`m$&m=VJlYpSd>1NRj}UnXH$GV0woD@cLQj6Rf^=McCnB zg+*<5$0ufhHcqTUQ*f2Fs7ya!*`Tg8=_L@pu5UEdC?Ry0lRXBRtnC}?^b)ls@VafK zO%*|@Ha-=PlK$X9<|fzB!opOt@XO$X`Jt~6aj!psv%Ex;MJIGlWF>?xz2uIpJiAKi zUU(I#D$IsD3p&`sc{@Nbp8*)XG|-*Sjba<3B*P`0w9?g%FRbS|WtQ;(0x-bSj(V~G z?4Y5JcE!V7`lxm!L-?}b+%G>94EO7IpV&3_4tR)Wogv4hEE$zEEmhH_5p^s$wHroE z_p-^!FhfOEG0*xDLq_h$1t?7264baJFYhw2^8Bu3sI^Uzy^-#PG;NcZMrou5t1a~!Fx&L zqTF*i=y!*63|dySwPRn6=THf65kfW}3iGuN^tGOo+2(TI1ubJI`x>N2qH}6(;WgLl z#tqoCOiY-u4SJrP5{p%@gmkIg(nPtn9%DBmp{~1FXHu%CKrikbOKtgyB*o)S8D6y^ zd?Z02c4RIuOX!iQ^4JKKth?L+w!SSv^kMTOXQ2;*||OP8`L)bqdZ6=hG3znjBdyouQC- z2{|0(#LB*c*Y@m8w%x8e$)!>@aePd#Gz1{;x;$GLm$RD-;+&E4OTfN^l#oYz+pl{9 ztGltv^dIhTL5CU(YkuB>N{G0Dv}w(IDcts{ZL`6#^nPt?i$=m{D23_}=zdLGKobnbKO&IVDbBU4*Z5%!iq zwd4gy;B|a{6z_Y3ZCGELzjfi*#NXQob_F!etMeQXTP?>q_esTGgPMt!lYSi3Dk%lV zFj`-5x050$NZ}(6i)}hQkYTlvY8Qp-Z!otT;M%|JB!Kwrq1mAuVh-s8J`2(Z^xnPt zR!4ECmU?MGIlsK8xxEj(F5}*c?K-Fx9TCTsJOoyoO->S0t0Ql}USDv~FFZ_3wlL+k zE`6{8Ds$jwATl0?qVdNe@X*G7G+tihnA%zLE@dA$P0U95A6u*S^xk5 literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/index.html new file mode 100644 index 00000000000..77f801996d3 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/index.html @@ -0,0 +1,27 @@ + + + + + jQuery UI Autocomplete Demos + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/london.xml b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/london.xml new file mode 100644 index 00000000000..26285499816 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/london.xml @@ -0,0 +1,114 @@ + + +6987 + +London +51.5084152563931 +-0.125532746315002 +2643743 +GB +United Kingdom + +P +PPLC + + +London +42.983389283 +-81.233042387 +6058560 +CA +Canada + +P +PPL + + +East London +-33.0152850934643 +27.9116249084473 +1006984 +ZA +South Africa + +P +PPL + + +City +51.5133363996235 +-0.0890064239501953 +2643744 +GB +United Kingdom + +A +ADM2 + + +London +37.1289771 +-84.0832646 +4298960 +US +United States + +P +PPL + + +The Tower of London +51.5082349601834 +-0.0763034820556641 +6286786 +GB +United Kingdom + +S +CSTL + + +London Reefs +8.85 +112.5333333 +1879967 + + + +U +RFSU + + +Greater London +51.5 +-0.1666667 +2648110 +GB +United Kingdom + +A +ADM2 + + +London +46.1666667 +6.0166667 +2661811 +CH +Switzerland + +H +STM + + +London Borough of Islington +51.5333333 +-0.1333333 +3333156 +GB +United Kingdom + +A +ADM2 + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/maxheight.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/maxheight.html new file mode 100644 index 00000000000..fc0b4840c62 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/maxheight.html @@ -0,0 +1,79 @@ + + + + + jQuery UI Autocomplete - Scrollable results + + + + + + + + + + + + +
    + +
    + + +
    + +
    + + + +
    +

    When displaying a long list of options, you can simply set the max-height for the autocomplete menu to prevent the menu from growing too large. Try typing "a" or "s" above to get a long list of results that you can scroll through.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/multiple-remote.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/multiple-remote.html new file mode 100644 index 00000000000..c82188a94a1 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/multiple-remote.html @@ -0,0 +1,84 @@ + + + + + jQuery UI Autocomplete - Multiple, remote + + + + + + + + + + + + +
    + +
    + + +
    + +
    + + + +
    +

    Usage: Enter at least two characters to get bird name suggestions. Select a value to continue adding more names.

    +

    This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/multiple.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/multiple.html new file mode 100644 index 00000000000..954016d75a4 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/multiple.html @@ -0,0 +1,99 @@ + + + + + jQuery UI Autocomplete - Multiple values + + + + + + + + + + + +
    + +
    + + +
    + +
    + + + +
    +

    Usage: Type something, eg. "j" to see suggestions for tagging with programming languages. Select a value, then continue typing to add more.

    +

    This is an example showing how to use the source-option along with some events to enable autocompleting multiple values into a single field.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote-jsonp.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote-jsonp.html new file mode 100644 index 00000000000..04b44fd5c1b --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote-jsonp.html @@ -0,0 +1,86 @@ + + + + + jQuery UI Autocomplete - Remote JSONP datasource + + + + + + + + + + + + +
    + +
    + + + Powered by geonames.org +
    + +
    + Result: +
    +
    + +
    + + + +
    +

    The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are cities, displayed when at least two characters are entered into the field.

    +

    In this case, the datasource is the geonames.org webservice. While only the city name itself ends up in the input after selecting an element, more info is displayed in the suggestions to help find the right entry. That data is also available in callbacks, as illustrated by the Result area below the input.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote-with-cache.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote-with-cache.html new file mode 100644 index 00000000000..b1b7c8b3727 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote-with-cache.html @@ -0,0 +1,59 @@ + + + + + jQuery UI Autocomplete - Remote with caching + + + + + + + + + + + + +
    + +
    + + +
    + +
    + + + +
    +

    The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are bird names, displayed when at least two characters are entered into the field.

    +

    Similar to the remote datasource demo, though this adds some local caching to improve performance. The cache here saves just one query, and could be extended to cache multiple values, one for each term.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote.html new file mode 100644 index 00000000000..992a5867d7c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/remote.html @@ -0,0 +1,59 @@ + + + + + jQuery UI Autocomplete - Remote datasource + + + + + + + + + + + + +
    + +
    + + +
    + +
    + Result: +
    +
    + +
    + + + +
    +

    The Autocomplete widgets provides suggestions while you type into the field. Here the suggestions are bird names, displayed when at least two characters are entered into the field.

    +

    The datasource is a server-side script which returns JSON data, specified via a simple URL for the source-option. In addition, the minLength-option is set to 2 to avoid queries that would return too many results and the select-event is used to display some feedback.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/search.php b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/search.php new file mode 100644 index 00000000000..8fa9d28f818 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/search.php @@ -0,0 +1,640 @@ +"Botaurus stellaris", +"Little Grebe"=>"Tachybaptus ruficollis", +"Black-necked Grebe"=>"Podiceps nigricollis", +"Little Bittern"=>"Ixobrychus minutus", +"Black-crowned Night Heron"=>"Nycticorax nycticorax", +"Purple Heron"=>"Ardea purpurea", +"White Stork"=>"Ciconia ciconia", +"Spoonbill"=>"Platalea leucorodia", +"Red-crested Pochard"=>"Netta rufina", +"Common Eider"=>"Somateria mollissima", +"Red Kite"=>"Milvus milvus", +"Hen Harrier"=>"Circus cyaneus", +"Montagu`s Harrier"=>"Circus pygargus", +"Black Grouse"=>"Tetrao tetrix", +"Grey Partridge"=>"Perdix perdix", +"Spotted Crake"=>"Porzana porzana", +"Corncrake"=>"Crex crex", +"Common Crane"=>"Grus grus", +"Avocet"=>"Recurvirostra avosetta", +"Stone Curlew"=>"Burhinus oedicnemus", +"Common Ringed Plover"=>"Charadrius hiaticula", +"Kentish Plover"=>"Charadrius alexandrinus", +"Ruff"=>"Philomachus pugnax", +"Common Snipe"=>"Gallinago gallinago", +"Black-tailed Godwit"=>"Limosa limosa", +"Common Redshank"=>"Tringa totanus", +"Sandwich Tern"=>"Sterna sandvicensis", +"Common Tern"=>"Sterna hirundo", +"Arctic Tern"=>"Sterna paradisaea", +"Little Tern"=>"Sternula albifrons", +"Black Tern"=>"Chlidonias niger", +"Barn Owl"=>"Tyto alba", +"Little Owl"=>"Athene noctua", +"Short-eared Owl"=>"Asio flammeus", +"European Nightjar"=>"Caprimulgus europaeus", +"Common Kingfisher"=>"Alcedo atthis", +"Eurasian Hoopoe"=>"Upupa epops", +"Eurasian Wryneck"=>"Jynx torquilla", +"European Green Woodpecker"=>"Picus viridis", +"Crested Lark"=>"Galerida cristata", +"White-headed Duck"=>"Oxyura leucocephala", +"Pale-bellied Brent Goose"=>"Branta hrota", +"Tawny Pipit"=>"Anthus campestris", +"Whinchat"=>"Saxicola rubetra", +"European Stonechat"=>"Saxicola rubicola", +"Northern Wheatear"=>"Oenanthe oenanthe", +"Savi`s Warbler"=>"Locustella luscinioides", +"Sedge Warbler"=>"Acrocephalus schoenobaenus", +"Great Reed Warbler"=>"Acrocephalus arundinaceus", +"Bearded Reedling"=>"Panurus biarmicus", +"Red-backed Shrike"=>"Lanius collurio", +"Great Grey Shrike"=>"Lanius excubitor", +"Woodchat Shrike"=>"Lanius senator", +"Common Raven"=>"Corvus corax", +"Yellowhammer"=>"Emberiza citrinella", +"Ortolan Bunting"=>"Emberiza hortulana", +"Corn Bunting"=>"Emberiza calandra", +"Great Cormorant"=>"Phalacrocorax carbo", +"Hawfinch"=>"Coccothraustes coccothraustes", +"Common Shelduck"=>"Tadorna tadorna", +"Bluethroat"=>"Luscinia svecica", +"Grey Heron"=>"Ardea cinerea", +"Barn Swallow"=>"Hirundo rustica", +"Hooded Crow"=>"Corvus cornix", +"Dunlin"=>"Calidris alpina", +"Eurasian Pied Flycatcher"=>"Ficedula hypoleuca", +"Eurasian Nuthatch"=>"Sitta europaea", +"Short-toed Tree Creeper"=>"Certhia brachydactyla", +"Wood Lark"=>"Lullula arborea", +"Tree Pipit"=>"Anthus trivialis", +"Eurasian Hobby"=>"Falco subbuteo", +"Marsh Warbler"=>"Acrocephalus palustris", +"Wood Sandpiper"=>"Tringa glareola", +"Tawny Owl"=>"Strix aluco", +"Lesser Whitethroat"=>"Sylvia curruca", +"Barnacle Goose"=>"Branta leucopsis", +"Common Goldeneye"=>"Bucephala clangula", +"Western Marsh Harrier"=>"Circus aeruginosus", +"Common Buzzard"=>"Buteo buteo", +"Sanderling"=>"Calidris alba", +"Little Gull"=>"Larus minutus", +"Eurasian Magpie"=>"Pica pica", +"Willow Warbler"=>"Phylloscopus trochilus", +"Wood Warbler"=>"Phylloscopus sibilatrix", +"Great Crested Grebe"=>"Podiceps cristatus", +"Eurasian Jay"=>"Garrulus glandarius", +"Common Redstart"=>"Phoenicurus phoenicurus", +"Blue-headed Wagtail"=>"Motacilla flava", +"Common Swift"=>"Apus apus", +"Marsh Tit"=>"Poecile palustris", +"Goldcrest"=>"Regulus regulus", +"European Golden Plover"=>"Pluvialis apricaria", +"Eurasian Bullfinch"=>"Pyrrhula pyrrhula", +"Common Whitethroat"=>"Sylvia communis", +"Meadow Pipit"=>"Anthus pratensis", +"Greylag Goose"=>"Anser anser", +"Spotted Flycatcher"=>"Muscicapa striata", +"European Greenfinch"=>"Carduelis chloris", +"Common Greenshank"=>"Tringa nebularia", +"Great Spotted Woodpecker"=>"Dendrocopos major", +"Greater Canada Goose"=>"Branta canadensis", +"Mistle Thrush"=>"Turdus viscivorus", +"Great Black-backed Gull"=>"Larus marinus", +"Goosander"=>"Mergus merganser", +"Great Egret"=>"Casmerodius albus", +"Northern Goshawk"=>"Accipiter gentilis", +"Dunnock"=>"Prunella modularis", +"Stock Dove"=>"Columba oenas", +"Common Wood Pigeon"=>"Columba palumbus", +"Eurasian Woodcock"=>"Scolopax rusticola", +"House Sparrow"=>"Passer domesticus", +"Common House Martin"=>"Delichon urbicum", +"Red Knot"=>"Calidris canutus", +"Western Jackdaw"=>"Corvus monedula", +"Brambling"=>"Fringilla montifringilla", +"Northern Lapwing"=>"Vanellus vanellus", +"European Reed Warbler"=>"Acrocephalus scirpaceus", +"Lesser Black-backed Gull"=>"Larus fuscus", +"Little Egret"=>"Egretta garzetta", +"Little Stint"=>"Calidris minuta", +"Common Linnet"=>"Carduelis cannabina", +"Mute Swan"=>"Cygnus olor", +"Common Cuckoo"=>"Cuculus canorus", +"Black-headed Gull"=>"Larus ridibundus", +"Greater White-fronted Goose"=>"Anser albifrons", +"Great Tit"=>"Parus major", +"Redwing"=>"Turdus iliacus", +"Gadwall"=>"Anas strepera", +"Fieldfare"=>"Turdus pilaris", +"Tufted Duck"=>"Aythya fuligula", +"Crested Tit"=>"Lophophanes cristatus", +"Willow Tit"=>"Poecile montanus", +"Eurasian Coot"=>"Fulica atra", +"Common Blackbird"=>"Turdus merula", +"Smew"=>"Mergus albellus", +"Common Sandpiper"=>"Actitis hypoleucos", +"Sand Martin"=>"Riparia riparia", +"Purple Sandpiper"=>"Calidris maritima", +"Northern Pintail"=>"Anas acuta", +"Blue Tit"=>"Cyanistes caeruleus", +"European Goldfinch"=>"Carduelis carduelis", +"Eurasian Whimbrel"=>"Numenius phaeopus", +"Common Reed Bunting"=>"Emberiza schoeniclus", +"Eurasian Tree Sparrow"=>"Passer montanus", +"Rook"=>"Corvus frugilegus", +"European Robin"=>"Erithacus rubecula", +"Bar-tailed Godwit"=>"Limosa lapponica", +"Dark-bellied Brent Goose"=>"Branta bernicla", +"Eurasian Oystercatcher"=>"Haematopus ostralegus", +"Eurasian Siskin"=>"Carduelis spinus", +"Northern Shoveler"=>"Anas clypeata", +"Eurasian Wigeon"=>"Anas penelope", +"Eurasian Sparrow Hawk"=>"Accipiter nisus", +"Icterine Warbler"=>"Hippolais icterina", +"Common Starling"=>"Sturnus vulgaris", +"Long-tailed Tit"=>"Aegithalos caudatus", +"Ruddy Turnstone"=>"Arenaria interpres", +"Mew Gull"=>"Larus canus", +"Common Pochard"=>"Aythya ferina", +"Common Chiffchaff"=>"Phylloscopus collybita", +"Greater Scaup"=>"Aythya marila", +"Common Kestrel"=>"Falco tinnunculus", +"Garden Warbler"=>"Sylvia borin", +"Eurasian Collared Dove"=>"Streptopelia decaocto", +"Eurasian Skylark"=>"Alauda arvensis", +"Common Chaffinch"=>"Fringilla coelebs", +"Common Moorhen"=>"Gallinula chloropus", +"Water Pipit"=>"Anthus spinoletta", +"Mallard"=>"Anas platyrhynchos", +"Winter Wren"=>"Troglodytes troglodytes", +"Common Teal"=>"Anas crecca", +"Green Sandpiper"=>"Tringa ochropus", +"White Wagtail"=>"Motacilla alba", +"Eurasian Curlew"=>"Numenius arquata", +"Song Thrush"=>"Turdus philomelos", +"European Herring Gull"=>"Larus argentatus", +"Grey Plover"=>"Pluvialis squatarola", +"Carrion Crow"=>"Corvus corone", +"Coal Tit"=>"Periparus ater", +"Spotted Redshank"=>"Tringa erythropus", +"Blackcap"=>"Sylvia atricapilla", +"Egyptian Vulture"=>"Neophron percnopterus", +"Razorbill"=>"Alca torda", +"Alpine Swift"=>"Apus melba", +"Long-legged Buzzard"=>"Buteo rufinus", +"Audouin`s Gull"=>"Larus audouinii", +"Balearic Shearwater"=>"Puffinus mauretanicus", +"Upland Sandpiper"=>"Bartramia longicauda", +"Greater Spotted Eagle"=>"Aquila clanga", +"Ring Ouzel"=>"Turdus torquatus", +"Yellow-browed Warbler"=>"Phylloscopus inornatus", +"Blue Rock Thrush"=>"Monticola solitarius", +"Buff-breasted Sandpiper"=>"Tryngites subruficollis", +"Jack Snipe"=>"Lymnocryptes minimus", +"White-rumped Sandpiper"=>"Calidris fuscicollis", +"Ruddy Shelduck"=>"Tadorna ferruginea", +"Cetti's Warbler"=>"Cettia cetti", +"Citrine Wagtail"=>"Motacilla citreola", +"Roseate Tern"=>"Sterna dougallii", +"Black-legged Kittiwake"=>"Rissa tridactyla", +"Pygmy Cormorant"=>"Phalacrocorax pygmeus", +"Booted Eagle"=>"Aquila pennata", +"Lesser White-fronted Goose"=>"Anser erythropus", +"Little Bunting"=>"Emberiza pusilla", +"Eleonora's Falcon"=>"Falco eleonorae", +"European Serin"=>"Serinus serinus", +"Twite"=>"Carduelis flavirostris", +"Yellow-legged Gull"=>"Larus michahellis", +"Gyr Falcon"=>"Falco rusticolus", +"Greenish Warbler"=>"Phylloscopus trochiloides", +"Red-necked Phalarope"=>"Phalaropus lobatus", +"Mealy Redpoll"=>"Carduelis flammea", +"Glaucous Gull"=>"Larus hyperboreus", +"Great Skua"=>"Stercorarius skua", +"Great Bustard"=>"Otis tarda", +"Velvet Scoter"=>"Melanitta fusca", +"Pine Grosbeak"=>"Pinicola enucleator", +"House Crow"=>"Corvus splendens", +"Hume`s Leaf Warbler"=>"Phylloscopus humei", +"Great Northern Loon"=>"Gavia immer", +"Long-tailed Duck"=>"Clangula hyemalis", +"Lapland Longspur"=>"Calcarius lapponicus", +"Northern Gannet"=>"Morus bassanus", +"Eastern Imperial Eagle"=>"Aquila heliaca", +"Little Auk"=>"Alle alle", +"Lesser Spotted Woodpecker"=>"Dendrocopos minor", +"Iceland Gull"=>"Larus glaucoides", +"Parasitic Jaeger"=>"Stercorarius parasiticus", +"Bewick`s Swan"=>"Cygnus bewickii", +"Little Bustard"=>"Tetrax tetrax", +"Little Crake"=>"Porzana parva", +"Baillon`s Crake"=>"Porzana pusilla", +"Long-tailed Jaeger"=>"Stercorarius longicaudus", +"King Eider"=>"Somateria spectabilis", +"Greater Short-toed Lark"=>"Calandrella brachydactyla", +"Houbara Bustard"=>"Chlamydotis undulata", +"Curlew Sandpiper"=>"Calidris ferruginea", +"Common Crossbill"=>"Loxia curvirostra", +"European Shag"=>"Phalacrocorax aristotelis", +"Horned Grebe"=>"Podiceps auritus", +"Common Quail"=>"Coturnix coturnix", +"Bearded Vulture"=>"Gypaetus barbatus", +"Lanner Falcon"=>"Falco biarmicus", +"Middle Spotted Woodpecker"=>"Dendrocopos medius", +"Pomarine Jaeger"=>"Stercorarius pomarinus", +"Red-breasted Merganser"=>"Mergus serrator", +"Eurasian Black Vulture"=>"Aegypius monachus", +"Eurasian Dotterel"=>"Charadrius morinellus", +"Common Nightingale"=>"Luscinia megarhynchos", +"Northern willow warbler"=>"Phylloscopus trochilus acredula", +"Manx Shearwater"=>"Puffinus puffinus", +"Northern Fulmar"=>"Fulmarus glacialis", +"Eurasian Eagle Owl"=>"Bubo bubo", +"Orphean Warbler"=>"Sylvia hortensis", +"Melodious Warbler"=>"Hippolais polyglotta", +"Pallas's Leaf Warbler"=>"Phylloscopus proregulus", +"Atlantic Puffin"=>"Fratercula arctica", +"Black-throated Loon"=>"Gavia arctica", +"Bohemian Waxwing"=>"Bombycilla garrulus", +"Marsh Sandpiper"=>"Tringa stagnatilis", +"Great Snipe"=>"Gallinago media", +"Squacco Heron"=>"Ardeola ralloides", +"Long-eared Owl"=>"Asio otus", +"Caspian Tern"=>"Hydroprogne caspia", +"Red-breasted Goose"=>"Branta ruficollis", +"Red-throated Loon"=>"Gavia stellata", +"Common Rosefinch"=>"Carpodacus erythrinus", +"Red-footed Falcon"=>"Falco vespertinus", +"Ross's Goose"=>"Anser rossii", +"Red Phalarope"=>"Phalaropus fulicarius", +"Pied Wagtail"=>"Motacilla yarrellii", +"Rose-coloured Starling"=>"Sturnus roseus", +"Rough-legged Buzzard"=>"Buteo lagopus", +"Saker Falcon"=>"Falco cherrug", +"European Roller"=>"Coracias garrulus", +"Short-toed Eagle"=>"Circaetus gallicus", +"Peregrine Falcon"=>"Falco peregrinus", +"Merlin"=>"Falco columbarius", +"Snow Goose"=>"Anser caerulescens", +"Snowy Owl"=>"Bubo scandiacus", +"Snow Bunting"=>"Plectrophenax nivalis", +"Common Grasshopper Warbler"=>"Locustella naevia", +"Golden Eagle"=>"Aquila chrysaetos", +"Black-winged Stilt"=>"Himantopus himantopus", +"Steppe Eagle"=>"Aquila nipalensis", +"Pallid Harrier"=>"Circus macrourus", +"European Storm-petrel"=>"Hydrobates pelagicus", +"Horned Lark"=>"Eremophila alpestris", +"Eurasian Treecreeper"=>"Certhia familiaris", +"Taiga Bean Goose"=>"Anser fabalis", +"Temminck`s Stint"=>"Calidris temminckii", +"Terek Sandpiper"=>"Xenus cinereus", +"Tundra Bean Goose"=>"Anser serrirostris", +"European Turtle Dove"=>"Streptopelia turtur", +"Leach`s Storm-petrel"=>"Oceanodroma leucorhoa", +"Eurasian Griffon Vulture"=>"Gyps fulvus", +"Paddyfield Warbler"=>"Acrocephalus agricola", +"Osprey"=>"Pandion haliaetus", +"Firecrest"=>"Regulus ignicapilla", +"Water Rail"=>"Rallus aquaticus", +"European Honey Buzzard"=>"Pernis apivorus", +"Eurasian Golden Oriole"=>"Oriolus oriolus", +"Whooper Swan"=>"Cygnus cygnus", +"Two-barred Crossbill"=>"Loxia leucoptera", +"White-tailed Eagle"=>"Haliaeetus albicilla", +"Atlantic Murre"=>"Uria aalge", +"Garganey"=>"Anas querquedula", +"Black Redstart"=>"Phoenicurus ochruros", +"Common Scoter"=>"Melanitta nigra", +"Rock Pipit"=>"Anthus petrosus", +"Lesser Spotted Eagle"=>"Aquila pomarina", +"Cattle Egret"=>"Bubulcus ibis", +"White-winged Black Tern"=>"Chlidonias leucopterus", +"Black Stork"=>"Ciconia nigra", +"Mediterranean Gull"=>"Larus melanocephalus", +"Black Kite"=>"Milvus migrans", +"Yellow Wagtail"=>"Motacilla flavissima", +"Red-necked Grebe"=>"Podiceps grisegena", +"Gull-billed Tern"=>"Gelochelidon nilotica", +"Pectoral Sandpiper"=>"Calidris melanotos", +"Barred Warbler"=>"Sylvia nisoria", +"Red-throated Pipit"=>"Anthus cervinus", +"Grey Wagtail"=>"Motacilla cinerea", +"Richard`s Pipit"=>"Anthus richardi", +"Black Woodpecker"=>"Dryocopus martius", +"Little Ringed Plover"=>"Charadrius dubius", +"Whiskered Tern"=>"Chlidonias hybrida", +"Lesser Redpoll"=>"Carduelis cabaret", +"Pallas' Bunting"=>"Emberiza pallasi", +"Ferruginous Duck"=>"Aythya nyroca", +"Whistling Swan"=>"Cygnus columbianus", +"Black Brant"=>"Branta nigricans", +"Marbled Teal"=>"Marmaronetta angustirostris", +"Canvasback"=>"Aythya valisineria", +"Redhead"=>"Aythya americana", +"Lesser Scaup"=>"Aythya affinis", +"Steller`s Eider"=>"Polysticta stelleri", +"Spectacled Eider"=>"Somateria fischeri", +"Harlequin Duck"=>"Histronicus histrionicus", +"Black Scoter"=>"Melanitta americana", +"Surf Scoter"=>"Melanitta perspicillata", +"Barrow`s Goldeneye"=>"Bucephala islandica", +"Falcated Duck"=>"Anas falcata", +"American Wigeon"=>"Anas americana", +"Blue-winged Teal"=>"Anas discors", +"American Black Duck"=>"Anas rubripes", +"Baikal Teal"=>"Anas formosa", +"Green-Winged Teal"=>"Anas carolinensis", +"Hazel Grouse"=>"Bonasa bonasia", +"Rock Partridge"=>"Alectoris graeca", +"Red-legged Partridge"=>"Alectoris rufa", +"Yellow-billed Loon"=>"Gavia adamsii", +"Cory`s Shearwater"=>"Calonectris borealis", +"Madeiran Storm-Petrel"=>"Oceanodroma castro", +"Great White Pelican"=>"Pelecanus onocrotalus", +"Dalmatian Pelican"=>"Pelecanus crispus", +"American Bittern"=>"Botaurus lentiginosus", +"Glossy Ibis"=>"Plegadis falcinellus", +"Spanish Imperial Eagle"=>"Aquila adalberti", +"Lesser Kestrel"=>"Falco naumanni", +"Houbara Bustard"=>"Chlamydotis undulata", +"Crab-Plover"=>"Dromas ardeola", +"Cream-coloured Courser"=>"Cursorius cursor", +"Collared Pratincole"=>"Glareola pratincola", +"Black-winged Pratincole"=>"Glareola nordmanni", +"Killdeer"=>"Charadrius vociferus", +"Lesser Sand Plover"=>"Charadrius mongolus", +"Greater Sand Plover"=>"Charadrius leschenaultii", +"Caspian Plover"=>"Charadrius asiaticus", +"American Golden Plover"=>"Pluvialis dominica", +"Pacific Golden Plover"=>"Pluvialis fulva", +"Sharp-tailed Sandpiper"=>"Calidris acuminata", +"Broad-billed Sandpiper"=>"Limicola falcinellus", +"Spoon-Billed Sandpiper"=>"Eurynorhynchus pygmaeus", +"Short-Billed Dowitcher"=>"Limnodromus griseus", +"Long-billed Dowitcher"=>"Limnodromus scolopaceus", +"Hudsonian Godwit"=>"Limosa haemastica", +"Little Curlew"=>"Numenius minutus", +"Lesser Yellowlegs"=>"Tringa flavipes", +"Wilson`s Phalarope"=>"Phalaropus tricolor", +"Pallas`s Gull"=>"Larus ichthyaetus", +"Laughing Gull"=>"Larus atricilla", +"Franklin`s Gull"=>"Larus pipixcan", +"Bonaparte`s Gull"=>"Larus philadelphia", +"Ring-billed Gull"=>"Larus delawarensis", +"American Herring Gull"=>"Larus smithsonianus", +"Caspian Gull"=>"Larus cachinnans", +"Ivory Gull"=>"Pagophila eburnea", +"Royal Tern"=>"Sterna maxima", +"Brünnich`s Murre"=>"Uria lomvia", +"Crested Auklet"=>"Aethia cristatella", +"Parakeet Auklet"=>"Cyclorrhynchus psittacula", +"Tufted Puffin"=>"Lunda cirrhata", +"Laughing Dove"=>"Streptopelia senegalensis", +"Great Spotted Cuckoo"=>"Clamator glandarius", +"Great Grey Owl"=>"Strix nebulosa", +"Tengmalm`s Owl"=>"Aegolius funereus", +"Red-Necked Nightjar"=>"Caprimulgus ruficollis", +"Chimney Swift"=>"Chaetura pelagica", +"Green Bea-Eater"=>"Merops orientalis", +"Grey-headed Woodpecker"=>"Picus canus", +"Lesser Short-Toed Lark"=>"Calandrella rufescens", +"Eurasian Crag Martin"=>"Hirundo rupestris", +"Red-rumped Swallow"=>"Cecropis daurica", +"Blyth`s Pipit"=>"Anthus godlewskii", +"Pechora Pipit"=>"Anthus gustavi", +"Grey-headed Wagtail"=>"Motacilla thunbergi", +"Yellow-Headed Wagtail"=>"Motacilla lutea", +"White-throated Dipper"=>"Cinclus cinclus", +"Rufous-Tailed Scrub Robin"=>"Cercotrichas galactotes", +"Thrush Nightingale"=>"Luscinia luscinia", +"White-throated Robin"=>"Irania gutturalis", +"Caspian Stonechat"=>"Saxicola maura variegata", +"Western Black-eared Wheatear"=>"Oenanthe hispanica", +"Rufous-tailed Rock Thrush"=>"Monticola saxatilis", +"Red-throated Thrush/Black-throated"=>"Turdus ruficollis", +"American Robin"=>"Turdus migratorius", +"Zitting Cisticola"=>"Cisticola juncidis", +"Lanceolated Warbler"=>"Locustella lanceolata", +"River Warbler"=>"Locustella fluviatilis", +"Blyth`s Reed Warbler"=>"Acrocephalus dumetorum", +"Caspian Reed Warbler"=>"Acrocephalus fuscus", +"Aquatic Warbler"=>"Acrocephalus paludicola", +"Booted Warbler"=>"Acrocephalus caligatus", +"Marmora's Warbler"=>"Sylvia sarda", +"Dartford Warbler"=>"Sylvia undata", +"Subalpine Warbler"=>"Sylvia cantillans", +"Ménétries's Warbler"=>"Sylvia mystacea", +"Rüppel's Warbler"=>"Sylvia rueppelli", +"Asian Desert Warbler"=>"Sylvia nana", +"Western Orphean Warbler"=>"Sylvia hortensis hortensis", +"Arctic Warbler"=>"Phylloscopus borealis", +"Radde`s Warbler"=>"Phylloscopus schwarzi", +"Western Bonelli`s Warbler"=>"Phylloscopus bonelli", +"Red-breasted Flycatcher"=>"Ficedula parva", +"Eurasian Penduline Tit"=>"Remiz pendulinus", +"Daurian Shrike"=>"Lanius isabellinus", +"Long-Tailed Shrike"=>"Lanius schach", +"Lesser Grey Shrike"=>"Lanius minor", +"Southern Grey Shrike"=>"Lanius meridionalis", +"Masked Shrike"=>"Lanius nubicus", +"Spotted Nutcracker"=>"Nucifraga caryocatactes", +"Daurian Jackdaw"=>"Corvus dauuricus", +"Purple-Backed Starling"=>"Sturnus sturninus", +"Red-Fronted Serin"=>"Serinus pusillus", +"Arctic Redpoll"=>"Carduelis hornemanni", +"Scottish Crossbill"=>"Loxia scotica", +"Parrot Crossbill"=>"Loxia pytyopsittacus", +"Black-faced Bunting"=>"Emberiza spodocephala", +"Pink-footed Goose"=>"Anser brachyrhynchus", +"Black-winged Kite"=>"Elanus caeruleus", +"European Bee-eater"=>"Merops apiaster", +"Sabine`s Gull"=>"Larus sabini", +"Sooty Shearwater"=>"Puffinus griseus", +"Lesser Canada Goose"=>"Branta hutchinsii", +"Ring-necked Duck"=>"Aythya collaris", +"Greater Flamingo"=>"Phoenicopterus roseus", +"Iberian Chiffchaff"=>"Phylloscopus ibericus", +"Ashy-headed Wagtail"=>"Motacilla cinereocapilla", +"Stilt Sandpiper"=>"Calidris himantopus", +"Siberian Stonechat"=>"Saxicola maurus", +"Greater Yellowlegs"=>"Tringa melanoleuca", +"Forster`s Tern"=>"Sterna forsteri", +"Dusky Warbler"=>"Phylloscopus fuscatus", +"Cirl Bunting"=>"Emberiza cirlus", +"Olive-backed Pipit"=>"Anthus hodgsoni", +"Sociable Lapwing"=>"Vanellus gregarius", +"Spotted Sandpiper"=>"Actitis macularius", +"Baird`s Sandpiper"=>"Calidris bairdii", +"Rustic Bunting"=>"Emberiza rustica", +"Yellow-browed Bunting"=>"Emberiza chrysophrys", +"Great Shearwater"=>"Puffinus gravis", +"Bonelli`s Eagle"=>"Aquila fasciata", +"Calandra Lark"=>"Melanocorypha calandra", +"Sardinian Warbler"=>"Sylvia melanocephala", +"Ross's Gull"=>"Larus roseus", +"Yellow-Breasted Bunting"=>"Emberiza aureola", +"Pine Bunting"=>"Emberiza leucocephalos", +"Black Guillemot"=>"Cepphus grylle", +"Pied-billed Grebe"=>"Podilymbus podiceps", +"Soft-plumaged Petrel"=>"Pterodroma mollis", +"Bulwer's Petrel"=>"Bulweria bulwerii", +"White-Faced Storm-Petrel"=>"Pelagodroma marina", +"Pallas’s Fish Eagle"=>"Haliaeetus leucoryphus", +"Sandhill Crane"=>"Grus canadensis", +"Macqueen’s Bustard"=>"Chlamydotis macqueenii", +"White-tailed Lapwing"=>"Vanellus leucurus", +"Great Knot"=>"Calidris tenuirostris", +"Semipalmated Sandpiper"=>"Calidris pusilla", +"Red-necked Stint"=>"Calidris ruficollis", +"Slender-billed Curlew"=>"Numenius tenuirostris", +"Bridled Tern"=>"Onychoprion anaethetus", +"Pallas’s Sandgrouse"=>"Syrrhaptes paradoxus", +"European Scops Owl"=>"Otus scops", +"Northern Hawk Owl"=>"Surnia ulula", +"White-Throated Needletail"=>"Hirundapus caudacutus", +"Belted Kingfisher"=>"Ceryle alcyon", +"Blue-cheeked Bee-eater"=>"Merops persicus", +"Black-headed Wagtail"=>"Motacilla feldegg", +"Northern Mockingbird"=>"Mimus polyglottos", +"Alpine Accentor"=>"Prunella collaris", +"Red-flanked Bluetail"=>"Tarsiger cyanurus", +"Isabelline Wheatear"=>"Oenanthe isabellina", +"Pied Wheatear"=>"Oenanthe pleschanka", +"Eastern Black-eared Wheatear"=>"Oenanthe melanoleuca", +"Desert Wheatear"=>"Oenanthe deserti", +"White`s Thrush"=>"Zoothera aurea", +"Siberian Thrush"=>"Zoothera sibirica", +"Eyebrowed Thrush"=>"Turdus obscurus", +"Dusky Thrush"=>"Turdus eunomus", +"Black-throated Thrush"=>"Turdus atrogularis", +"Pallas`s Grasshopper Warbler"=>"Locustella certhiola", +"Spectacled Warbler"=>"Sylvia conspicillata", +"Two-barred Warbler"=>"Phylloscopus plumbeitarsus", +"Eastern Bonelli’s Warbler"=>"Phylloscopus orientalis", +"Collared Flycatcher"=>"Ficedula albicollis", +"Wallcreeper"=>"Tichodroma muraria", +"Turkestan Shrike"=>"Lanius phoenicuroides", +"Steppe Grey Shrike"=>"Lanius pallidirostris", +"Spanish Sparrow"=>"Passer hispaniolensis", +"Red-eyed Vireo"=>"Vireo olivaceus", +"Myrtle Warbler"=>"Dendroica coronata", +"White-crowned Sparrow"=>"Zonotrichia leucophrys", +"White-throated Sparrow"=>"Zonotrichia albicollis", +"Cretzschmar`s Bunting"=>"Emberiza caesia", +"Chestnut Bunting"=>"Emberiza rutila", +"Red-headed Bunting"=>"Emberiza bruniceps", +"Black-headed Bunting"=>"Emberiza melanocephala", +"Indigo Bunting"=>"Passerina cyanea", +"Balearic Woodchat Shrike"=>"Lanius senator badius", +"Demoiselle Crane"=>"Grus virgo", +"Chough"=>"Pyrrhocorax pyrrhocorax", +"Red-Billed Chough"=>"Pyrrhocorax graculus", +"Elegant Tern"=>"Sterna elegans", +"Chukar"=>"Alectoris chukar", +"Yellow-Billed Cuckoo"=>"Coccyzus americanus", +"American Sandwich Tern"=>"Sterna sandvicensis acuflavida", +"Olive-Tree Warbler"=>"Hippolais olivetorum", +"Eastern Olivaceous Warbler"=>"Acrocephalus pallidus", +"Indian Cormorant"=>"Phalacrocorax fuscicollis", +"Spur-Winged Lapwing"=>"Vanellus spinosus", +"Yelkouan Shearwater"=>"Puffinus yelkouan", +"Trumpeter Finch"=>"Bucanetes githagineus", +"Red Grouse"=>"Lagopus scoticus", +"Rock Ptarmigan"=>"Lagopus mutus", +"Long-Tailed Cormorant"=>"Phalacrocorax africanus", +"Double-crested Cormorant"=>"Phalacrocorax auritus", +"Magnificent Frigatebird"=>"Fregata magnificens", +"Naumann's Thrush"=>"Turdus naumanni", +"Oriental Pratincole"=>"Glareola maldivarum", +"Bufflehead"=>"Bucephala albeola", +"Snowfinch"=>"Montifrigilla nivalis", +"Ural owl"=>"Strix uralensis", +"Spanish Wagtail"=>"Motacilla iberiae", +"Song Sparrow"=>"Melospiza melodia", +"Rock Bunting"=>"Emberiza cia", +"Siberian Rubythroat"=>"Luscinia calliope", +"Pallid Swift"=>"Apus pallidus", +"Eurasian Pygmy Owl"=>"Glaucidium passerinum", +"Madeira Little Shearwater"=>"Puffinus baroli", +"House Finch"=>"Carpodacus mexicanus", +"Green Heron"=>"Butorides virescens", +"Solitary Sandpiper"=>"Tringa solitaria", +"Heuglin's Gull"=>"Larus heuglini" +); + +function array_to_json( $array ){ + + if( !is_array( $array ) ){ + return false; + } + + $associative = count( array_diff( array_keys($array), array_keys( array_keys( $array )) )); + if( $associative ){ + + $construct = array(); + foreach( $array as $key => $value ){ + + // We first copy each key/value pair into a staging array, + // formatting each key and value properly as we go. + + // Format the key: + if( is_numeric($key) ){ + $key = "key_$key"; + } + $key = "\"".addslashes($key)."\""; + + // Format the value: + if( is_array( $value )){ + $value = array_to_json( $value ); + } else if( !is_numeric( $value ) || is_string( $value ) ){ + $value = "\"".addslashes($value)."\""; + } + + // Add to staging array: + $construct[] = "$key: $value"; + } + + // Then we collapse the staging array into the JSON form: + $result = "{ " . implode( ", ", $construct ) . " }"; + + } else { // If the array is a vector (not associative): + + $construct = array(); + foreach( $array as $value ){ + + // Format the value: + if( is_array( $value )){ + $value = array_to_json( $value ); + } else if( !is_numeric( $value ) || is_string( $value ) ){ + $value = "'".addslashes($value)."'"; + } + + // Add to staging array: + $construct[] = $value; + } + + // Then we collapse the staging array into the JSON form: + $result = "[ " . implode( ", ", $construct ) . " ]"; + } + + return $result; +} + +$result = array(); +foreach ($items as $key=>$value) { + if (strpos(strtolower($key), $q) !== false) { + array_push($result, array("id"=>$value, "label"=>$key, "value" => strip_tags($key))); + } + if (count($result) > 11) + break; +} +echo array_to_json($result); + +?> \ No newline at end of file diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/xml.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/xml.html new file mode 100644 index 00000000000..751059455d5 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/autocomplete/xml.html @@ -0,0 +1,72 @@ + + + + + jQuery UI Autocomplete - XML data parsed once + + + + + + + + + + + + +
    + +
    + + +
    + +
    + Result: +
    +
    + +
    + + + +
    +

    This demo shows how to retrieve some XML data, parse it using jQuery's methods, then provide it to the autocomplete as the datasource.

    +

    This should also serve as a reference on how to parse a remote XML datasource - the parsing would just happen for each request within the source-callback.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/checkbox.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/checkbox.html new file mode 100644 index 00000000000..0caf958c365 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/checkbox.html @@ -0,0 +1,44 @@ + + + + + jQuery UI Button - Checkboxes + + + + + + + + + + + +
    + + + +
    + + + +
    + +
    + + + +
    +

    A checkbox is styled as a toggle button with the button widget. The label element associated with the checkbox is used for the button text.

    +

    This demo also demonstrates three checkboxes styled as a button set by calling .buttonset() on a common container.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/default.html new file mode 100644 index 00000000000..1ea3fa79652 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/default.html @@ -0,0 +1,38 @@ + + + + + jQuery UI Button - Default functionality + + + + + + + + + + +
    + + + + + +An anchor + +
    + + + +
    +

    Examples of the markup that can be used for buttons: A button element, an input of type submit and an anchor.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/icons.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/icons.html new file mode 100644 index 00000000000..1badb3f5d07 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/icons.html @@ -0,0 +1,56 @@ + + + + + jQuery UI Button - Icons + + + + + + + + + + +
    + + + + + + +
    + + + +
    +

    Some buttons with various combinations of text and icons, here specified via metadata.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/index.html new file mode 100644 index 00000000000..23977c8207f --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/index.html @@ -0,0 +1,23 @@ + + + + + jQuery UI Button Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/radio.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/radio.html new file mode 100644 index 00000000000..5f725ca8d6b --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/radio.html @@ -0,0 +1,39 @@ + + + + + jQuery UI Button - Radios + + + + + + + + + + +
    + +
    +
    + + + +
    +
    + +
    + + + +
    +

    A set of three radio buttons transformed into a button set.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/splitbutton.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/splitbutton.html new file mode 100644 index 00000000000..c4e6377a138 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/splitbutton.html @@ -0,0 +1,55 @@ + + + + + jQuery UI Button - Split button + + + + + + + + + + + +
    + +
    + + +
    + +
    + + + +
    +

    An example of a split button built with two buttons: A plan button with just text, one with only a primary icon and no text. Both are grouped together in a set.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/toolbar.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/toolbar.html new file mode 100644 index 00000000000..d68b2d9ca64 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/button/toolbar.html @@ -0,0 +1,120 @@ + + + + + jQuery UI Button - Toolbar + + + + + + + + + + + +
    + + + + + + + + + + + + + + + + + + +
    + + + +
    +

    + A mediaplayer toolbar. Take a look at the underlying markup: A few button elements, + an input of type checkbox for the Shuffle button, and three inputs of type radio for the Repeat options. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/alt-field.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/alt-field.html new file mode 100644 index 00000000000..c60b21af782 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/alt-field.html @@ -0,0 +1,36 @@ + + + + + jQuery UI Datepicker - Populate alternate field + + + + + + + + + + +
    + +

    Date:  

    + +
    + + + +
    +

    Populate an alternate field with its own date format whenever a date is selected using the altField and altFormat options. This feature could be used to present a human-friendly date for user selection, while passing a more computer-friendly date through for further processing.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/animation.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/animation.html new file mode 100644 index 00000000000..9814b98f88c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/animation.html @@ -0,0 +1,58 @@ + + + + + jQuery UI Datepicker - Animations + + + + + + + + + + + + + + + + + +
    + +

    Date:

    + +

    Animations:
    + +

    + +
    + + + +
    +

    Use different animations when opening or closing the datepicker. Choose an animation from the dropdown, then click on the input to see its effect. You can use one of the three standard animations or any of the UI Effects.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/buttonbar.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/buttonbar.html new file mode 100644 index 00000000000..3b3be3bb33f --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/buttonbar.html @@ -0,0 +1,35 @@ + + + + + jQuery UI Datepicker - Display button bar + + + + + + + + + + +
    + +

    Date:

    + +
    + + + +
    +

    Display a button for selecting Today's date and a Done button for closing the calendar with the boolean showButtonPanel option. Each button is enabled by default when the bar is displayed, but can be turned off with additional options. Button text is customizable.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/date-formats.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/date-formats.html new file mode 100644 index 00000000000..e1ac6737bc2 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/date-formats.html @@ -0,0 +1,47 @@ + + + + + jQuery UI Datepicker - Format date + + + + + + + + + + +
    + +

    Date:

    + +

    Format options:
    + +

    + +
    + + + +
    +

    Display date feedback in a variety of ways. Choose a date format from the dropdown, then click on the input and select a date to see it in that format.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/date-range.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/date-range.html new file mode 100644 index 00000000000..bf9b9a3e5c2 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/date-range.html @@ -0,0 +1,49 @@ + + + + + jQuery UI Datepicker - Select a Date Range + + + + + + + + + + +
    + + + + + + +
    + + + +
    +

    Select the date range to search for.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/default.html new file mode 100644 index 00000000000..d50ac0de7ac --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/default.html @@ -0,0 +1,33 @@ + + + + + jQuery UI Datepicker - Default functionality + + + + + + + + + + +
    + +

    Date:

    + +
    + + + +
    +

    The datepicker is tied to a standard form input field. Focus on the input (click, or use the tab key) to open an interactive calendar in a small overlay. Choose a date, click elsewhere on the page (blur the input), or hit the Esc key to close. If a date is chosen, feedback is shown as the input's value.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/dropdown-month-year.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/dropdown-month-year.html new file mode 100644 index 00000000000..8392a1593b5 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/dropdown-month-year.html @@ -0,0 +1,36 @@ + + + + + jQuery UI Datepicker - Display month & year menus + + + + + + + + + + +
    + +

    Date:

    + +
    + + + +
    +

    Show month and year dropdowns in place of the static month/year header to facilitate navigation through large timeframes. Add the boolean changeMonth and changeYear options.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/icon-trigger.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/icon-trigger.html new file mode 100644 index 00000000000..5f4edc7f317 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/icon-trigger.html @@ -0,0 +1,37 @@ + + + + + jQuery UI Datepicker - Icon trigger + + + + + + + + + + +
    + +

    Date:

    + +
    + + + +
    +

    Click the icon next to the input field to show the datepicker. Set the datepicker to open on focus (default behavior), on icon click, or both.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/images/calendar.gif b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/images/calendar.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0abaa7c0b892e781b6f553453a0027efea014b9 GIT binary patch literal 269 zcmZ?wbhEHb6kyoJ#dt% zaYstuiRe5}O|8;NEA%ba6j)5k7TbN(gNwC&D)Y{1Cu2PhDy(ymnp7_1Ai(k{X>FbJ zg$yQ1aX#U+v{)u7c4kS5=DdO;0Y*k<=8BdGnYaWYcOkak83LIJ0`39}`h<8zSFc^O QT3n!+Z|k=0I}{nL0T`orxBvhE literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/index.html new file mode 100644 index 00000000000..ed2477402d1 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/index.html @@ -0,0 +1,31 @@ + + + + + jQuery UI Datepicker Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/inline.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/inline.html new file mode 100644 index 00000000000..19c4b042088 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/inline.html @@ -0,0 +1,33 @@ + + + + + jQuery UI Datepicker - Display inline + + + + + + + + + + +
    + +Date:
    + +
    + + + +
    +

    Display the datepicker embedded in the page instead of in an overlay. Simply call .datepicker() on a div instead of an input.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/localization.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/localization.html new file mode 100644 index 00000000000..91036111f89 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/localization.html @@ -0,0 +1,162 @@ + + + + + jQuery UI Datepicker - Localize calendar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +

    Date:   +

    + +
    + + + +
    +

    Localize the datepicker calendar language and format (English / Western formatting is the default). The datepicker includes built-in support for languages that read right-to-left, such as Arabic and Hebrew.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/min-max.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/min-max.html new file mode 100644 index 00000000000..e27339e10f0 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/min-max.html @@ -0,0 +1,33 @@ + + + + + jQuery UI Datepicker - Restrict date range + + + + + + + + + + +
    + +

    Date:

    + +
    + + + +
    +

    Restrict the range of selectable dates with the minDate and maxDate options. Set the beginning and end dates as actual dates (new Date(2009, 1 - 1, 26)), as a numeric offset from today (-20), or as a string of periods and units ('+1M +10D'). For the last, use 'D' for days, 'W' for weeks, 'M' for months, or 'Y' for years.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/multiple-calendars.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/multiple-calendars.html new file mode 100644 index 00000000000..0c762f72970 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/multiple-calendars.html @@ -0,0 +1,36 @@ + + + + + jQuery UI Datepicker - Display multiple months + + + + + + + + + + +
    + +

    Date:

    + +
    + + + +
    +

    Set the numberOfMonths option to an integer of 2 or more to show multiple months in a single datepicker.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/other-months.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/other-months.html new file mode 100644 index 00000000000..78a04f2c3f7 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/other-months.html @@ -0,0 +1,37 @@ + + + + + jQuery UI Datepicker - Dates in other months + + + + + + + + + + +
    + +

    Date:

    + +
    + + + +
    +

    The datepicker can show dates that come from other than the main month + being displayed. These other dates can also be made selectable.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/show-week.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/show-week.html new file mode 100644 index 00000000000..1cdb349bd72 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/datepicker/show-week.html @@ -0,0 +1,39 @@ + + + + + jQuery UI Datepicker - Show week of the year + + + + + + + + + + +
    + +

    Date:

    + +
    + + + +
    +

    The datepicker can show the week of the year. The default calculation follows + the ISO 8601 definition: the week starts on Monday, the first week of the year + contains the first Thursday of the year. This means that some days from one + year may be placed into weeks 'belonging' to another year.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/demos.css b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/demos.css new file mode 100644 index 00000000000..2d2ce1fc82c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/demos.css @@ -0,0 +1,334 @@ +body { + font-size: 62.5%; +} + +table { + font-size: 1em; +} + +/* Site + -------------------------------- */ + +body { + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; +} + +/* Layout + -------------------------------- */ + +.layout-grid { + width: 960px; +} + +.layout-grid td { + vertical-align: top; +} + +.layout-grid td.left-nav { + width: 140px; +} + +.layout-grid td.normal { + border-left: 1px solid #eee; + padding: 20px 24px; + font-family: "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; +} + +.layout-grid td.demos { + background: url('/images/demos_bg.jpg') no-repeat; + height: 337px; + overflow: hidden; +} + +/* Normal + -------------------------------- */ + +.normal h3, +.normal h4 { + margin: 0; + font-weight: normal; +} + +.normal h3 { + padding: 0 0 9px; + font-size: 1.8em; +} + +.normal h4 { + padding-bottom: 21px; + border-bottom: 1px dashed #999; + font-size: 1.2em; + font-weight: bold; +} + +.normal p { + font-size: 1.2em; +} + +/* Demos */ + +.demos-nav, .demos-nav dt, .demos-nav dd, .demos-nav ul, .demos-nav li { + margin: 0; + padding: 0 +} + +.demos-nav { + float: left; + width: 170px; + font-size: 1.3em; +} + +.demos-nav dt, +.demos-nav h4 { + margin: 0; + padding: 0; + font: normal 1.1em "Trebuchet MS", "Helvetica", "Arial", "Verdana", "sans-serif"; + color: #e87b10; +} + +.demos-nav dt, +.demos-nav h4 { + margin-top: 1.5em; + margin-bottom: 0; + padding-left: 8px; + padding-bottom:5px; + line-height: 1.2em; + border-bottom: 1px solid #F4F4F4; +} + +.demos-nav dd a, +.demos-nav li a { + border-bottom: 1px solid #F4F4F4; + display:block; + padding: 4px 3px 4px 8px; + font-size: 90%; + text-decoration: none; + color: #555 ; + margin:2px 0; + height:13px; +} + +.demos-nav dd a:hover, +.demos-nav dd a:focus, +.demos-nav dd a:hover, +.demos-nav dd a:focus { + background: #f3f3f3; + color:#000; + -moz-border-radius: 5px; -webkit-border-radius: 5px; +} + .demos-nav dd a.selected { + background: #555; + color:#ffffff; + -moz-border-radius: 5px; -webkit-border-radius: 5px; +} + + +/* new styles for demo pages, added by Filament 12.29.08 +eventually we should convert the font sizes to ems -- using px for now to minimize style conflicts +*/ + +.normal h3.demo-header { font-size:32px; padding:0 0 5px; border-bottom:1px solid #eee; text-transform: capitalize; } +.normal h4.demo-subheader { font-size:10px; text-transform: uppercase; color:#999; padding:8px 0 3px; border:0; margin:0; } +.normal a:link, +.normal a:visited { color:#1b75bb; text-decoration:none; } +.normal a:hover, +.normal a:active { color:#0b559b; } + +#demo-config { padding:20px 0 0; } + +#demo-frame { float:left; width:540px; height:380px; border:1px solid #ddd; overflow: auto; position: relative; } +#demo-frame h3, #demo-frame h4 { padding: 0; font-weight: bold; font-size: 1em; } + +#demo-config-menu { float:right; width:180px; } +#demo-config-menu h4 { font-size:13px; color:#666; font-weight:normal; border:0; padding-left:18px; } + +#demo-config-menu ul { list-style: none; padding: 0; margin: 0; } + +#demo-config-menu li { font-size:12px; padding:0 0 0 10px; margin:3px 0; zoom: 1; } + +#demo-config-menu li a:link, +#demo-config-menu li a:visited { display:block; padding:1px 8px 4px; border-bottom:1px dotted #b3b3b3; } +* html #demo-config-menu li a:link, +* html #demo-config-menu li a:visited { padding:1px 8px 2px; } +#demo-config-menu li a:hover, +#demo-config-menu li a:active { background-color:#f6f6f6; } + +#demo-config-menu li.demo-config-on { background: url(images/demo-config-on-tile.gif) repeat-x left center; } + +#demo-config-menu li.demo-config-on a:link, +#demo-config-menu li.demo-config-on a:visited, +#demo-config-menu li.demo-config-on a:hover, +#demo-config-menu li.demo-config-on a:active { background: url(images/demo-config-on.gif) no-repeat left; padding-left:18px; color:#fff; border:0; margin-left:-10px; margin-top: 0px; margin-bottom: 0px; } + +#demo-source, #demo-notes { + clear: both; + padding: 20px 0 0; + font-size: 1.3em; +} + +#demo-notes { width:520px; color:#333; font-size: 1em; } +#demo-notes p code, .demo-description p code { padding: 0; font-weight: bold; } +#demo-source pre, #demo-source code { padding: 0; } +code, pre { padding:8px 0 8px 20px ; font-size: 1.2em; line-height:130%; } + +#demo-source a:link, +#demo-source a:visited, +#demo-source a:hover, +#demo-source a:active { font-size:12px; padding-left:13px; background-position: left center; background-repeat: no-repeat; } + +#demo-source a.source-open:link, +#demo-source a.source-open:visited, +#demo-source a.source-open:hover, +#demo-source a.source-open:active { background-image: url(images/demo-spindown-open.gif); } + +#demo-source a.source-closed:link, +#demo-source a.source-closed:visited, +#demo-source a.source-closed:hover, +#demo-source a.source-closed:active { background-image: url(images/demo-spindown-closed.gif); } + +div.demo { + padding:12px; + font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif"; +} + +div.demo h3.docs { clear:left; font-size:12px; font-weight:normal; padding:0 0 1em; margin:0; } + +div.demo-description { + clear:both; + padding:12px; + font-family: "Trebuchet MS", "Arial", "Helvetica", "Verdana", "sans-serif"; + font-size: 1.3em; + line-height: 1.4em; +} + +.ui-draggable, .ui-droppable { + background-position: top left; +} + +.left-nav .demos-nav { + padding-right: 10px; +} + +#demo-link { font-size:11px; padding-top: 6px; clear: both; overflow: hidden; } +#demo-link a span.ui-icon { float:left; margin-right:3px; } + +/* Component containers +----------------------------------*/ +#widget-docs .ui-widget { font-family: Trebuchet MS,Verdana,Arial,sans-serif; font-size: 1em; } +#widget-docs .ui-widget input, #widget-docs .ui-widget select, #widget-docs .ui-widget textarea, #widget-docs .ui-widget button { font-family: Trebuchet MS,Verdana,Arial,sans-serif; font-size: 1em; } +#widget-docs .ui-widget-header { border: 1px solid #ffffff; background: #464646 url(images/464646_40x100_textures_01_flat_100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; } +#widget-docs .ui-widget-header a { color: #ffffff; } +#widget-docs .ui-widget-content { border: 1px solid #ffffff; background: #ffffff url(images/ffffff_40x100_textures_01_flat_75.png) 50% 50% repeat-x; color: #222222; } +#widget-docs .ui-widget-content a { color: #222222; } + +/* Interaction states +----------------------------------*/ +#widget-docs .ui-state-default, #widget-docs .ui-widget-content #widget-docs .ui-state-default { border: 1px solid #666666; background: #555555 url(images/555555_40x100_textures_03_highlight_soft_75.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; } +#widget-docs .ui-state-default a { color: #ffffff; text-decoration: none; outline: none; } +#widget-docs .ui-state-hover, #widget-docs .ui-widget-content #widget-docs .ui-state-hover, #widget-docs .ui-state-focus, #widget-docs .ui-widget-content #widget-docs .ui-state-focus { border: 1px solid #666666; background: #444444 url(images/444444_40x100_textures_03_highlight_soft_60.png) 50% 50% repeat-x; font-weight: normal; color: #ffffff; outline: none; } +#widget-docs .ui-state-hover a { color: #ffffff; text-decoration: none; outline: none; } +#widget-docs .ui-state-active, #widget-docs .ui-widget-content #widget-docs .ui-state-active { border: 1px solid #666666; background: #ffffff url(images/ffffff_40x100_textures_01_flat_65.png) 50% 50% repeat-x; font-weight: normal; color: #F6921E; outline: none; } +#widget-docs .ui-state-active a { color: #F6921E; outline: none; text-decoration: none; } + +/* Interaction Cues +----------------------------------*/ +#widget-docs .ui-state-highlight, #widget-docs .ui-widget-content #widget-docs .ui-state-highlight {border: 1px solid #fcefa1; background: #fbf9ee url(images/fbf9ee_40x100_textures_02_glass_55.png) 50% 50% repeat-x; color: #363636; } +#widget-docs .ui-state-error, #widget-docs .ui-widget-content #widget-docs .ui-state-error {border: 1px solid #cd0a0a; background: #fef1ec url(images/fef1ec_40x100_textures_05_inset_soft_95.png) 50% bottom repeat-x; color: #cd0a0a; } +#widget-docs .ui-state-error-text, #widget-docs .ui-widget-content #widget-docs .ui-state-error-text { color: #cd0a0a; } +#widget-docs .ui-state-disabled, #widget-docs .ui-widget-content #widget-docs .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; } +#widget-docs .ui-priority-primary, #widget-docs .ui-widget-content #widget-docs .ui-priority-primary { font-weight: bold; } +#widget-docs .ui-priority-secondary, #widget-docs .ui-widget-content #widget-docs .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; } + +/* Icons +----------------------------------*/ + +/* states and images */ +#demo-frame-wrapper .ui-icon, #widget-docs .ui-icon { width: 16px; height: 16px; background-image: url(images/222222_256x240_icons_icons.png); } +#widget-docs .ui-widget-content .ui-icon {background-image: url(images/222222_256x240_icons_icons.png); } +#widget-docs .ui-widget-header .ui-icon {background-image: url(images/222222_256x240_icons_icons.png); } +#widget-docs .ui-state-default .ui-icon { background-image: url(images/888888_256x240_icons_icons.png); } +#widget-docs .ui-state-hover .ui-icon, #widget-docs .ui-state-focus .ui-icon {background-image: url(images/454545_256x240_icons_icons.png); } +#widget-docs .ui-state-active .ui-icon {background-image: url(images/454545_256x240_icons_icons.png); } +#widget-docs .ui-state-highlight .ui-icon {background-image: url(images/2e83ff_256x240_icons_icons.png); } +#widget-docs .ui-state-error .ui-icon, #widget-docs .ui-state-error-text .ui-icon {background-image: url(images/cd0a0a_256x240_icons_icons.png); } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +#widget-docs .ui-corner-tl { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; } +#widget-docs .ui-corner-tr { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +#widget-docs .ui-corner-bl { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +#widget-docs .ui-corner-br { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +#widget-docs .ui-corner-top { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; } +#widget-docs .ui-corner-bottom { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +#widget-docs .ui-corner-right { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; } +#widget-docs .ui-corner-left { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; } +#widget-docs .ui-corner-all { -moz-border-radius: 4px; -webkit-border-radius: 4px; } + +/* Overlays */ +#widget-docs .ui-widget-overlay { background: #aaaaaa url(images/aaaaaa_40x100_textures_01_flat_0.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); } +#widget-docs .ui-widget-shadow { margin: -8px 0 0 -8px; padding: 8px; background: #aaaaaa url(images/aaaaaa_40x100_textures_01_flat_0.png) 50% 50% repeat-x; opacity: .30;filter:Alpha(Opacity=30); -moz-border-radius: 8px; -webkit-border-radius: 8px; } + +/* +----------------------------------*/ + +#widget-docs { margin:20px 0 0; border: none; } + +#widget-docs h2, #widget-docs h3, #widget-docs h4, #widget-docs p, #widget-docs ul, #widget-docs code { margin:0; padding:0; } +#widget-docs code { display:block; color:#444; font-size:.9em; margin:0 0 1em; } +#widget-docs code strong { color:#000; } +#widget-docs p { margin:0 3em 1.2em 0; } +#widget-docs p.intro { font-size:13px; color:#666; line-height:1.3; } +#widget-docs ul { list-style-type: none; } + +#widget-docs h2 { font-size:16px; margin:1.2em 0 .5em; } +#widget-docs h3 { font-size:14px; color:#e6820E; margin:1.5em 0 .5em; } +.normal #widget-docs h4 { font-size:12px; color:#000; border:0; margin:0 0 .5em; } + +#docs-overview-main { width:400px; } +#docs-overview-sidebar { float:right; width:200px; } +#docs-overview-sidebar a span { color:#666; } +#widget-docs #docs-overview-main p { margin-right:0; } +#widget-docs #docs-overview-sidebar h4 { padding-left:0; } + +.docs-list-header { float:left; width:100%; margin:10px 0 0; border-bottom:1px solid #eee; } +#widget-docs .docs-list-header h2 { float:left; margin:0; } +#widget-docs .docs-list-header p { float:right; margin:5px 0; font-size:11px; } + +.docs-list { float:left; width:100%; padding:0 0 10px; } +.docs-list .param-header { float:left; clear:left; width:100%; padding:8px 0; border-top:1px solid #eee; } +#widget-docs .param-header h3, #widget-docs .param-header p { margin:0; float:left; } +#widget-docs .param-header h3 { width:50%; } +#widget-docs .param-header h3 span { background: url(images/demo-spindown-closed.gif) no-repeat left; padding-left:13px; } +#widget-docs .param-open .param-header h3 span { background: url(images/demo-spindown-open.gif) no-repeat left; } +#widget-docs .param-header p { width:24%; } +#widget-docs .param-header p.param-type span { background: url(images/icon-docs-info.gif) no-repeat left; cursor:pointer; border-bottom:1px dashed #ccc; padding-left:15px; } + +.param-details { padding-left:13px; } +.param-args { margin:0 0 1.5em; border-top:1px dotted #ccc;} +.param-args td { padding:3px 30px 3px 5px; border-bottom:1px dotted #ccc; } + + +/* overrides for ui-tab styles */ +#widget-docs ul.ui-tabs-nav { padding:0 0 0 8px; } +#widget-docs .ui-tabs-nav li { margin:5px 5px 0 0; } + +#widget-docs .ui-tabs-nav li a:link, +#widget-docs .ui-tabs-nav li a:visited, +#widget-docs .ui-tabs-nav li a:hover, +#widget-docs .ui-tabs-nav li a:active { font-size:14px; padding:4px 1.2em 3px; color:#fff; } + +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:link, +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:visited, +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:hover, +#widget-docs .ui-tabs-nav li.ui-tabs-selected a:active { color:#e6820E; } + +#widget-docs .ui-tabs-panel { padding:20px 9px; font-size:12px; line-height:1.4; color:#000; } + +#widget-docs .ui-widget-content a:link, +#widget-docs .ui-widget-content a:visited { color:#1b75bb; text-decoration:none; } +#widget-docs .ui-widget-content a:hover, +#widget-docs .ui-widget-content a:active { color:#0b559b; } + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/animated.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/animated.html new file mode 100644 index 00000000000..200db3fe01e --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/animated.html @@ -0,0 +1,56 @@ + + + + + jQuery UI Dialog - Animation + + + + + + + + + + + + + + + + + + +
    + +
    +

    This is an animated dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.

    +
    + + + +
    + + + +
    +

    Dialogs may be animated by specifying an effect for the show and/or hide properties. You must include the individual effects file for any effects you would like to use.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/default.html new file mode 100644 index 00000000000..083f7aa5403 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/default.html @@ -0,0 +1,54 @@ + + + + + jQuery UI Dialog - Default functionality + + + + + + + + + + + + + + + +
    + +
    +

    This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.

    +
    + + +
    +

    Sed vel diam id libero rutrum convallis. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.

    +
    +
    + checkbox
    + radio
    +

    +
    +
    +
    + +
    + + + +
    +

    The basic dialog window is an overlay positioned within the viewport and is protected from page content (like select elements) shining through with an iframe. It has a title bar and a content area, and can be moved, resized and closed with the 'x' icon by default.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/index.html new file mode 100644 index 00000000000..460e4fb361c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/index.html @@ -0,0 +1,23 @@ + + + + + jQuery UI Dialog Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-confirmation.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-confirmation.html new file mode 100644 index 00000000000..e316a97bf38 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-confirmation.html @@ -0,0 +1,69 @@ + + + + + jQuery UI Dialog - Modal confirmation + + + + + + + + + + + + + + + +
    + +
    +

    These items will be permanently deleted and cannot be recovered. Are you sure?

    +
    + + +
    +

    Sed vel diam id libero rutrum convallis. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.

    +
    +
    + checkbox
    + radio
    +

    +
    +
    +
    + +
    + + + +
    +

    Confirm an action that may be destructive or important. Set the modal option to true, and specify primary and secondary user actions with the buttons option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-form.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-form.html new file mode 100644 index 00000000000..5793b32eeb9 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-form.html @@ -0,0 +1,167 @@ + + + + + jQuery UI Dialog - Modal form + + + + + + + + + + + + + + + + + + +
    + +
    +

    All form fields are required.

    + +
    +
    + + + + + + +
    +
    +
    + + +
    +

    Existing Users:

    + + + + + + + + + + + + + + + +
    NameEmailPassword
    John Doejohn.doe@example.comjohndoe1
    +
    + + +
    + + + +
    +

    Use a modal dialog to require that the user enter data during a multi-step process. Embed form markup in the content area, set the modal option to true, and specify primary and secondary user actions with the buttons option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-message.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-message.html new file mode 100644 index 00000000000..90a88c33e7a --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal-message.html @@ -0,0 +1,71 @@ + + + + + jQuery UI Dialog - Modal message + + + + + + + + + + + + + + + + +
    + +
    +

    + + Your files have downloaded successfully into the My Downloads folder. +

    +

    + Currently using 36% of your storage space. +

    +
    + + +
    +

    Sed vel diam id libero rutrum convallis. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.

    +
    +
    + checkbox
    + radio
    +

    +
    +
    +
    + +
    + + + +
    +

    Use a modal dialog to explicitly acknowledge information or an action before continuing their work. Set the modal option to true, and specify a primary action (Ok) with the buttons option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal.html new file mode 100644 index 00000000000..ce56c30edd7 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/dialog/modal.html @@ -0,0 +1,60 @@ + + + + + jQuery UI Dialog - Basic modal + + + + + + + + + + + + + + + +
    + +
    +

    Adding the modal overlay screen makes the dialog look more prominent because it dims out the page content.

    +
    + + +
    +

    Sed vel diam id libero rutrum convallis. Donec aliquet leo vel magna. Phasellus rhoncus faucibus ante. Etiam bibendum, enim faucibus aliquet rhoncus, arcu felis ultricies neque, sit amet auctor elit eros a lectus.

    +
    +
    + checkbox
    + radio
    +

    +
    +
    +
    + +
    + + + +
    +

    A modal dialog prevents the user from interacting with the rest of the page until it is closed.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/constrain-movement.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/constrain-movement.html new file mode 100644 index 00000000000..9610fc48db7 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/constrain-movement.html @@ -0,0 +1,69 @@ + + + + + jQuery UI Draggable - Constrain movement + + + + + + + + + + + + +
    + +

    Constrain movement along an axis:

    + +
    +

    I can be dragged only vertically

    +
    + +
    +

    I can be dragged only horizontally

    +
    + +

    Or to within another DOM element:

    +
    +
    +

    I'm contained within the box

    +
    + +
    +

    I'm contained within the box's parent

    +
    + +
    +

    I'm contained within my parent

    +
    +
    + +
    + + + +
    +

    Constrain the movement of each draggable by defining the boundaries of the draggable area. Set the axis option to limit the draggable's path to the x- or y-axis, or use the containment option to specify a parent DOM element or a jQuery selector, like 'document.'

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/cursor-style.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/cursor-style.html new file mode 100644 index 00000000000..6ef5426ed11 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/cursor-style.html @@ -0,0 +1,49 @@ + + + + + jQuery UI Draggable - Cursor style + + + + + + + + + + + + +
    + +
    +

    I will always stick to the center (relative to the mouse)

    +
    + +
    +

    My cursor is at left -5 and top -5

    +
    + +
    +

    My cursor position is only controlled for the 'bottom' value

    +
    + +
    + + + +
    +

    Position the cursor while dragging the object. By default the cursor appears in the center of the dragged object; use the cursorAt option to specify another location relative to the draggable (specify a pixel value from the top, right, bottom, and/or left). Customize the cursor's appearance by supplying the cursor option with a valid CSS cursor value: default, move, pointer, crosshair, etc.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/default.html new file mode 100644 index 00000000000..d8085b0b854 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/default.html @@ -0,0 +1,39 @@ + + + + + jQuery UI Draggable - Default functionality + + + + + + + + + + + + +
    + +
    +

    Drag me around

    +
    + +
    + + + +
    +

    Enable draggable functionality on any DOM element. Move the draggable object by clicking on it with the mouse and dragging it anywhere within the viewport.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/delay-start.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/delay-start.html new file mode 100644 index 00000000000..45e3edae272 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/delay-start.html @@ -0,0 +1,45 @@ + + + + + jQuery UI Draggable - Delay start + + + + + + + + + + + + +
    + +
    +

    Only if you drag me by 20 pixels, the dragging will start

    +
    + +
    +

    Regardless of the distance, you have to drag and wait for 1000ms before dragging starts

    +
    + +
    + + + +
    +

    Delay the start of dragging for a number of milliseconds with the delay option; prevent dragging until the cursor is held down and dragged a specifed number of pixels with the distance option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/events.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/events.html new file mode 100644 index 00000000000..ed067d12072 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/events.html @@ -0,0 +1,77 @@ + + + + + jQuery UI Draggable - Events + + + + + + + + + + + + +
    + +
    + +

    Drag me to trigger the chain of events.

    + +
      +
    • "start" invoked 0x
    • +
    • "drag" invoked 0x
    • +
    • "stop" invoked 0x
    • +
    +
    + +
    + + + +
    +

    Layer functionality onto the draggable using the start, drag, and stop events. Start is fired at the start of the drag; drag during the drag; and stop when dragging stops.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/handle.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/handle.html new file mode 100644 index 00000000000..dc6d7b9e63b --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/handle.html @@ -0,0 +1,50 @@ + + + + + jQuery UI Draggable - Handles + + + + + + + + + + + + +
    + +
    +

    I can be dragged only by this handle

    +
    + +
    +

    You can drag me around…

    +

    …but you can't drag me by this handle.

    +
    + + + +
    + + + +
    +

    Allow dragging only when the cursor is over a specific part of the draggable. Use the handle option to specify the jQuery selector of an element (or group of elements) used to drag the object.

    +

    Or prevent dragging when the cursor is over a specific element (or group of elements) within the draggable. Use the cancel option to specify a jQuery selector over which to "cancel" draggable functionality.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/index.html new file mode 100644 index 00000000000..0beda8e7292 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/index.html @@ -0,0 +1,28 @@ + + + + + jQuery UI Draggable Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/revert.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/revert.html new file mode 100644 index 00000000000..11f3abdfac9 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/revert.html @@ -0,0 +1,44 @@ + + + + + jQuery UI Draggable - Revert position + + + + + + + + + + + + +
    + +
    +

    Revert the original

    +
    + +
    +

    Revert the helper

    +
    + +
    + + + +
    +

    Return the draggable (or it's helper) to its original location when dragging stops with the boolean revert option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/scroll.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/scroll.html new file mode 100644 index 00000000000..a650ed5d96d --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/scroll.html @@ -0,0 +1,51 @@ + + + + + jQuery UI Draggable - Auto-scroll + + + + + + + + + + + + +
    + +
    +

    Scroll set to true, default settings

    +
    + +
    +

    scrollSensitivity set to 100

    +
    + +
    +

    scrollSpeed set to 100

    +
    + +
    + +
    + + + +
    +

    Automatically scroll the document when the draggable is moved beyond the viewport. Set the scroll option to true to enable auto-scrolling, and fine-tune when scrolling is triggered and its speed with the scrollSensitivity and scrollSpeed options.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/snap-to.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/snap-to.html new file mode 100644 index 00000000000..14e254e478a --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/snap-to.html @@ -0,0 +1,68 @@ + + + + + jQuery UI Draggable - Snap to element or grid + + + + + + + + + + + + +
    + +
    +

    I'm a snap target

    +
    + +
    + +
    +

    Default (snap: true), snaps to all other draggable elements

    +
    + +
    +

    I only snap to the big box

    +
    + +
    +

    I only snap to the outer edges of the big box

    +
    + +
    +

    I snap to a 20 x 20 grid

    +
    + +
    +

    I snap to a 80 x 80 grid

    +
    + +
    + + + +
    +

    Snap the draggable to the inner or outer boundaries of a DOM element. Use the snap, snapMode (inner, outer, both), and snapTolerance (distance in pixels the draggable must be from the element when snapping is invoked) options.

    +

    Or snap the draggable to a grid. Set the dimensions of grid cells (height and width in pixels) with the grid option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/sortable.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/sortable.html new file mode 100644 index 00000000000..4bc32986df1 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/sortable.html @@ -0,0 +1,57 @@ + + + + + jQuery UI Draggable + Sortable + + + + + + + + + + + + + +
    + +
      +
    • Drag me down
    • +
    + +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
    • Item 4
    • +
    • Item 5
    • +
    + +
    + + + +
    +

    Draggables are built to interact seamlessly with sortables.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/visual-feedback.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/visual-feedback.html new file mode 100644 index 00000000000..5d0ff2668f3 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/draggable/visual-feedback.html @@ -0,0 +1,77 @@ + + + + + jQuery UI Draggable - Visual feedback + + + + + + + + + + + + +
    + +

    With helpers:

    + +
    +

    Original

    +
    + +
    +

    Semi-transparent clone

    +
    + +
    +

    Custom helper (in combination with cursorAt)

    +
    + +

    Stacked:

    +
    +
    +

    We are draggables..

    +
    + +
    +

    ..whose z-indexes are controlled automatically..

    +
    + +
    +

    ..with the stack option.

    +
    +
    + +
    + + + +
    +

    Provide feedback to users as they drag an object in the form of a helper. The helper option accepts the values 'original' (the draggable object moves with the cursor), 'clone' (a duplicate of the draggable moves with the cursor), or a function that returns a DOM element (that element is shown near the cursor during drag). Control the helper's transparency with the opacity option.

    +

    To clarify which draggable is in play, bring the draggable in motion to front. Use the zIndex option to set a higher z-index for the helper, if in play, or use the stack option to ensure that the last item dragged will appear on top of others in the same group on drag stop.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/accepted-elements.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/accepted-elements.html new file mode 100644 index 00000000000..a2e3b3321cf --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/accepted-elements.html @@ -0,0 +1,60 @@ + + + + + jQuery UI Droppable - Accept + + + + + + + + + + + + + +
    + +
    +

    I'm draggable but can't be dropped

    +
    + +
    +

    Drag me to my target

    +
    + +
    +

    accept: '#draggable'

    +
    + +
    + + + +
    +

    Specify using the accept option which element (or group of elements) is accepted by the target droppable.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/default.html new file mode 100644 index 00000000000..4de66d70a2a --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/default.html @@ -0,0 +1,53 @@ + + + + + jQuery UI Droppable - Default functionality + + + + + + + + + + + + + +
    + +
    +

    Drag me to my target

    +
    + +
    +

    Drop here

    +
    + +
    + + + +
    +

    Enable any DOM element to be droppable, a target for draggable elements.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras.jpg b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5723680df547ac20f32e56bb7536b01f7a78b438 GIT binary patch literal 22994 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 NA^XD?-C*}W|Jk0FJPZH; literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras2.jpg b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1acad3afb079e8394c21f03e8daa54cef53cbec1 GIT binary patch literal 25619 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 E*>rn9?*IS* literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras2_min.jpg b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras2_min.jpg new file mode 100644 index 0000000000000000000000000000000000000000..493e0824ae33927c1f6337ea2cb4f8f3b71a4631 GIT binary patch literal 2164 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 f(;hLxv(255Dw3H7>KLR@?2=796$frQ&Dwx literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras3_min.jpg b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras3_min.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4aa96b01ef519d4802393ddf6b8da68de5e6af1d GIT binary patch literal 1901 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras4_min.jpg b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras4_min.jpg new file mode 100644 index 0000000000000000000000000000000000000000..794dbdf78a1daea9f42f5c99ff9bdf25d0525c02 GIT binary patch literal 2541 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 Y@k!vm(pJ*3bWm3TRsqL<^yFmvU)sBcv;Y7A literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras_min.jpg b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/images/high_tatras_min.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51e0cdedff38e1f0fac3bb961acb04830fe49857 GIT binary patch literal 2147 zcmb7qg4R%c3xIiQH)wW)a!zdH?C}_jCR_=X=iio+ILlCIIQ9c8+!c2m}Hgb^;KM05$*u z27|+(2sj*$L?XmdvXUqX36vs6W|yprlA5ZDlCrWo)=*nr(?CmES?7SR!G0qX6B9M< zgBIq5!-mEtgnyQRkVqs-0;M1+sX)+B)*$@fh*|+OV&|lD5Re7{MuQ+|kmwDt2LQle z2nhHM6b2Flz!3P3Xd(@OK@bR73<`!q|JMToLjW-}6r*9}Dx+!b50fQCU(D~5!yc*o z4tFbUn_S+RQUdLa@BIIpom318z;-k(^p4#>{I&#v(GU%ck(jlNrk1NeLBs=4JK|0e z4OjtgW~Xo6^r|%7{k|sOu2YQsus^J-Lz13E z_w4>NyT)rL-%Qfa_aL;VS4eQF2$e2Do#%MnwVMz9`Ajfwa6=tK2WK zHNAwf9_>w!6sVkC_&n7%+o`}?VL~ICw*GK^5?ar2bSg`DX^y+hu3Y$$QuuxSt49y@ z;LoHb&e5V?g-szUP*-4>rkJSQlGyD$@zlOD_u<$g zNAe?cHz4waeFMcalvgS2?r9f2ulc@gov9SvFdl2Ma@Zc5-v&Do5rE{JNL_vlP&EB} zM-%z|W$p#khNC2k?HXpm{o1vd!?+1@U@m*Rg5K`F`_WB~VL#JRqONt0YRUenx@KM4 zbzKcwdd2$%>(g}6VOzIk)Gn)WMpij1JgLYEW0#S?t1D=$oaNHBd6JUn0<*3c)@lyy z69MEj@2G_XD}9Yu)B>uwsl{~Xv_f&UsdoPPLG*gV4;_$3S=7A;F6yWZM!^f6b_6%G zQ7mF&>H)G6of_KGS5qBs91y{*gINB>xFrHgZ6fcU7}wUZNxsn{=rYxv|NEnze&?31 z*P;jjRq6synj~;XY9WJFV#cBLf`&h`Zv33}usmpLGbdX5Ug_YY!z67+EctW3AT;1Qk3UAqt~q%ks90)jqjKZ4lg+tHbo|goqC~em z!BHE_NQTotoN7$2IWOPoo>2s*Xj^2cvb-u#0;y!)-tgoyk5zPIg3Z(eT^qNi)N9#N z!ye`ki>4kli0fl6Uh2z$Ww;J8!Zyf$cK#XqltuQ@W3Pe=(^X%ONhrR~D#&9}9$0^1 zbTIgnG?&MeS>yebupGzN-?;^L==A^M zQp?h8lX)8(8=B^kKMJHoI>#2rb7a3LMwq|sEG7;QN?N^nhL5`qH|R@X-&d|@5Ycj9 zL7+}CvNUo&ox9|oKit=cOpc==)ciY#sYb$0LFFe**pHNSni$MoWvyRix=^q*_8BTKT;oK1a14 z*7Zexll`M3VOJG)pUO(oy{I&+&_Plm`f+gJyH{9M5inN`3DHCu;Yy!G8_xA&-SfOg zRZB>CN%FA?|8+%A^I!T@@!kq-?7hABUmu^Wb8G$?{ZUEf(2?L}{28arE1;Jzw{i)3 zsySaMw|R@by1k<*mrNvS?6JE_<+$ zRhiiSI;a>r*W3szG0#GIOU-8l1O jLAx4LA{|d4VOJrD%y;E?O{+GXB3dCOEc{ + + + + jQuery UI Droppable Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/photo-manager.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/photo-manager.html new file mode 100644 index 00000000000..2b16eb7b2f6 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/photo-manager.html @@ -0,0 +1,184 @@ + + + + + jQuery UI Droppable - Simple photo manager + + + + + + + + + + + + + + + + +
    + + + +
    +

    Trash Trash

    +
    + +
    + + +
    +

    You can delete an image either by dragging it to the Trash or by clicking the trash icon.

    +

    You can "recycle" an image by dragging it back to the gallery or by clicking the recycle icon.

    +

    You can view larger image by clicking the zoom icon. jQuery UI dialog widget is used for the modal window.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/propagation.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/propagation.html new file mode 100644 index 00000000000..3275dd2a6ed --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/propagation.html @@ -0,0 +1,80 @@ + + + + + jQuery UI Droppable - Prevent propagation + + + + + + + + + + + + + +
    + +
    +

    Drag me to my target

    +
    + +
    +

    Outer droppable

    +
    +

    Inner droppable (not greedy)

    +
    +
    + +
    +

    Outer droppable

    +
    +

    Inner droppable (greedy)

    +
    +
    + +
    + + + +
    +

    When working with nested droppables — for example, you may have an editable directory structure displayed as a tree, with folder and document nodes — the greedy option set to true prevents event propagation when a draggable is dropped on a child node (droppable).

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/revert.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/revert.html new file mode 100644 index 00000000000..24da889b137 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/revert.html @@ -0,0 +1,61 @@ + + + + + jQuery UI Droppable - Revert draggable position + + + + + + + + + + + + + +
    + +
    +

    I revert when I'm dropped

    +
    + +
    +

    I revert when I'm not dropped

    +
    + +
    +

    Drop me here

    +
    + +
    + + + +
    +

    Return the draggable (or it's helper) to its original location when dragging stops with the boolean revert option set on the draggable.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/shopping-cart.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/shopping-cart.html new file mode 100644 index 00000000000..4fb9a87bab6 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/shopping-cart.html @@ -0,0 +1,101 @@ + + + + + jQuery UI Droppable - Shopping Cart Demo + + + + + + + + + + + + + + + +
    + +
    +

    Products

    +
    +

    T-Shirts

    +
    +
      +
    • Lolcat Shirt
    • +
    • Cheezeburger Shirt
    • +
    • Buckit Shirt
    • +
    +
    +

    Bags

    +
    +
      +
    • Zebra Striped
    • +
    • Black Leather
    • +
    • Alligator Leather
    • +
    +
    +

    Gadgets

    +
    +
      +
    • iPhone
    • +
    • iPod
    • +
    • iPad
    • +
    +
    +
    +
    + +
    +

    Shopping Cart

    +
    +
      +
    1. Add your items here
    2. +
    +
    +
    + +
    + + + +
    +

    Demonstrate how to use an accordion to structure products into a catalog and make use drag and drop for adding them to a shopping cart, where they are sortable.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/visual-feedback.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/visual-feedback.html new file mode 100644 index 00000000000..ff2ddc6ca71 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/droppable/visual-feedback.html @@ -0,0 +1,78 @@ + + + + + jQuery UI Droppable - Visual feedback + + + + + + + + + + + + + +
    + +

    Feedback on hover:

    + +
    +

    Drag me to my target

    +
    + +
    +

    Drop here

    +
    + +

    Feedback on activating draggable:

    + +
    +

    Drag me to my target

    +
    + +
    +

    Drop here

    +
    + +
    + + + +
    +

    Change the droppable's appearance on hover, or when the droppable is active (an acceptable draggable is dropped on it). Use the hoverClass or activeClass options to specify respective classes.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/default.html new file mode 100644 index 00000000000..6be20f38d05 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/default.html @@ -0,0 +1,109 @@ + + + + + jQuery UI Effects - Effect demo + + + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +

    Effect

    +

    + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. +

    +
    +
    + + + +Run Effect + +
    + + + +
    +

    Click the button above to show the effect.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/easing.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/easing.html new file mode 100644 index 00000000000..0b6ba0885ab --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/easing.html @@ -0,0 +1,108 @@ + + + + + jQuery UI Effects - Easing demo + + + + + + + + + +
    + +
    + +
    + + + +
    +

    All easings provided by jQuery UI are drawn above, using a HTML canvas element. Click a diagram to see the easing in action.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/index.html new file mode 100644 index 00000000000..65aa3993aef --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/effect/index.html @@ -0,0 +1,19 @@ + + + + + jQuery UI Effects Demos + + + + +
    +

    Examples

    + +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/hide/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/hide/default.html new file mode 100644 index 00000000000..1409024cb01 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/hide/default.html @@ -0,0 +1,102 @@ + + + + + jQuery UI Effects - Hide Demo + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +

    Hide

    +

    + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. +

    +
    +
    + + + +Run Effect + +
    + + + +
    +

    Click the button above to preview the effect.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/hide/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/hide/index.html new file mode 100644 index 00000000000..f5bd6a0e424 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/hide/index.html @@ -0,0 +1,18 @@ + + + + + jQuery UI Effects Demos + + + + +
    +

    Examples

    + +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/calendar.gif b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/calendar.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0abaa7c0b892e781b6f553453a0027efea014b9 GIT binary patch literal 269 zcmZ?wbhEHb6kyoJ#dt% zaYstuiRe5}O|8;NEA%ba6j)5k7TbN(gNwC&D)Y{1Cu2PhDy(ymnp7_1Ai(k{X>FbJ zg$yQ1aX#U+v{)u7c4kS5=DdO;0Y*k<=8BdGnYaWYcOkak83LIJ0`39}`h<8zSFc^O QT3n!+Z|k=0I}{nL0T`orxBvhE literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-config-on-tile.gif b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-config-on-tile.gif new file mode 100644 index 0000000000000000000000000000000000000000..a96b5bf33adfb9673d05a917b229771725998ef4 GIT binary patch literal 172 zcmZ?wbh9u|WMW8R_#(*gZL<821$y77DSw}({(Xk(&lMIwmzw;Tr~7lY&9Ak#-=-@5 zTyFMbk-^VZR^R7pf1j=SYn}a%#YPN7109e`kX;O{h6*ZuDVg&!R;^nzQ-$M_iR(t4 mHbGY&VV3sh!yhYn*jSnz76dTNyRf3fYi-o}8*fZl7_0%-_c%cS literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-config-on.gif b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-config-on.gif new file mode 100644 index 0000000000000000000000000000000000000000..e3b6d7c0f723648fcd5d7b23b470d4c58d4d9b13 GIT binary patch literal 335 zcmZ?wbh9u|9ihti+ z`}^$F&$R(RS2_MzY5!xf#ozl|f9@&%`*8b@g=YWW-Tbl4`tQrLKlhgY|NsBT0zC$b zfey$7kY60wN*tyXc<4y=pI9>Kp`^w9qon8M+tBFjE&7LNqe`~^&c hj7yd-aS~HzTfN$aL6m!=ySilew(UE1MmjQB0{}?lkB$HU literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-spindown-closed.gif b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-spindown-closed.gif new file mode 100644 index 0000000000000000000000000000000000000000..ad4bd3781b52d9681013c66b341a674ca6df1153 GIT binary patch literal 103 zcmZ?wbhEHbWMg1w_{_!7+uOTu-@bM0*3FwYueG&x*|KH#?%jL;{{6Xg=W1(f|NsBb tfC?0Uvam8Ra53nBgh6IFu!smKxQ6ahxiR|)quW;AhsPMh3j+ihtN~u^Bk%wK literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-spindown-open.gif b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/demo-spindown-open.gif new file mode 100644 index 0000000000000000000000000000000000000000..e1c60aa558ebc4701d66d89c893b9185d92926ae GIT binary patch literal 105 zcmZ?wbhEHbWM^Pw*v!Rn?%cV3`}VC{w{G6Nd9AIj%a$#>ckkZ&_wRdqduwZJ|NsBb vfC?0UvM@3*a53nBgh6I7u!spPwVb$6c!g7Y5WAt|d?6L5pNhxD85yhrk)R_C literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/icon-docs-info.gif b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/images/icon-docs-info.gif new file mode 100644 index 0000000000000000000000000000000000000000..ea6d2bece713351eb4b8eef968c3891322093624 GIT binary patch literal 206 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 GZ~qHVLrA>< literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/index.html new file mode 100644 index 00000000000..0bdee3d686a --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/index.html @@ -0,0 +1,321 @@ + + + + + jQuery UI Demos + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    Interactions
    +
    Draggable
    +
    Droppable
    +
    Resizable
    +
    Selectable
    +
    Sortable
    +
    Widgets
    +
    Accordion
    +
    Autocomplete
    +
    Button
    +
    Datepicker
    +
    Dialog
    +
    Progressbar
    +
    Slider
    +
    Tabs
    +
    Effects
    +
    Color Animation
    +
    Toggle Class
    +
    Add Class
    +
    Remove Class
    +
    Switch Class
    +
    Effect
    +
    Toggle
    +
    Hide
    +
    Show
    +
    Utilities
    +
    Position
    +
    About jQuery UI
    +
    Getting Started
    +
    Upgrade Guide
    +
    Changelog
    +
    Roadmap
    +
    Subversion Access
    +
    UI Developer Guidelines
    +
    Theming
    +
    Theming jQuery UI
    +
    jQuery UI CSS Framework
    +
    ThemeRoller application
    +
    Theme Switcher Widget
    + +
    +
    + +
    + +

    Instructions

    +

    + These demos showcase some common uses of each jQuery UI plugin. Simply copy and paste code from the demos to get started. Have fun playing with them. +

    + +
    + +
    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/cycler.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/cycler.html new file mode 100644 index 00000000000..b52e2272461 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/cycler.html @@ -0,0 +1,122 @@ + + + + + jQuery UI Position - Default functionality + + + + + + + + + + + +
    + + + + + + + + +
    + + + +
    +

    A prototype for the Photoviewer using Position to place images at the center, left and right and cycle them. +
    Use the links at the top to cycle, or click on the images on the left and right. +
    Note how the images are repositioned when resizing the window. +
    Warning: Doesn't currently work inside the demo viewer; open in a new window instead!

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/default.html new file mode 100644 index 00000000000..87fc8e38a1f --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/default.html @@ -0,0 +1,153 @@ + + + + + jQuery UI Position - Default functionality + + + + + + + + + + + + + +
    + +
    +

    + This is the position parent element. +

    +
    + +
    +

    + to position +

    +
    + +
    +

    + to position 2 +

    +
    + +
    + position... +
    + my: + + +
    +
    + at: + + +
    +
    + offset: + +
    +
    + collision: + + +
    +
    + +
    + + + +
    +

    Use the form controls to configure the positioning, or drag the positioned element to modify its offset. +
    Drag around the parent element to see collision detection in action.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/images/earth.jpg b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/images/earth.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5477f75461b5de2dfe21b4e9bf8d65870487332 GIT binary patch literal 29850 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� zgjFG`8@XP{*3!(G0$)Ng%zZ#_<2>KEtmt#cnUvJ5e9`i5^1-8|T4*Jo6&wf?LfDR9 zV8^>)S`S$Gu1f<_L5Jz5nUK)r$xtC&_%(LY%P=;2~!GX7|t9-aUQRl3b+uJ`!a3*!Z+ ztH1Q|Sg%UvgaiGmx%nLrQS+b^gA0w5h;GZT(-c<00D~!vl!hdz%^|mbm^Ed zbi@6nEm=gL(xl!>_F=@d>ymsHCXcZp0bghf;8vGZN=>3wm5W;l5v1bJOftF<^`|5L z)<9of+-a$6HGhUb0RV>c2cIwG8CrJ7OFD_|!xE)o*WsyjCq*YIfJ0#1>dZM#6%32b zD={_=Oy)_JCeSQE5Ljb80TpCWM@Hvi!6-|@U}}+A4f&wikYC^`A_HakAf86U)ua18 zKSB0aeYs-Jc=ycLWbrU_=|QY-(l8lxdkbl<_|Fe=@;V2H9fJ@kB@ zba(n->181HD&p*rRo-sf{j~y}%$yN+r=rrvp4Sb|KX)!DJp~>FTEvSm77r>W&|Zbn zfEI36juE;f;knU$EirL^qBKf5IgcL!XS$Op##*~9nJy===_=G}-=e@xp!JPsDY(5J zV@R1mxX8$;GwB?lzHBqMIe914ZZipS zeAO;-aO+c*-9i`b!0^85{pLUSW~bAQZ1UixDtUD(n(18zj_eK^U}Dox~G z@Vf?1#L2nW{{RG(SNn zU`S{00^^y6bE@RgQscL@K>@pFMRCdHaS^b?2Q!neFfhZ6b#ELO4Dzg8QHVr!U^_QFWyj$mvv7QWcsMaBjyj+8;5ftZtM2B|B3dVgbC8coqZNac)`Y{gfo~Wv_`UrQQs0osi07qiFE1bHy*98 zQzReBgb*u4>8}d;w}OQ6)-cbkMhdH7z%D-~$t_@yqBGW>Cz)ZZ+`X8o;b!1PG1+E< z6%=ViPEeIr3Rvw`09?1=s(D2S%u{rhX)PE$JjjozT#IlH-8nxn-JR|4 zr~%~-iq>L>DTLXWvUSrw%4(KKV)LenBcKJl33`>)ytb~%dwFLjRe^Xr2ezyPkH8OZ zA~X-6EYd_gc5e2hdwW{Z$(eItLUKE**Xh3nqdwDLP4PJrGcAR&Tz0 z!X-V0e%S%w`*l2G!jzbVCi)3V|YfpY6 zX}=2Q@-%v6@D&C*s5LC{m1l(>c7TF)4r2K+CZeKwLc6paC`k4ULIsMe>#$|HI;Za| z>|X?OHdGTm`ZlvrBnj|+WMH|b#`P7`?39iu<6IOL$Vni{cEU-A043TAJVQM)mOsAR z*_Cjqz}1TfijQYJH!hICg1WdR@SKpsOE7|RYI;_0ftnR9L*Sbq!yCI7rlH33eiV#g zBmnJle~n|6VTR+8REhCws*2rHgI+kuwA*Xe<-}l3HCnLIDAr9R7pk8XZis1du({E_ zh9(NBwzfC1eg z^@3|93LxMY7G#oGsnkfSq>PN`zCVqqI9p)S$myc zLZ&XYRn(en?G-1dOmCLDTFEL(7fVvfTSu*<*=48zChdSvPnR`sJlgm!bGFX@c~f`W ODe}YFt1s}+{C@yBRIT9v literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/images/flight.jpg b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/images/flight.jpg new file mode 100644 index 0000000000000000000000000000000000000000..362bd1a2239560b9f235b7a08e0cad7e4834a419 GIT binary patch literal 33637 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 literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/images/rocket.jpg b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/images/rocket.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c0495c61dc645e7cb4f780dc0898063b3ee0f5b GIT binary patch literal 32986 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 YpC#}1v~r{^XTDoM_E2Q}?K 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 F{{=@-(3=1N literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/index.html new file mode 100644 index 00000000000..498c09b2bf9 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/position/index.html @@ -0,0 +1,19 @@ + + + + + jQuery UI Position Demo + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/animated.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/animated.html new file mode 100644 index 00000000000..73f54772680 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/animated.html @@ -0,0 +1,44 @@ + + + + + jQuery UI Progressbar - Animated + + + + + + + + + + + +
    + +
    + +
    + + + +
    +

    +This progressbar has an animated fill by setting the +background-image +on the +.ui-progressbar-value +element, using css. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/default.html new file mode 100644 index 00000000000..5c6ca43db7e --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/default.html @@ -0,0 +1,35 @@ + + + + + jQuery UI Progressbar - Default functionality + + + + + + + + + + +
    + +
    + +
    + + + +
    +

    Default determinate progress bar.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/images/pbar-ani.gif b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/images/pbar-ani.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb59a04f909a30094fc0f1c15271cf1eeacc6bd2 GIT binary patch literal 7970 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 GZ~qHVLrA>< literal 0 HcmV?d00001 diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/index.html new file mode 100644 index 00000000000..9836f59aa85 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/index.html @@ -0,0 +1,20 @@ + + + + + jQuery UI Progressbar Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/resize.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/resize.html new file mode 100644 index 00000000000..adc1fbbfb1e --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/progressbar/resize.html @@ -0,0 +1,40 @@ + + + + + jQuery UI Progressbar - Resizable + + + + + + + + + + + + +
    + +
    +
    +
    + +
    + + + +
    +

    The progress bar's widths are specified in percentages for flexible sizing so it will resize to fit its container. Try resizing the height and width of this bar to see how it maintains the correct proportions. (This is not necessarily a real-world example, but it's a good illustration of how flexibly all the plugins are coded.)

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/removeClass/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/removeClass/default.html new file mode 100644 index 00000000000..3bd52e64089 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/removeClass/default.html @@ -0,0 +1,52 @@ + + + + + jQuery UI Effects - removeClass Demo + + + + + + + + + +
    + +
    +
    + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. +
    +
    + +Run Effect + +
    + + + +
    +

    Click the button above to preview the effect.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/removeClass/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/removeClass/index.html new file mode 100644 index 00000000000..f5bd6a0e424 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/removeClass/index.html @@ -0,0 +1,18 @@ + + + + + jQuery UI Effects Demos + + + + +
    +

    Examples

    + +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/animate.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/animate.html new file mode 100644 index 00000000000..c288d62bc2a --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/animate.html @@ -0,0 +1,43 @@ + + + + + jQuery UI Resizable - Animate + + + + + + + + + + + + +
    + +
    +

    Animate

    +
    + +
    + + + +
    +

    Animate the resize action using the animate option (boolean). When this option is set to true, drag the outline to the desired location; the element animates to that size on drag stop.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/aspect-ratio.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/aspect-ratio.html new file mode 100644 index 00000000000..421f2e4aaee --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/aspect-ratio.html @@ -0,0 +1,42 @@ + + + + + jQuery UI Resizable - Preserve aspect ratio + + + + + + + + + + + + +
    + +
    +

    Preserve aspect ratio

    +
    + +
    + + + +
    +

    Maintain the existing aspect ratio or set a new one to constrain the proportions on resize. Set the aspectRatio option to true, and optionally pass in a new ratio (i.e., 4/3)

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/constrain-area.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/constrain-area.html new file mode 100644 index 00000000000..a7003352c07 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/constrain-area.html @@ -0,0 +1,47 @@ + + + + + jQuery UI Resizable - Constrain resize area + + + + + + + + + #container { width: 300px; height: 300px; } + #container h3 { text-align: center; margin: 0; margin-bottom: 10px; } + #resizable { background-position: top left; width: 150px; height: 150px; } + #resizable, #container { padding: 0.5em; } + + + + + +
    + +
    +

    Containment

    +
    +

    Resizable

    +
    +
    + +
    + + + +
    +

    Define the boundaries of the resizable area. Use the containment option to specify a parent DOM element or a jQuery selector, like 'document.'

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/default.html new file mode 100644 index 00000000000..ded33329fbc --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/default.html @@ -0,0 +1,40 @@ + + + + + jQuery UI Resizable - Default functionality + + + + + + + + + + + + +
    + +
    +

    Resizable

    +
    + +
    + + + +
    +

    Enable any DOM element to be resizable. With the cursor grab the right or bottom border and drag to the desired width or height.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/delay-start.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/delay-start.html new file mode 100644 index 00000000000..6fc2cc2d61c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/delay-start.html @@ -0,0 +1,52 @@ + + + + + jQuery UI Resizable - Delay start + + + + + + + + + + + + +
    + +

    Time delay (ms):

    +
    +

    Time

    +
    + +

    Distance delay (px):

    +
    +

    Distance

    +
    + +
    + + + +
    +

    Delay the start of resizng for a number of milliseconds with the delay option; prevent resizing until the cursor is held down and dragged a specifed number of pixels with the distance option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/helper.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/helper.html new file mode 100644 index 00000000000..a3638561769 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/helper.html @@ -0,0 +1,43 @@ + + + + + jQuery UI Resizable - Helper + + + + + + + + + + + + +
    + +
    +

    Helper

    +
    + +
    + + + +
    +

    Display only an outline of the element while resizing by setting the helper option to a CSS class.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/index.html new file mode 100644 index 00000000000..45f400621dc --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/index.html @@ -0,0 +1,28 @@ + + + + + jQuery UI Resizable Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/max-min.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/max-min.html new file mode 100644 index 00000000000..81be5dd5db0 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/max-min.html @@ -0,0 +1,45 @@ + + + + + jQuery UI Resizable - Maximum / minimum size + + + + + + + + + + + + +
    + +
    +

    Resize larger / smaller

    +
    + +
    + + + +
    +

    Limit the resizable element to a maximum or minimum height or width using the maxHeight, maxWidth, minHeight, and minWidth options.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/snap-to-grid.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/snap-to-grid.html new file mode 100644 index 00000000000..568c1c743e2 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/snap-to-grid.html @@ -0,0 +1,42 @@ + + + + + jQuery UI Resizable - Snap to grid + + + + + + + + + + + + +
    + +
    +

    Grid

    +
    + +
    + + + +
    +

    Snap the resizable element to a grid. Set the dimensions of grid cells (height and width in pixels) with the grid option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/synchronous-resize.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/synchronous-resize.html new file mode 100644 index 00000000000..74e54da4794 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/synchronous-resize.html @@ -0,0 +1,49 @@ + + + + + jQuery UI Resizable - Synchronous resize + + + + + + + + + + + + +
    + +
    +

    Resize

    +
    + +
    +

    will also resize

    +
    + +
    + + + +
    +

    Resize multiple elements simultaneously by clicking and dragging the sides of one. Pass a shared selector into the alsoResize option.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/textarea.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/textarea.html new file mode 100644 index 00000000000..2d00e0ded40 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/textarea.html @@ -0,0 +1,41 @@ + + + + + jQuery UI Resizable - Textarea + + + + + + + + + + + + +
    + + + +
    + + + +
    +

    Display only an outline of the element while resizing by setting the helper option to a CSS class.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/visual-feedback.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/visual-feedback.html new file mode 100644 index 00000000000..fc61a6bcba7 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/resizable/visual-feedback.html @@ -0,0 +1,43 @@ + + + + + jQuery UI Resizable - Visual feedback + + + + + + + + + + + + +
    + +
    +

    Ghost

    +
    + +
    + + + +
    +

    Instead of showing the actual element during resize, set the ghost option to true to show a semi-transparent part of the element.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/default.html new file mode 100644 index 00000000000..983a04b3f2a --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/default.html @@ -0,0 +1,50 @@ + + + + + jQuery UI Selectable - Default functionality + + + + + + + + + + + + + +
    + +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    7. Item 4
    8. +
    9. Item 5
    10. +
    11. Item 6
    12. +
    13. Item 7
    14. +
    + +
    + + + +
    +

    Enable a DOM element (or group of elements) to be selectable. Draw a box with your cursor to select items. Hold down the Ctrl key to make multiple non-adjacent selections.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/display-grid.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/display-grid.html new file mode 100644 index 00000000000..b045eb99c17 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/display-grid.html @@ -0,0 +1,55 @@ + + + + + jQuery UI Selectable - Display as grid + + + + + + + + + + + + + +
    + +
      +
    1. 1
    2. +
    3. 2
    4. +
    5. 3
    6. +
    7. 4
    8. +
    9. 5
    10. +
    11. 6
    12. +
    13. 7
    14. +
    15. 8
    16. +
    17. 9
    18. +
    19. 10
    20. +
    21. 11
    22. +
    23. 12
    24. +
    + +
    + + + +
    +

    To arrange selectable items as a grid, give them identical dimensions and float them using CSS.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/index.html new file mode 100644 index 00000000000..21fa4d5a7eb --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/index.html @@ -0,0 +1,20 @@ + + + + + jQuery UI Selectable Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/serialize.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/serialize.html new file mode 100644 index 00000000000..18e35dae2c3 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/selectable/serialize.html @@ -0,0 +1,61 @@ + + + + + jQuery UI Selectable - Serialize + + + + + + + + + + + + + +
    + +

    +You've selected: none. +

    + +
      +
    1. Item 1
    2. +
    3. Item 2
    4. +
    5. Item 3
    6. +
    7. Item 4
    8. +
    9. Item 5
    10. +
    11. Item 6
    12. +
    + +
    + + + +
    +

    Write a function that fires on the stop event to collect the index values of selected items. Present values as feedback, or pass as a data string.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/show/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/show/default.html new file mode 100644 index 00000000000..49ca85675b3 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/show/default.html @@ -0,0 +1,104 @@ + + + + + jQuery UI Effects - Show Demo + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +

    Show

    +

    + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. +

    +
    +
    + + + +Run Effect + +
    + + + +
    +

    Click the button above to preview the effect.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/show/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/show/index.html new file mode 100644 index 00000000000..f5bd6a0e424 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/show/index.html @@ -0,0 +1,18 @@ + + + + + jQuery UI Effects Demos + + + + +
    +

    Examples

    + +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/colorpicker.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/colorpicker.html new file mode 100644 index 00000000000..8192e08a75c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/colorpicker.html @@ -0,0 +1,95 @@ + + + + + jQuery UI Slider - Colorpicker + + + + + + + + + + + + +
    + +

    + + Simple Colorpicker +

    + +
    +
    +
    + +
    + +
    + + + +
    +

    Combine three sliders to create a simple RGB colorpicker.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/default.html new file mode 100644 index 00000000000..fdcd4cff956 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/default.html @@ -0,0 +1,37 @@ + + + + + jQuery UI Slider - Default functionality + + + + + + + + + + + + +
    + +
    + +
    + + + +
    +

    The basic slider is horizontal and has a single handle that can be moved with the mouse or by using the arrow keys.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/hotelrooms.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/hotelrooms.html new file mode 100644 index 00000000000..2ba4b9970f7 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/hotelrooms.html @@ -0,0 +1,59 @@ + + + + + jQuery UI Slider - Range with fixed minimum + + + + + + + + + + + + +
    + +
    + + +
    + +
    + + + +
    +

    How to bind a slider to an existing select element. The select stays visible to display the change. When the select is changed, the slider is updated, too.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/index.html new file mode 100644 index 00000000000..caf68fe978c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/index.html @@ -0,0 +1,29 @@ + + + + + jQuery UI Slider Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/multiple-vertical.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/multiple-vertical.html new file mode 100644 index 00000000000..372ad2d93cf --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/multiple-vertical.html @@ -0,0 +1,77 @@ + + + + + jQuery UI Slider - Multiple sliders + + + + + + + + + + + + +
    + +

    + + Master volume +

    + +
    + +

    + + Graphic EQ +

    + +
    + 88 + 77 + 55 + 33 + 40 + 45 + 70 +
    + +
    + + + +
    +

    Combine horizontal and vertical sliders, each with their own options, to create the UI for a music player.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/range-vertical.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/range-vertical.html new file mode 100644 index 00000000000..2a1a8b4e957 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/range-vertical.html @@ -0,0 +1,51 @@ + + + + + jQuery UI Slider - Vertical range slider + + + + + + + + + + + + +
    + +

    + + +

    + +
    + +
    + + + +
    +

    Change the orientation of the range slider to vertical. Assign a height value via .height() or by setting the height through CSS, and set the orientation option to "vertical."

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/range.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/range.html new file mode 100644 index 00000000000..3fd156dc339 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/range.html @@ -0,0 +1,52 @@ + + + + + jQuery UI Slider - Range slider + + + + + + + + + + + + +
    + +

    + + +

    + +
    + +
    + + + +
    +

    Set the range option to true to capture a range of values with two drag handles. The space between the handles is filled with a different background color to indicate those values are selected.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/rangemax.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/rangemax.html new file mode 100644 index 00000000000..899efb28aa2 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/rangemax.html @@ -0,0 +1,50 @@ + + + + + jQuery UI Slider - Range with fixed maximum + + + + + + + + + + + + +
    + +

    + + +

    +
    + +
    + + + +
    +

    Fix the maximum value of the range slider so that the user can only select a minimum. Set the range option to "max."

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/rangemin.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/rangemin.html new file mode 100644 index 00000000000..3e077d9091a --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/rangemin.html @@ -0,0 +1,51 @@ + + + + + jQuery UI Slider - Range with fixed minimum + + + + + + + + + + + + +
    + +

    + + +

    + +
    + +
    + + + +
    +

    Fix the minimum value of the range slider so that the user can only select a maximum. Set the range option to "min."

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/side-scroll.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/side-scroll.html new file mode 100644 index 00000000000..666d480a028 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/side-scroll.html @@ -0,0 +1,140 @@ + + + + + jQuery UI Slider - Slider scrollbar + + + + + + + + + + + + +
    + +
    +
    +
    1
    +
    2
    +
    3
    +
    4
    +
    5
    +
    6
    +
    7
    +
    8
    +
    9
    +
    10
    +
    11
    +
    12
    +
    13
    +
    14
    +
    15
    +
    16
    +
    17
    +
    18
    +
    19
    +
    20
    +
    +
    +
    +
    +
    + +
    + + + +
    +

    Use a slider to manipulate the positioning of content on the page. In this case, it acts as a scrollbar with the potential to capture values if needed.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/slider-vertical.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/slider-vertical.html new file mode 100644 index 00000000000..479e778ff9c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/slider-vertical.html @@ -0,0 +1,52 @@ + + + + + jQuery UI Slider - Vertical slider + + + + + + + + + + + + +
    + +

    + + +

    + +
    + +
    + + + +
    +

    Change the orientation of the slider to vertical. Assign a height value via .height() or by setting the height through CSS, and set the orientation option to "vertical."

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/steps.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/steps.html new file mode 100644 index 00000000000..c49e26fb385 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/steps.html @@ -0,0 +1,51 @@ + + + + + jQuery UI Slider - Snap to increments + + + + + + + + + + + + +
    + +

    + + +

    + +
    + +
    + + + +
    +

    Increment slider values with the step option set to an integer, commonly a dividend of the slider's maximum value. The default increment is 1.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/tabs.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/tabs.html new file mode 100644 index 00000000000..440ac587d2d --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/slider/tabs.html @@ -0,0 +1,67 @@ + + + + + jQuery UI Slider - Snap to increments + + + + + + + + + + + + + +
    + +
    + +
    + +
    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    +

    Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.

    +
    +
    +

    Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.

    +

    Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.

    +
    +
    + +
    + + + +
    +

    Control tabs with a slider.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/connect-lists-through-tabs.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/connect-lists-through-tabs.html new file mode 100644 index 00000000000..d466da80c86 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/connect-lists-through-tabs.html @@ -0,0 +1,78 @@ + + + + + jQuery UI Sortable - Connect lists with Tabs + + + + + + + + + + + + + +
    + +
    + +
    +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
    • Item 4
    • +
    • Item 5
    • +
    +
    +
    +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
    • Item 4
    • +
    • Item 5
    • +
    +
    +
    + +
    + + + +
    +

    Sort items from one list into another and vice versa, by dropping the list item on the appropriate tab above.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/connect-lists.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/connect-lists.html new file mode 100644 index 00000000000..d0b2c5ce1d7 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/connect-lists.html @@ -0,0 +1,58 @@ + + + + + jQuery UI Sortable - Connect lists + + + + + + + + + + + +
    + +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
    • Item 4
    • +
    • Item 5
    • +
    + +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
    • Item 4
    • +
    • Item 5
    • +
    + +
    + + + +
    +

    + Sort items from one list into another and vice versa, by passing a selector into + the connectWith option. The simplest way to do this is to + group all related lists with a CSS class, and then pass that class into the + sortable function (i.e., connectWith: '.myclass'). +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/default.html new file mode 100644 index 00000000000..d0ef0df69df --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/default.html @@ -0,0 +1,51 @@ + + + + + jQuery UI Sortable - Default functionality + + + + + + + + + + + +
    + +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
    • Item 4
    • +
    • Item 5
    • +
    • Item 6
    • +
    • Item 7
    • +
    + +
    + + + +
    +

    + Enable a group of DOM elements to be sortable. Click on and drag an + element to a new spot within the list, and the other items will adjust to + fit. By default, sortable items share draggable properties. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/delay-start.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/delay-start.html new file mode 100644 index 00000000000..48a9c1f6396 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/delay-start.html @@ -0,0 +1,67 @@ + + + + + jQuery UI Sortable - Delay start + + + + + + + + + + + +
    + +

    Time delay of 300ms:

    + +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
    • Item 4
    • +
    + +

    Distance delay of 15px:

    + +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
    • Item 4
    • +
    + +
    + + + +
    +

    + Prevent accidental sorting either by delay (time) or distance. Set a number of + milliseconds the element needs to be dragged before sorting starts + with the delay option. Set a distance in pixels the element + needs to be dragged before sorting starts with the distance + option. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/display-grid.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/display-grid.html new file mode 100644 index 00000000000..c32e309f30b --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/display-grid.html @@ -0,0 +1,54 @@ + + + + + jQuery UI Sortable - Display as grid + + + + + + + + + + + +
    + +
      +
    • 1
    • +
    • 2
    • +
    • 3
    • +
    • 4
    • +
    • 5
    • +
    • 6
    • +
    • 7
    • +
    • 8
    • +
    • 9
    • +
    • 10
    • +
    • 11
    • +
    • 12
    • +
    + +
    + + + +
    +

    + To arrange sortable items as a grid, give them identical dimensions and + float them using CSS. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/empty-lists.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/empty-lists.html new file mode 100644 index 00000000000..d1c968096d2 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/empty-lists.html @@ -0,0 +1,69 @@ + + + + + jQuery UI Sortable - Handle empty lists + + + + + + + + + + + +
    + +
      +
    • Can be dropped..
    • +
    • ..on an empty list
    • +
    • Item 3
    • +
    • Item 4
    • +
    • Item 5
    • +
    + +
      +
    • Cannot be dropped..
    • +
    • ..on an empty list
    • +
    • Item 3
    • +
    • Item 4
    • +
    • Item 5
    • +
    + +
      +
    + +
    + +
    + + + +
    +

    + Prevent all items in a list from being dropped into a separate, empty list + using the dropOnEmpty option set to false. By default, + sortable items can be dropped on empty lists. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/index.html new file mode 100644 index 00000000000..b307ef777ff --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/index.html @@ -0,0 +1,26 @@ + + + + + jQuery UI Sortable Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/items.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/items.html new file mode 100644 index 00000000000..334cdeb3463 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/items.html @@ -0,0 +1,70 @@ + + + + + jQuery UI Sortable - Include / exclude items + + + + + + + + + + + +
    + +

    Specify which items are sortable:

    + +
      +
    • Item 1
    • +
    • (I'm not sortable or a drop target)
    • +
    • (I'm not sortable or a drop target)
    • +
    • Item 4
    • +
    + +

    Cancel sorting (but keep as drop targets):

    + +
      +
    • Item 1
    • +
    • (I'm not sortable)
    • +
    • (I'm not sortable)
    • +
    • Item 4
    • +
    + +
    + + + +
    +

    + Specify which items are eligible to sort by passing a jQuery selector into + the items option. Items excluded from this option are not + sortable, nor are they valid targets for sortable items. +

    +

    + To only prevent sorting on certain items, pass a jQuery selector into the + cancel option. Cancelled items remain valid sort targets for + others. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/placeholder.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/placeholder.html new file mode 100644 index 00000000000..90198f3d1a3 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/placeholder.html @@ -0,0 +1,56 @@ + + + + + jQuery UI Sortable - Drop placeholder + + + + + + + + + + + +
    + +
      +
    • Item 1
    • +
    • Item 2
    • +
    • Item 3
    • +
    • Item 4
    • +
    • Item 5
    • +
    • Item 6
    • +
    • Item 7
    • +
    + +
    + + + +
    +

    + When dragging a sortable item to a new location, other items will make room + for the that item by shifting to allow white space between them. Pass a + class into the placeholder option to style that space to + be visible. Use the boolean forcePlaceholderSize option + to set dimensions on the placeholder. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/portlets.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/portlets.html new file mode 100644 index 00000000000..1e5e956d8a6 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/sortable/portlets.html @@ -0,0 +1,96 @@ + + + + + jQuery UI Sortable - Portlets + + + + + + + + + + + +
    + +
    + +
    +
    Feeds
    +
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit
    +
    + +
    +
    News
    +
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit
    +
    + +
    + +
    + +
    +
    Shopping
    +
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit
    +
    + +
    + +
    + +
    +
    Links
    +
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit
    +
    + +
    +
    Images
    +
    Lorem ipsum dolor sit amet, consectetuer adipiscing elit
    +
    + +
    + +
    + + + +
    +

    + Enable portlets (styled divs) as sortables and use the connectWith + option to allow sorting between columns. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/switchClass/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/switchClass/default.html new file mode 100644 index 00000000000..c0bcd6b315e --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/switchClass/default.html @@ -0,0 +1,47 @@ + + + + + jQuery UI Effects - switchClass Demo + + + + + + + + + +
    + +
    +
    + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. +
    +
    +Run Effect + +
    + + + +
    +

    Click the button above to preview the effect.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/switchClass/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/switchClass/index.html new file mode 100644 index 00000000000..f5bd6a0e424 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/switchClass/index.html @@ -0,0 +1,18 @@ + + + + + jQuery UI Effects Demos + + + + +
    +

    Examples

    + +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax.html new file mode 100644 index 00000000000..c6262579151 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax.html @@ -0,0 +1,53 @@ + + + + + jQuery UI Tabs - Content via Ajax + + + + + + + + + + +
    + +
    + +
    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    + +
    + + + +
    +

    Fetch external content via Ajax for the tabs by setting an href value in the tab links. While the Ajax request is waiting for a response, the tab label changes to say "Loading...", then returns to the normal label once loaded.

    +

    Tabs 3 and 4 demonstrate slow-loading and broken AJAX tabs, and how to handle serverside errors in those cases. Note: These two require a webserver to interpret PHP. They won't work from the filesystem.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content1.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content1.html new file mode 100644 index 00000000000..472bdfb366b --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content1.html @@ -0,0 +1,4 @@ +

    This content was loaded via ajax.

    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +

    Mauris vitae ante. Curabitur augue. Nulla purus nibh, lobortis ut, feugiat at, aliquam id, purus. Sed venenatis, lorem venenatis volutpat commodo, purus quam lacinia justo, mattis interdum pede pede a odio. Fusce nibh. Morbi nisl mauris, dapibus in, tristique eget, accumsan et, pede. Donec mauris risus, pulvinar ut, faucibus eu, mollis in, nunc. In augue massa, commodo a, cursus vehicula, varius eu, dui. Suspendisse sodales suscipit lorem. Morbi malesuada, eros quis condimentum dignissim, lectus nibh tristique urna, non bibendum diam massa vel risus. Morbi suscipit. Proin egestas, eros at scelerisque scelerisque, dolor lacus fringilla lacus, ut ullamcorper mi magna at quam. Aliquam sed elit. Aliquam turpis purus, congue quis, iaculis id, ullamcorper sit amet, justo. Maecenas sed mauris. Proin magna justo, interdum in, tincidunt eu, viverra eu, turpis. Suspendisse mollis. In magna. Phasellus pellentesque, urna pellentesque convallis pellentesque, augue sem blandit pede, at rhoncus libero nisl a odio.

    +

    Sed vitae nibh non magna semper tempor. Duis dolor. Nam congue laoreet arcu. Fusce lobortis enim quis ligula. Maecenas commodo odio id mi. Maecenas scelerisque tellus eu odio. Etiam dolor purus, lacinia a, imperdiet in, aliquam et, eros. In pellentesque. Nullam ac massa. Integer et turpis. Ut quam augue, congue non, imperdiet id, eleifend ac, nisi. Etiam ac arcu. Cras iaculis accumsan erat. Nullam vulputate sapien nec nisi pretium rhoncus. Aliquam a nibh. Vivamus est ante, fermentum a, tincidunt ut, imperdiet nec, velit. Aenean non tortor. Sed nec mauris eget tellus condimentum rutrum.

    \ No newline at end of file diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content2.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content2.html new file mode 100644 index 00000000000..18b03e40baa --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content2.html @@ -0,0 +1,4 @@ +

    This other content was loaded via ajax.

    +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean nec turpis justo, et facilisis ligula. In congue interdum odio, a scelerisque eros posuere ac. Aenean massa tellus, dictum sit amet laoreet ut, aliquam in orci. Duis eu aliquam ligula. Nullam vel placerat ligula. Fusce venenatis viverra dictum. Phasellus dui dolor, imperdiet in sodales at, mattis sed libero. Morbi ac ipsum ligula. Quisque suscipit dui vel diam pretium nec cursus lacus malesuada. Donec sollicitudin, eros eget dignissim mollis, risus leo feugiat tellus, vel posuere nisl ipsum eu erat. Quisque posuere lacinia imperdiet. Quisque nunc leo, elementum quis ultricies et, vehicula sit amet turpis. Nullam sed nunc nec nibh condimentum mattis. Quisque sed ligula sit amet nisi ultricies bibendum eget id nisi.

    +

    Proin ut erat vel nunc tincidunt commodo. Curabitur feugiat, nisi et vehicula viverra, nisl orci eleifend arcu, sed blandit lectus nisl quis nisi. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Aenean rutrum gravida velit ac imperdiet. Integer vitae arcu risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin tincidunt orci at leo egestas porta. Vivamus ac augue et enim bibendum hendrerit ut id urna. Donec sollicitudin pulvinar turpis vitae scelerisque. Etiam tempor porttitor est sed blandit. Phasellus varius consequat leo eget tincidunt. Aliquam ac dui lectus. In et consectetur orci. Duis posuere nulla ac turpis faucibus vestibulum. Sed ut velit et dolor rhoncus dapibus. Sed sit amet pellentesque est.

    +

    Nam in volutpat orci. Morbi sit amet orci in erat egestas dignissim. Etiam mi sapien, tempus sed iaculis a, adipiscing quis tellus. Suspendisse potenti. Nam malesuada tristique vestibulum. In tempor tellus dignissim neque consectetur eu vestibulum nisl pellentesque. Phasellus ultrices cursus velit, id aliquam nisl fringilla quis. Cras varius elit sed urna ultrices congue. Sed ornare odio sed velit pellentesque id varius nisl sodales. Sed auctor ligula egestas mi pharetra ut consectetur erat pharetra.

    \ No newline at end of file diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content3-slow.php b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content3-slow.php new file mode 100644 index 00000000000..7ad43ec06bd --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content3-slow.php @@ -0,0 +1,7 @@ + +

    This content was loaded via ajax, though it took a second.

    +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean nec turpis justo, et facilisis ligula. In congue interdum odio, a scelerisque eros posuere ac. Aenean massa tellus, dictum sit amet laoreet ut, aliquam in orci. Duis eu aliquam ligula. Nullam vel placerat ligula. Fusce venenatis viverra dictum. Phasellus dui dolor, imperdiet in sodales at, mattis sed libero. Morbi ac ipsum ligula. Quisque suscipit dui vel diam pretium nec cursus lacus malesuada. Donec sollicitudin, eros eget dignissim mollis, risus leo feugiat tellus, vel posuere nisl ipsum eu erat. Quisque posuere lacinia imperdiet. Quisque nunc leo, elementum quis ultricies et, vehicula sit amet turpis. Nullam sed nunc nec nibh condimentum mattis. Quisque sed ligula sit amet nisi ultricies bibendum eget id nisi.

    +

    Proin ut erat vel nunc tincidunt commodo. Curabitur feugiat, nisi et vehicula viverra, nisl orci eleifend arcu, sed blandit lectus nisl quis nisi. In hac habitasse platea dictumst. In hac habitasse platea dictumst. Aenean rutrum gravida velit ac imperdiet. Integer vitae arcu risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Proin tincidunt orci at leo egestas porta. Vivamus ac augue et enim bibendum hendrerit ut id urna. Donec sollicitudin pulvinar turpis vitae scelerisque. Etiam tempor porttitor est sed blandit. Phasellus varius consequat leo eget tincidunt. Aliquam ac dui lectus. In et consectetur orci. Duis posuere nulla ac turpis faucibus vestibulum. Sed ut velit et dolor rhoncus dapibus. Sed sit amet pellentesque est.

    +

    Nam in volutpat orci. Morbi sit amet orci in erat egestas dignissim. Etiam mi sapien, tempus sed iaculis a, adipiscing quis tellus. Suspendisse potenti. Nam malesuada tristique vestibulum. In tempor tellus dignissim neque consectetur eu vestibulum nisl pellentesque. Phasellus ultrices cursus velit, id aliquam nisl fringilla quis. Cras varius elit sed urna ultrices congue. Sed ornare odio sed velit pellentesque id varius nisl sodales. Sed auctor ligula egestas mi pharetra ut consectetur erat pharetra.

    \ No newline at end of file diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content4-broken.php b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content4-broken.php new file mode 100644 index 00000000000..55ea2fe9f84 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/ajax/content4-broken.php @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/bottom.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/bottom.html new file mode 100644 index 00000000000..4f0e3c2a441 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/bottom.html @@ -0,0 +1,60 @@ + + + + + jQuery UI Tabs - Tabs at bottom + + + + + + + + + + + +
    + +
    + +
    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    +

    Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.

    +
    +
    +

    Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.

    +

    Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.

    +
    +
    + +
    + + + +
    +

    With some additional CSS (for positioning) and JS (to put the right classes on elements) the tabs can be placed below their content.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/collapsible.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/collapsible.html new file mode 100644 index 00000000000..1fba71041b5 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/collapsible.html @@ -0,0 +1,55 @@ + + + + + jQuery UI Tabs - Collapse content + + + + + + + + + + +
    + +
    + +
    +

    Click this tab again to close the content pane.

    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    +

    Click this tab again to close the content pane.

    +

    Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.

    +
    +
    +

    Click this tab again to close the content pane.

    +

    Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.

    +
    +
    + +
    + + + +
    +

    Click the selected tab to toggle its content closed/open. To enable this functionality, set the collapsible option to true.

    +
    collapsible: true
    +
    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/cookie.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/cookie.html new file mode 100644 index 00000000000..b168d29ce36 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/cookie.html @@ -0,0 +1,56 @@ + + + + + jQuery UI Tabs - Default functionality + + + + + + + + + + + +
    + +
    + +
    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    +

    Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.

    +
    +
    +

    Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.

    +

    Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.

    +
    +
    + +
    + + + +
    +

    Looks the same as the default demo, but uses cookie to store the selected tab, and restore it when the page (re)loads. +The cookie is stored for a day, so tabs will be restored even after closing the browser. Use cookie: {} for using cookies with default options.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/default.html new file mode 100644 index 00000000000..a892509ce77 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/default.html @@ -0,0 +1,49 @@ + + + + + jQuery UI Tabs - Default functionality + + + + + + + + + + +
    + +
    + +
    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    +

    Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.

    +
    +
    +

    Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.

    +

    Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.

    +
    +
    + +
    + + + +
    +

    Click tabs to swap between content that is broken into logical sections.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/index.html new file mode 100644 index 00000000000..c0d66843510 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/index.html @@ -0,0 +1,25 @@ + + + + + jQuery UI Tabs Demos + + + + + + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/manipulation.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/manipulation.html new file mode 100644 index 00000000000..8b8ddf4e6e5 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/manipulation.html @@ -0,0 +1,124 @@ + + + + + jQuery UI Tabs - Simple manipulation + + + + + + + + + + + + + + +
    + +
    +
    +
    + + + + +
    +
    +
    + + + +
    + +
    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    + +
    + + + +
    +

    Simple tabs adding and removing.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/mouseover.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/mouseover.html new file mode 100644 index 00000000000..b19b2af09d4 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/mouseover.html @@ -0,0 +1,53 @@ + + + + + jQuery UI Tabs - Open on mouseover + + + + + + + + + + +
    + +
    + +
    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    +

    Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.

    +
    +
    +

    Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.

    +

    Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.

    +
    +
    + +
    + + + +
    +

    Toggle sections open/closed on mouseover with the event option. The default value for event is "click."

    +
    event: 'mouseover'
    +
    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/sortable.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/sortable.html new file mode 100644 index 00000000000..ba8196d7174 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/sortable.html @@ -0,0 +1,58 @@ + + + + + jQuery UI Tabs - Sortable + + + + + + + + + + + + +
    + +
    + +
    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    +

    Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.

    +
    +
    +

    Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.

    +

    Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.

    +
    +
    + +
    + + + +
    +

    Drag the tabs above to re-order them.

    +

    +Making tabs sortable is as simple as calling +.sortable() +on the +.ui-tabs-nav +element. +

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/vertical.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/vertical.html new file mode 100644 index 00000000000..4ddb5c9c995 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/tabs/vertical.html @@ -0,0 +1,61 @@ + + + + + jQuery UI Tabs - Vertical Tabs functionality + + + + + + + + + + + +
    + +
    + +
    +

    Content heading 1

    +

    Proin elit arcu, rutrum commodo, vehicula tempus, commodo a, risus. Curabitur nec arcu. Donec sollicitudin mi sit amet mauris. Nam elementum quam ullamcorper ante. Etiam aliquet massa et lorem. Mauris dapibus lacus auctor risus. Aenean tempor ullamcorper leo. Vivamus sed magna quis ligula eleifend adipiscing. Duis orci. Aliquam sodales tortor vitae ipsum. Aliquam nulla. Duis aliquam molestie erat. Ut et mauris vel pede varius sollicitudin. Sed ut dolor nec orci tincidunt interdum. Phasellus ipsum. Nunc tristique tempus lectus.

    +
    +
    +

    Content heading 2

    +

    Morbi tincidunt, dui sit amet facilisis feugiat, odio metus gravida ante, ut pharetra massa metus id nunc. Duis scelerisque molestie turpis. Sed fringilla, massa eget luctus malesuada, metus eros molestie lectus, ut tempus eros massa ut dolor. Aenean aliquet fringilla sem. Suspendisse sed ligula in ligula suscipit aliquam. Praesent in eros vestibulum mi adipiscing adipiscing. Morbi facilisis. Curabitur ornare consequat nunc. Aenean vel metus. Ut posuere viverra nulla. Aliquam erat volutpat. Pellentesque convallis. Maecenas feugiat, tellus pellentesque pretium posuere, felis lorem euismod felis, eu ornare leo nisi vel felis. Mauris consectetur tortor et purus.

    +
    +
    +

    Content heading 3

    +

    Mauris eleifend est et turpis. Duis id erat. Suspendisse potenti. Aliquam vulputate, pede vel vehicula accumsan, mi neque rutrum erat, eu congue orci lorem eget lorem. Vestibulum non ante. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Fusce sodales. Quisque eu urna vel enim commodo pellentesque. Praesent eu risus hendrerit ligula tempus pretium. Curabitur lorem enim, pretium nec, feugiat nec, luctus a, lacus.

    +

    Duis cursus. Maecenas ligula eros, blandit nec, pharetra at, semper at, magna. Nullam ac lacus. Nulla facilisi. Praesent viverra justo vitae neque. Praesent blandit adipiscing velit. Suspendisse potenti. Donec mattis, pede vel pharetra blandit, magna ligula faucibus eros, id euismod lacus dolor eget odio. Nam scelerisque. Donec non libero sed nulla mattis commodo. Ut sagittis. Donec nisi lectus, feugiat porttitor, tempor ac, tempor vitae, pede. Aenean vehicula velit eu tellus interdum rutrum. Maecenas commodo. Pellentesque nec elit. Fusce in lacus. Vivamus a libero vitae lectus hendrerit hendrerit.

    +
    +
    + +
    + + + +
    +

    Click tabs to swap between content that is broken into logical sections.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggle/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggle/default.html new file mode 100644 index 00000000000..475109e1145 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggle/default.html @@ -0,0 +1,94 @@ + + + + + jQuery UI Effects - Toggle Demo + + + + + + + + + + + + + + + + + + + + +
    + +
    +
    +

    Toggle

    +

    + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. Nulla lorem metus, adipiscing ut, luctus sed, hendrerit vitae, mi. +

    +
    +
    + + + +Run Effect +
    + + + +
    +

    Click the button above to preview the effect.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggle/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggle/index.html new file mode 100644 index 00000000000..f5bd6a0e424 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggle/index.html @@ -0,0 +1,18 @@ + + + + + jQuery UI Effects Demos + + + + +
    +

    Examples

    + +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggleClass/default.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggleClass/default.html new file mode 100644 index 00000000000..ed3eb5179b7 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggleClass/default.html @@ -0,0 +1,46 @@ + + + + + jQuery UI Effects - toggleClass Demo + + + + + + + + + +
    + +
    +
    + Etiam libero neque, luctus a, eleifend nec, semper at, lorem. Sed pede. +
    +
    + +Run Effect + +
    + + + +
    +

    Click the button above to preview the effect.

    +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggleClass/index.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggleClass/index.html new file mode 100644 index 00000000000..f5bd6a0e424 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/demos/toggleClass/index.html @@ -0,0 +1,18 @@ + + + + + jQuery UI Effects Demos + + + + +
    +

    Examples

    + +
    + + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/accordion.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/accordion.html new file mode 100644 index 00000000000..2b82be2af47 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/accordion.html @@ -0,0 +1,1017 @@ + + +
    +

    jQuery UI Accordion

    +
    +

    Overview

    +
    +

    Make the selected elements Accordion widgets. Semantic requirements:

    +

    The markup of your accordion container needs pairs of headers and content panels:

    +
    <div id="accordion">
    +    <h3><a href="#">First header</a></h3>
    +    <div>First content</div>
    +    <h3><a href="#">Second header</a></h3>
    +    <div>Second content</div>
    +</div>
    +

    If you use a different element for the header, specify the header-option with an appropriate selector, eg. header: 'a.header'. The content element must be always next to its header.

    +

    If you have links inside the accordion content and use a-elements as headers, add a class to them and use that as the header, eg. header: 'a.header'.

    +

    Use activate(Number) to change the active content programmatically.

    +

    NOTE: If you want multiple sections open at once, don't use an accordion

    +

    An accordion doesn't allow more than one content panel to be open at the same time, and it takes a lot of effort to do that. If you are looking for a widget that allows more than one content panel to be open, don't use this. Usually it can be written with a few lines of jQuery instead, something like this:

    +
    jQuery(document).ready(function(){
    +	$('.accordion .head').click(function() {
    +		$(this).next().toggle();
    +		return false;
    +	}).next().hide();
    +});
    +

    Or animated:

    +
    jQuery(document).ready(function(){
    +	$('.accordion .head').click(function() {
    +		$(this).next().toggle('slow');
    +		return false;
    +	}).next().hide();
    +});
    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Widget
    • +
    • UI Effects Core (Optional - only for non-default animations)
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Accordion.
    +

    +
    $("#accordion").accordion();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  
    +  <script>
    +  $(document).ready(function() {
    +    $("#accordion").accordion();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="accordion">
    +	<h3><a href="#">Section 1</a></h3>
    +	<div>
    +		<p>
    +		Mauris mauris ante, blandit et, ultrices a, suscipit eget, quam. Integer
    +		ut neque. Vivamus nisi metus, molestie vel, gravida in, condimentum sit
    +		amet, nunc. Nam a nibh. Donec suscipit eros. Nam mi. Proin viverra leo ut
    +		odio. Curabitur malesuada. Vestibulum a velit eu ante scelerisque vulputate.
    +		</p>
    +	</div>
    +	<h3><a href="#">Section 2</a></h3>
    +	<div>
    +		<p>
    +		Sed non urna. Donec et ante. Phasellus eu ligula. Vestibulum sit amet
    +		purus. Vivamus hendrerit, dolor at aliquet laoreet, mauris turpis porttitor
    +		velit, faucibus interdum tellus libero ac justo. Vivamus non quam. In
    +		suscipit faucibus urna.
    +		</p>
    +	</div>
    +	<h3><a href="#">Section 3</a></h3>
    +	<div>
    +		<p>
    +		Nam enim risus, molestie et, porta ac, aliquam ac, risus. Quisque lobortis.
    +		Phasellus pellentesque purus in massa. Aenean in pede. Phasellus ac libero
    +		ac tellus pellentesque semper. Sed ac felis. Sed commodo, magna quis
    +		lacinia ornare, quam ante aliquam nisi, eu iaculis leo purus venenatis dui.
    +		</p>
    +		<ul>
    +			<li>List item one</li>
    +			<li>List item two</li>
    +			<li>List item three</li>
    +		</ul>
    +	</div>
    +	<h3><a href="#">Section 4</a></h3>
    +	<div>
    +		<p>
    +		Cras dictum. Pellentesque habitant morbi tristique senectus et netus
    +		et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in
    +		faucibus orci luctus et ultrices posuere cubilia Curae; Aenean lacinia
    +		mauris vel est.
    +		</p>
    +		<p>
    +		Suspendisse eu nisl. Nullam ut libero. Integer dignissim consequat lectus.
    +		Class aptent taciti sociosqu ad litora torquent per conubia nostra, per
    +		inceptos himenaeos.
    +		</p>
    +	</div>
    +</div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the accordion. Can be set when initialising (first creating) the accordion.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the disabled option specified. +
      +
      +
      $( ".selector" ).accordion({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).accordion( "option", "disabled" );
      +//setter
      +$( ".selector" ).accordion( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      active

      +
      +
      Type:
      +
      Selector, Element, jQuery, Boolean, Number
      + +
      Default:
      +
      first child
      + +
      +
      +
      +

      Selector for the active element. Set to false to display none at start. Needs collapsible: true.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the active option specified. +
      +
      +
      $( ".selector" ).accordion({ active: 2 });
      +
      + + +
      + Get or set the active option, after init. +
      +
      +
      //getter
      +var active = $( ".selector" ).accordion( "option", "active" );
      +//setter
      +$( ".selector" ).accordion( "option", "active", 2 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      animated

      +
      +
      Type:
      +
      Boolean, String
      + +
      Default:
      +
      'slide'
      + +
      +
      +
      +

      Choose your favorite animation, or disable them (set to false). In addition to the default, 'bounceslide' and all defined easing methods are supported ('bounceslide' requires UI Effects Core).

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the animated option specified. +
      +
      +
      $( ".selector" ).accordion({ animated: 'bounceslide' });
      +
      + + +
      + Get or set the animated option, after init. +
      +
      +
      //getter
      +var animated = $( ".selector" ).accordion( "option", "animated" );
      +//setter
      +$( ".selector" ).accordion( "option", "animated", 'bounceslide' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      autoHeight

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      If set, the highest content part is used as height reference for all other parts. Provides more consistent animations.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the autoHeight option specified. +
      +
      +
      $( ".selector" ).accordion({ autoHeight: false });
      +
      + + +
      + Get or set the autoHeight option, after init. +
      +
      +
      //getter
      +var autoHeight = $( ".selector" ).accordion( "option", "autoHeight" );
      +//setter
      +$( ".selector" ).accordion( "option", "autoHeight", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      clearStyle

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set, clears height and overflow styles after finishing animations. This enables accordions to work with dynamic content. Won't work together with autoHeight.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the clearStyle option specified. +
      +
      +
      $( ".selector" ).accordion({ clearStyle: true });
      +
      + + +
      + Get or set the clearStyle option, after init. +
      +
      +
      //getter
      +var clearStyle = $( ".selector" ).accordion( "option", "clearStyle" );
      +//setter
      +$( ".selector" ).accordion( "option", "clearStyle", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      collapsible

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Whether all the sections can be closed at once. Allows collapsing the active section by the triggering event (click is the default).

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the collapsible option specified. +
      +
      +
      $( ".selector" ).accordion({ collapsible: true });
      +
      + + +
      + Get or set the collapsible option, after init. +
      +
      +
      //getter
      +var collapsible = $( ".selector" ).accordion( "option", "collapsible" );
      +//setter
      +$( ".selector" ).accordion( "option", "collapsible", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      event

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'click'
      + +
      +
      +
      +

      The event on which to trigger the accordion.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the event option specified. +
      +
      +
      $( ".selector" ).accordion({ event: 'mouseover' });
      +
      + + +
      + Get or set the event option, after init. +
      +
      +
      //getter
      +var event = $( ".selector" ).accordion( "option", "event" );
      +//setter
      +$( ".selector" ).accordion( "option", "event", 'mouseover' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      fillSpace

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set, the accordion completely fills the height of the parent element. Overrides autoheight.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the fillSpace option specified. +
      +
      +
      $( ".selector" ).accordion({ fillSpace: true });
      +
      + + +
      + Get or set the fillSpace option, after init. +
      +
      +
      //getter
      +var fillSpace = $( ".selector" ).accordion( "option", "fillSpace" );
      +//setter
      +$( ".selector" ).accordion( "option", "fillSpace", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      header

      +
      +
      Type:
      +
      Selector, jQuery
      + +
      Default:
      +
      '> li > :first-child,> :not(li):even'
      + +
      +
      +
      +

      Selector for the header element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the header option specified. +
      +
      +
      $( ".selector" ).accordion({ header: 'h3' });
      +
      + + +
      + Get or set the header option, after init. +
      +
      +
      //getter
      +var header = $( ".selector" ).accordion( "option", "header" );
      +//setter
      +$( ".selector" ).accordion( "option", "header", 'h3' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      icons

      +
      +
      Type:
      +
      Object
      + +
      Default:
      +
      { 'header': 'ui-icon-triangle-1-e', 'headerSelected': 'ui-icon-triangle-1-s' }
      + +
      +
      +
      +

      Icons to use for headers. Icons may be specified for 'header' and 'headerSelected', and we recommend using the icons native to the jQuery UI CSS Framework manipulated by jQuery UI ThemeRoller

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the icons option specified. +
      +
      +
      $( ".selector" ).accordion({ icons: { 'header': 'ui-icon-plus', 'headerSelected': 'ui-icon-minus' } });
      +
      + + +
      + Get or set the icons option, after init. +
      +
      +
      //getter
      +var icons = $( ".selector" ).accordion( "option", "icons" );
      +//setter
      +$( ".selector" ).accordion( "option", "icons", { 'header': 'ui-icon-plus', 'headerSelected': 'ui-icon-minus' } );
      +
      + +
      +
      +
    • + + +
    • +
      +

      navigation

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set, looks for the anchor that matches location.href and activates it. Great for href-based state-saving. Use navigationFilter to implement your own matcher.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the navigation option specified. +
      +
      +
      $( ".selector" ).accordion({ navigation: true });
      +
      + + +
      + Get or set the navigation option, after init. +
      +
      +
      //getter
      +var navigation = $( ".selector" ).accordion( "option", "navigation" );
      +//setter
      +$( ".selector" ).accordion( "option", "navigation", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      navigationFilter

      +
      +
      Type:
      +
      Function
      + +
      Default:
      +
      + +
      +
      +
      +

      Overwrite the default location.href-matching with your own matcher.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a accordion with the navigationFilter option specified. +
      +
      +
      $( ".selector" ).accordion({ navigationFilter: function(){ ... } });
      +
      + + +
      + Get or set the navigationFilter option, after init. +
      +
      +
      //getter
      +var navigationFilter = $( ".selector" ).accordion( "option", "navigationFilter" );
      +//setter
      +$( ".selector" ).accordion( "option", "navigationFilter", function(){ ... } );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      accordioncreate
      +
      +
      +
      +

      This event is triggered when accordion is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).accordion({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: accordioncreate. +
      +
      +
      $( ".selector" ).bind( "accordioncreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      change

      +
      +
      Type:
      +
      accordionchange
      +
      +
      +
      +

      This event is triggered every time the accordion changes. If the accordion is animated, the event will be triggered upon completion of the animation; otherwise, it is triggered immediately. +

      +
      $('.ui-accordion').bind('accordionchange', function(event, ui) {
      +  ui.newHeader // jQuery object, activated header
      +  ui.oldHeader // jQuery object, previous header
      +  ui.newContent // jQuery object, activated content
      +  ui.oldContent // jQuery object, previous content
      +});

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the change event as an init option. +
      +
      +
      $( ".selector" ).accordion({
      +   change: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the change event by type: accordionchange. +
      +
      +
      $( ".selector" ).bind( "accordionchange", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +

      +

    • +
      +

      changestart

      +
      +
      Type:
      +
      accordionchangestart
      +
      +
      +
      +

      This event is triggered every time the accordion starts to change. +

      +
      $('.ui-accordion').bind('accordionchangestart', function(event, ui) {
      +  ui.newHeader // jQuery object, activated header
      +  ui.oldHeader // jQuery object, previous header
      +  ui.newContent // jQuery object, activated content
      +  ui.oldContent // jQuery object, previous content
      +});

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the changestart event as an init option. +
      +
      +
      $( ".selector" ).accordion({
      +   changestart: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the changestart event by type: accordionchangestart. +
      +
      +
      $( ".selector" ).bind( "accordionchangestart", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .accordion( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the accordion functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + +

      +

    • +
      +

      disable

      +
      +
      Signature:
      +
      .accordion( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the accordion.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .accordion( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the accordion.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .accordion( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any accordion option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .accordion( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple accordion options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .accordion( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-accordion element.

      +
      +
    • + + +
    • +
      +

      activate

      +
      +
      Signature:
      +
      .accordion( "activate" + +, index + + + + + +)
      +
      +
      +
      +

      Activate a content part of the Accordion programmatically. The index can be a zero-indexed number to match the position of the header to close or a Selector matching an element. Pass false to close all (only possible with collapsible:true).

      +
      +
    • + + +
    • +
      +

      resize

      +
      +
      Signature:
      +
      .accordion( "resize" + + + + + + + +)
      +
      +
      +
      +

      Recompute heights of the accordion contents when using the fillSpace option and the container height changed. For example, when the container is a resizable, this method should be called by its resize-event.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Accordion plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.accordion.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <div class="ui-accordion ui-widget ui-helper-reset">
    +  <h3 class="ui-accordion-header ui-helper-reset ui-state-active ui-corner-top">
    +    <span class="ui-icon ui-icon-triangle-1-s"/>
    +    <a href="#">Section 1</a>
    +  </h3>
    +  <div class="ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content-active">
    +    Section 1 content
    +  </div>
    +  <h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-corner-all">
    +    <span class="ui-icon ui-icon-triangle-1-e"/>
    +    <a href="#">Section 2</a>
    +  </h3>
    +  <div class="ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom">
    +    Section 2 content
    +  </div>
    +  <h3 class="ui-accordion-header ui-helper-reset ui-state-default ui-corner-all">
    +    <span class="ui-icon ui-icon-triangle-1-e"/>
    +    <a href="#">Section 3</a>
    +  </h3>
    +  <div class="ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom">
    +    Section 3 content
    +  </div>
    +</div>
    +

    + + Note: This is a sample of markup generated by the accordion plugin, not markup you should use to create a accordion. The only markup needed for that is
    <div>
    +   <h3><a href="#">Section 1</a></h3>
    +   <div>
    +      Section 1 content
    +   </div>
    +   <h3><a href="#">Section 2</a></h3>
    +   <div>
    +      Section 2 content
    +   </div>
    +   <h3><a href="#">Section 3</a></h3>
    +   <div>
    +      Section 3 content
    +   </div>
    +</div>. +
    +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/addClass.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/addClass.html new file mode 100644 index 00000000000..5e0864cc32d --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/addClass.html @@ -0,0 +1,109 @@ + + +
    +

    jQuery UI addClass

    +
    +

    Overview

    +
    +

    addClass( class, [duration] )

    +

    Adds the specified class to each of the set of matched elements with an optional transition between the states.

    +
    +
    +

    Dependencies

    +
      +
    • Effects Core
    • +
    +
    +
    +

    Example

    +
    + +

    +Adds the class 'selected' to the matched elements with a one second transition.
    +

    +
    $("p").click(function () {
    +      $(this).addClass("selected", 1000);
    +    });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <script src="http://ui.jquery.com/latest/ui/effects.core.js"></script>
    +<style type="text/css">
    +  p { cursor: pointer; font-size: 1.2em; }
    +  .selected { color:red; }
    +</style>
    +  <script>
    +  $(document).ready(function() {
    +    $("p").click(function () {
    +      $(this).addClass("selected", 1000);
    +    });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  <p>Click me to add a 'selected' class.</p>
    +<p>Click me to add a 'selected' class.</p>
    +<p>Click me to add a 'selected' class.</p>
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Arguments

    +
      + +
    • +
      +

      class

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      One CSS class to add to the elements.

      +
      +
    • + + +
    • +
      +

      duration

      +
      +
      Type:
      +
      String, Number
      + +
      Optional
      + +
      +
      +
      +

      A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).

      +
      +
    • + +
    +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/animate.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/animate.html new file mode 100644 index 00000000000..35f6b8ca6dc --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/animate.html @@ -0,0 +1,78 @@ +

    The jQuery UI effects core extends the animate function to be able to animate colors as well. It's heavily used by the class transition feature and it's able to color animate the following properties: +

    +
    • backgroundColor +
    • borderBottomColor +
    • borderLeftColor +
    • borderRightColor +
    • borderTopColor +
    • color +
    • outlineColor +
    +

    with one of the following combinations: +

    +
    • hex (#FF0000) +
    • rgb (rgb(255,255,255)) +
    • names ("black") +
    +


    +

    +
    NameType
    Example: +
    + +
    +A simple color animation.
    +

    +
    $(".block").toggle(function() {
    +    $(this).animate({ backgroundColor: "black" }, 1000);
    +},function() {
    +    $(this).animate({ backgroundColor: "#68BFEF" }, 500);
    +});
    +
    +
    +

    +

    +
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
    +                    "http://www.w3.org/TR/html4/loose.dtd">
    +<html>
    +<head>
    +  <script src="http://code.jquery.com/jquery-latest.js"></script>
    +  
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +
    +  <script>
    +  $(document).ready(function(){
    +    $(".block").toggle(function() {
    +    $(this).animate({ backgroundColor: "black" }, 1000);
    +},function() {
    +    $(this).animate({ backgroundColor: "#68BFEF" }, 500);
    +});
    +
    +  });
    +  </script>
    +  <style>
    +  .block { 
    +    color: white;
    +    background-color: #68BFEF;
    +    width: 150px; 
    +    height: 70px;
    +    margin: 10px; 
    +  }
    +  </style>
    +</head>
    +<body>
    +  <div class="block"> Click me</div>
    +</body>
    +</html>
    +
    +

    +

    +

    NameType
    +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/autocomplete.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/autocomplete.html new file mode 100644 index 00000000000..3f8bb4af2db --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/autocomplete.html @@ -0,0 +1,833 @@ + + +
    +

    jQuery UI Autocomplete

    +
    +

    Overview

    +
    +

    Autocomplete, when added to an input field, enables users to quickly find and select from a pre-populated list of values as they type, leveraging searching and filtering.

    +

    By giving an Autocomplete field focus or entering something into it, the plugin starts searching for entries that match and displays a list of values to choose from. By entering more characters, the user can filter down the list to better matches.

    +

    This can be used to enter previous selected values, for example you could use Autocomplete for entering tags, to complete an address, you could enter a city name and get the zip code, or maybe enter email addresses from an address book.

    +

    You can pull data in from a local and/or a remote source: Local is good for small data sets (like an address book with 50 entries), remote is necessary for big data sets, like a database with hundreds or millions of entries to select from.

    +

    Autocomplete can be customized to work with various data sources, by just specifying the source option. A data source can be:

    +
      +
    • an Array with local data
    • +
    • a String, specifying a URL
    • +
    • a Callback
    • +
    +

    The local data can be a simple Array of Strings, or it contains Objects for each item in the array, with either a label or value property or both. The label property is displayed in the suggestion menu. The value will be inserted into the input element after the user selected something from the menu. If just one property is specified, it will be used for both, eg. if you provide only value-properties, the value will also be used as the label.

    +

    When a String is used, the Autocomplete plugin expects that string to point to a URL resource that will return JSON data. It can be on the same host or on a different one (must provide JSONP). The request parameter "term" gets added to that URL. The data itself can be in the same format as the local data described above.

    +

    The third variation, the callback, provides the most flexibility, and can be used to connect any data source to Autocomplete. The callback gets two arguments:

    +
      +
    • A request object, with a single property called "term", which refers to the value currently in the text input. For example, when the user entered "new yo" in a city field, the Autocomplete term will equal "new yo".
    • +
    • A response callback, which expects a single argument to contain the data to suggest to the user. This data should be filtered based on the provided term, and can be in any of the formats described above for simple local data (String-Array or Object-Array with label/value/both properties). It's important when providing a custom source callback to handle errors during the request. You must always call the response callback even if you encounter an error. This ensures that the widget always has the correct state.
    • +
    +

    The label is always treated as text, if you want the label to be treated as html you can use Scott González' html extension. The demos all focus on different variations of the source-option - look for the one that matches your use case, and take a look at the code.

    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Widget
    • +
    • UI Position
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Autocomplete.
    +

    +
    $("input#autocomplete").autocomplete({
    +    source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"]
    +});
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  
    +  <script>
    +  $(document).ready(function() {
    +    $("input#autocomplete").autocomplete({
    +    source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"]
    +});
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<input id="autocomplete" />
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the autocomplete. Can be set when initialising (first creating) the autocomplete.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a autocomplete with the disabled option specified. +
      +
      +
      $( ".selector" ).autocomplete({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).autocomplete( "option", "disabled" );
      +//setter
      +$( ".selector" ).autocomplete( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      appendTo

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      "body"
      + +
      +
      +
      +

      Which element the menu should be appended to.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a autocomplete with the appendTo option specified. +
      +
      +
      $( ".selector" ).autocomplete({ appendTo: "#someElem" });
      +
      + + +
      + Get or set the appendTo option, after init. +
      +
      +
      //getter
      +var appendTo = $( ".selector" ).autocomplete( "option", "appendTo" );
      +//setter
      +$( ".selector" ).autocomplete( "option", "appendTo", "#someElem" );
      +
      + +
      +
      +
    • + + +
    • +
      +

      delay

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      300
      + +
      +
      +
      +

      The delay in milliseconds the Autocomplete waits after a keystroke to activate itself. A zero-delay makes sense for local data (more responsive), but can produce a lot of load for remote data, while being less responsive.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a autocomplete with the delay option specified. +
      +
      +
      $( ".selector" ).autocomplete({ delay: 0 });
      +
      + + +
      + Get or set the delay option, after init. +
      +
      +
      //getter
      +var delay = $( ".selector" ).autocomplete( "option", "delay" );
      +//setter
      +$( ".selector" ).autocomplete( "option", "delay", 0 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      minLength

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      1
      + +
      +
      +
      +

      The minimum number of characters a user has to type before the Autocomplete activates. Zero is useful for local data with just a few items. Should be increased when there are a lot of items, where a single character would match a few thousand items.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a autocomplete with the minLength option specified. +
      +
      +
      $( ".selector" ).autocomplete({ minLength: 0 });
      +
      + + +
      + Get or set the minLength option, after init. +
      +
      +
      //getter
      +var minLength = $( ".selector" ).autocomplete( "option", "minLength" );
      +//setter
      +$( ".selector" ).autocomplete( "option", "minLength", 0 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      position

      +
      +
      Type:
      +
      Object
      + +
      Default:
      +
      { my: "left top", at: "left bottom", collision: "none" }
      + +
      +
      +
      +

      Identifies the position of the Autocomplete widget in relation to the associated input element. The "of" option defaults to the input element, but you can specify another element to position against. You can refer to the jQuery UI Position utility for more details about the various options.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a autocomplete with the position option specified. +
      +
      +
      $( ".selector" ).autocomplete({ position: { my : "right top", at: "right bottom" } });
      +
      + + +
      + Get or set the position option, after init. +
      +
      +
      //getter
      +var position = $( ".selector" ).autocomplete( "option", "position" );
      +//setter
      +$( ".selector" ).autocomplete( "option", "position", { my : "right top", at: "right bottom" } );
      +
      + +
      +
      +
    • + + +
    • +
      +

      source

      +
      +
      Type:
      +
      String, Array, Callback
      + +
      Default:
      +
      none, must be specified
      + +
      +
      +
      +

      Defines the data to use, must be specified. See Overview section for more details, and look at the various demos. +

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a autocomplete with the source option specified. +
      +
      +
      $( ".selector" ).autocomplete({ source: ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"] });
      +
      + + +
      + Get or set the source option, after init. +
      +
      +
      //getter
      +var source = $( ".selector" ).autocomplete( "option", "source" );
      +//setter
      +$( ".selector" ).autocomplete( "option", "source", ["c++", "java", "php", "coldfusion", "javascript", "asp", "ruby"] );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      autocompletecreate
      +
      +
      +
      +

      This event is triggered when autocomplete is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).autocomplete({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: autocompletecreate. +
      +
      +
      $( ".selector" ).bind( "autocompletecreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + + + + +
    • +
      +

      open

      +
      +
      Type:
      +
      autocompleteopen
      +
      +
      +
      +

      Triggered when the suggestion menu is opened.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the open event as an init option. +
      +
      +
      $( ".selector" ).autocomplete({
      +   open: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the open event by type: autocompleteopen. +
      +
      +
      $( ".selector" ).bind( "autocompleteopen", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      focus

      +
      +
      Type:
      +
      autocompletefocus
      +
      +
      +
      +

      Before focus is moved to an item (not selecting), ui.item refers to the focused item. The default action of focus is to replace the text field's value with the value of the focused item, though only if the focus event was triggered by a keyboard interaction. Canceling this event prevents the value from being updated, but does not prevent the menu item from being focused.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the focus event as an init option. +
      +
      +
      $( ".selector" ).autocomplete({
      +   focus: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the focus event by type: autocompletefocus. +
      +
      +
      $( ".selector" ).bind( "autocompletefocus", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      select

      +
      +
      Type:
      +
      autocompleteselect
      +
      +
      +
      +

      Triggered when an item is selected from the menu; ui.item refers to the selected item. The default action of select is to replace the text field's value with the value of the selected item. Canceling this event prevents the value from being updated, but does not prevent the menu from closing.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the select event as an init option. +
      +
      +
      $( ".selector" ).autocomplete({
      +   select: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the select event by type: autocompleteselect. +
      +
      +
      $( ".selector" ).bind( "autocompleteselect", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      close

      +
      +
      Type:
      +
      autocompleteclose
      +
      +
      +
      +

      When the list is hidden - doesn't have to occur together with a change.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the close event as an init option. +
      +
      +
      $( ".selector" ).autocomplete({
      +   close: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the close event by type: autocompleteclose. +
      +
      +
      $( ".selector" ).bind( "autocompleteclose", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      change

      +
      +
      Type:
      +
      autocompletechange
      +
      +
      +
      +

      After an item was selected; ui.item refers to the selected item. Always triggered after the close event.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the change event as an init option. +
      +
      +
      $( ".selector" ).autocomplete({
      +   change: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the change event by type: autocompletechange. +
      +
      +
      $( ".selector" ).bind( "autocompletechange", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .autocomplete( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the autocomplete functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .autocomplete( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the autocomplete.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .autocomplete( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the autocomplete.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .autocomplete( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any autocomplete option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .autocomplete( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple autocomplete options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .autocomplete( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-autocomplete element.

      +
      +
    • + + + + + +
    • +
      +

      close

      +
      +
      Signature:
      +
      .autocomplete( "close" + + + + + + + +)
      +
      +
      +
      +

      Close the Autocomplete menu. Useful in combination with the search method, to close the open menu.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Autocomplete plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.autocomplete.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <input class="ui-autocomplete-input"/>
    +<ul class="ui-autocomplete ui-menu ui-widget ui-widget-content ui-corner-all">
    +  <li class="ui-menu-item">
    +    <a class="ui-corner-all">item 1</a>
    +  </li>
    +  <li class="ui-menu-item">
    +    <a class="ui-corner-all">item 2</a>
    +  </li>
    +  <li class="ui-menu-item">
    +    <a class="ui-corner-all">item 3</a>
    +  </li>
    +</ul> +

    + + Note: This is a sample of markup generated by the autocomplete plugin, not markup you should use to create a autocomplete. The only markup needed for that is <input/>. + +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/button.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/button.html new file mode 100644 index 00000000000..26f5465365b --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/button.html @@ -0,0 +1,500 @@ + + +
    +

    jQuery UI Button

    +
    +

    Overview

    +
    +

    Button enhances standard form elements like button, input of type submit or reset or anchors to themable buttons with appropiate mouseover and active styles.

    +

    In addition to basic push buttons, radio buttons and checkboxes (inputs of type radio and checkbox) can be converted to buttons: Their associated label is styled to appear as the button, while the underlying input is updated on click.

    +

    In order to group radio buttons, Button also provides an additional widget-method, called Buttonset. Its used by selecting a container element (which contains the radio buttons) and calling buttonset(). Buttonset will also provide visual grouping, and therefore should be used whenever you have a group of buttons. It works by selecting all descendents and applying button() to them. You can enable and disable a buttonset, which will enable and disable all contained buttons. Destroying a buttonset also calls the button's destroy method.

    +

    When using an input of type button, submit or reset, support is limited to plain text labels with no icons.

    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Widget
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Button.
    +

    +
    $("button").button();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  
    +  <script>
    +  $(document).ready(function() {
    +    $("button").button();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<button>Button label</button>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    + +
    +A simple jQuery UI Button.
    +

    +
    $("#radio").buttonset();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  
    +  <script>
    +  $(document).ready(function() {
    +    $("#radio").buttonset();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="radio">
    +	<input type="radio" id="radio1" name="radio" /><label for="radio1">Choice 1</label>
    +	<input type="radio" id="radio2" name="radio" checked="checked" /><label for="radio2">Choice 2</label>
    +	<input type="radio" id="radio3" name="radio" /><label for="radio3">Choice 3</label>
    +</div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the button. Can be set when initialising (first creating) the button.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a button with the disabled option specified. +
      +
      +
      $( ".selector" ).button({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).button( "option", "disabled" );
      +//setter
      +$( ".selector" ).button( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      text

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      Whether to show any text - when set to false (display no text), icons (see icons option) must be enabled, otherwise it'll be ignored.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a button with the text option specified. +
      +
      +
      $( ".selector" ).button({ text: false });
      +
      + + +
      + Get or set the text option, after init. +
      +
      +
      //getter
      +var text = $( ".selector" ).button( "option", "text" );
      +//setter
      +$( ".selector" ).button( "option", "text", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      icons

      +
      +
      Type:
      +
      Options
      + +
      Default:
      +
      { primary: null, secondary: null }
      + +
      +
      +
      +

      Icons to display, with or without text (see text option). The primary icon is displayed by default on the left of the label text, the secondary by default is on the right. Value for the primary and secondary properties must be a classname (String), eg. "ui-icon-gear". For using only one icon: icons: {primary:'ui-icon-locked'}. For using two icons: icons: {primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'}

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a button with the icons option specified. +
      +
      +
      $( ".selector" ).button({ icons: {primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'} });
      +
      + + +
      + Get or set the icons option, after init. +
      +
      +
      //getter
      +var icons = $( ".selector" ).button( "option", "icons" );
      +//setter
      +$( ".selector" ).button( "option", "icons", {primary:'ui-icon-gear',secondary:'ui-icon-triangle-1-s'} );
      +
      + +
      +
      +
    • + + +
    • +
      +

      label

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      HTML content of the button, or value attribute
      + +
      +
      +
      +

      Text to show on the button. When not specified (null), the element's html content is used, or its value attribute when it's an input element of type submit or reset; or the html content of the associated label element if its an input of type radio or checkbox

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a button with the label option specified. +
      +
      +
      $( ".selector" ).button({ label: "custom label" });
      +
      + + +
      + Get or set the label option, after init. +
      +
      +
      //getter
      +var label = $( ".selector" ).button( "option", "label" );
      +//setter
      +$( ".selector" ).button( "option", "label", "custom label" );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      buttoncreate
      +
      +
      +
      +

      This event is triggered when button is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).button({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: buttoncreate. +
      +
      +
      $( ".selector" ).bind( "buttoncreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +

      +

      There are no events for this plugin.

      +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .button( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the button functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + +

      +

    • +
      +

      disable

      +
      +
      Signature:
      +
      .button( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the button.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .button( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the button.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .button( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any button option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .button( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple button options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .button( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-button element.

      +
      +
    • + + +
    • +
      +

      refresh

      +
      +
      Signature:
      +
      .button( "refresh" + + + + + + + +)
      +
      +
      +
      +

      Refreshes the visual state of the button. Useful for updating button state after the native element's checked or disabled state is changed programatically.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Button plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.button.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <button class="ui-button ui-button-text-only ui-widget ui-state-default ui-corner-all">
    +   <span class="ui-button-text">Button Label</span>
    </button> +

    + + Note: This is a sample of markup generated by the button plugin, not markup you should use to create a button. The only markup needed for that is <button>Button Label</button>. + +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/datepicker.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/datepicker.html new file mode 100644 index 00000000000..fc373144033 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/datepicker.html @@ -0,0 +1,2570 @@ + + +
    +

    jQuery UI Datepicker

    +
    +

    Overview

    +
    +

    The jQuery UI Datepicker is a highly configurable plugin that adds datepicker functionality to your pages. You can customize the date format and language, restrict the selectable date ranges and add in buttons and other navigation options easily.

    +

    By default, the datepicker calendar opens in a small overlay onFocus and closes automatically onBlur or when a date is selected. For an inline calendar, simply attach the datepicker to a div or span. +

    You can use keyboard shortcuts to drive the datepicker: +

    +
      +
    • page up/down - previous/next month
    • +
    • ctrl+page up/down - previous/next year
    • +
    • ctrl+home - current month or open when closed
    • +
    • ctrl+left/right - previous/next day
    • +
    • ctrl+up/down - previous/next week
    • +
    • enter - accept the selected date
    • +
    • ctrl+end - close and erase the date
    • +
    • escape - close the datepicker without selection
    • +
    +

    Utility functions

    + +

    Localization

    +

    Datepicker provides support for localizing its content to cater for different languages + and date formats. Each localization is contained within its own file with the + language code appended to the name, e.g. jquery.ui.datepicker-fr.js for French. + The desired localization file should be include after the main datepicker code. They add their settings to the set + of available localizations and automatically apply them as defaults for all instances.

    +

    The $.datepicker.regional attribute holds an array of localizations, + indexed by language code, with '' referring to the default (English). Each entry is + an object with the following attributes: closeText, prevText, + nextText, currentText, monthNames, + monthNamesShort, dayNames, dayNamesShort, + dayNamesMin, weekHeader, dateFormat, + firstDay, isRTL, showMonthAfterYear, + and yearSuffix.

    +

    You can restore the default localizations with:

    +

    $.datepicker.setDefaults($.datepicker.regional['']); +

    +

    And can then override an individual datepicker for a specific locale:

    +

    $(selector).datepicker($.datepicker.regional['fr']); +

    +The localization files are also available in the UI svn: http://jquery-ui.googlecode.com/svn/trunk/ui/i18n/ +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Datepicker.
    +

    +
    $("#datepicker").datepicker();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  
    +  <script>
    +  $(document).ready(function() {
    +    $("#datepicker").datepicker();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div type="text" id="datepicker"></div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the datepicker. Can be set when initialising (first creating) the datepicker.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the disabled option specified. +
      +
      +
      $( ".selector" ).datepicker({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).datepicker( "option", "disabled" );
      +//setter
      +$( ".selector" ).datepicker( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      altField

      +
      +
      Type:
      +
      Selector, jQuery, Element
      + +
      Default:
      +
      ''
      + +
      +
      +
      +

      The jQuery selector for another field that is to be updated with the selected date from the datepicker. Use the altFormat setting to change the format of the date within this field. Leave as blank for no alternate field.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the altField option specified. +
      +
      +
      $( ".selector" ).datepicker({ altField: '#actualDate' });
      +
      + + +
      + Get or set the altField option, after init. +
      +
      +
      //getter
      +var altField = $( ".selector" ).datepicker( "option", "altField" );
      +//setter
      +$( ".selector" ).datepicker( "option", "altField", '#actualDate' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      altFormat

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      ''
      + +
      +
      +
      +

      The dateFormat to be used for the altField option. This allows one date format to be shown to the user for selection purposes, while a different format is actually sent behind the scenes. For a full list of the possible formats see the formatDate function

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the altFormat option specified. +
      +
      +
      $( ".selector" ).datepicker({ altFormat: 'yy-mm-dd' });
      +
      + + +
      + Get or set the altFormat option, after init. +
      +
      +
      //getter
      +var altFormat = $( ".selector" ).datepicker( "option", "altFormat" );
      +//setter
      +$( ".selector" ).datepicker( "option", "altFormat", 'yy-mm-dd' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      appendText

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      ''
      + +
      +
      +
      +

      The text to display after each date field, e.g. to show the required format.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the appendText option specified. +
      +
      +
      $( ".selector" ).datepicker({ appendText: '(yyyy-mm-dd)' });
      +
      + + +
      + Get or set the appendText option, after init. +
      +
      +
      //getter
      +var appendText = $( ".selector" ).datepicker( "option", "appendText" );
      +//setter
      +$( ".selector" ).datepicker( "option", "appendText", '(yyyy-mm-dd)' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      autoSize

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Set to true to automatically resize the input field to accomodate dates in the current dateFormat.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the autoSize option specified. +
      +
      +
      $( ".selector" ).datepicker({ autoSize: true });
      +
      + + +
      + Get or set the autoSize option, after init. +
      +
      +
      //getter
      +var autoSize = $( ".selector" ).datepicker( "option", "autoSize" );
      +//setter
      +$( ".selector" ).datepicker( "option", "autoSize", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      buttonImage

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      ''
      + +
      +
      +
      +

      The URL for the popup button image. If set, buttonText becomes the alt value and is not directly displayed.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the buttonImage option specified. +
      +
      +
      $( ".selector" ).datepicker({ buttonImage: '/images/datepicker.gif' });
      +
      + + +
      + Get or set the buttonImage option, after init. +
      +
      +
      //getter
      +var buttonImage = $( ".selector" ).datepicker( "option", "buttonImage" );
      +//setter
      +$( ".selector" ).datepicker( "option", "buttonImage", '/images/datepicker.gif' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      buttonImageOnly

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Set to true to place an image after the field to use as the trigger without it appearing on a button.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the buttonImageOnly option specified. +
      +
      +
      $( ".selector" ).datepicker({ buttonImageOnly: true });
      +
      + + +
      + Get or set the buttonImageOnly option, after init. +
      +
      +
      //getter
      +var buttonImageOnly = $( ".selector" ).datepicker( "option", "buttonImageOnly" );
      +//setter
      +$( ".selector" ).datepicker( "option", "buttonImageOnly", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      buttonText

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      '...'
      + +
      +
      +
      +

      The text to display on the trigger button. Use in conjunction with showOn equal to 'button' or 'both'.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the buttonText option specified. +
      +
      +
      $( ".selector" ).datepicker({ buttonText: 'Choose' });
      +
      + + +
      + Get or set the buttonText option, after init. +
      +
      +
      //getter
      +var buttonText = $( ".selector" ).datepicker( "option", "buttonText" );
      +//setter
      +$( ".selector" ).datepicker( "option", "buttonText", 'Choose' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      calculateWeek

      +
      +
      Type:
      +
      Function
      + +
      Default:
      +
      $.datepicker.iso8601Week
      + +
      +
      +
      +

      A function to calculate the week of the year for a given date. The default implementation uses the ISO 8601 definition: weeks start on a Monday; the first week of the year contains the first Thursday of the year.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the calculateWeek option specified. +
      +
      +
      $( ".selector" ).datepicker({ calculateWeek: myWeekCalc });
      +
      + + +
      + Get or set the calculateWeek option, after init. +
      +
      +
      //getter
      +var calculateWeek = $( ".selector" ).datepicker( "option", "calculateWeek" );
      +//setter
      +$( ".selector" ).datepicker( "option", "calculateWeek", myWeekCalc );
      +
      + +
      +
      +
    • + + +
    • +
      +

      changeMonth

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Allows you to change the month by selecting from a drop-down list. You can enable this feature by setting the attribute to true.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the changeMonth option specified. +
      +
      +
      $( ".selector" ).datepicker({ changeMonth: true });
      +
      + + +
      + Get or set the changeMonth option, after init. +
      +
      +
      //getter
      +var changeMonth = $( ".selector" ).datepicker( "option", "changeMonth" );
      +//setter
      +$( ".selector" ).datepicker( "option", "changeMonth", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      changeYear

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Allows you to change the year by selecting from a drop-down list. You can enable this feature by setting the attribute to true. Use the yearRange option to control which years are made available for selection.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the changeYear option specified. +
      +
      +
      $( ".selector" ).datepicker({ changeYear: true });
      +
      + + +
      + Get or set the changeYear option, after init. +
      +
      +
      //getter
      +var changeYear = $( ".selector" ).datepicker( "option", "changeYear" );
      +//setter
      +$( ".selector" ).datepicker( "option", "changeYear", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      closeText

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'Done'
      + +
      +
      +
      +

      The text to display for the close link. This attribute is one of the regionalisation attributes. Use the showButtonPanel to display this button.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the closeText option specified. +
      +
      +
      $( ".selector" ).datepicker({ closeText: 'X' });
      +
      + + +
      + Get or set the closeText option, after init. +
      +
      +
      //getter
      +var closeText = $( ".selector" ).datepicker( "option", "closeText" );
      +//setter
      +$( ".selector" ).datepicker( "option", "closeText", 'X' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      constrainInput

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      When true entry in the input field is constrained to those characters allowed by the current dateFormat.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the constrainInput option specified. +
      +
      +
      $( ".selector" ).datepicker({ constrainInput: false });
      +
      + + +
      + Get or set the constrainInput option, after init. +
      +
      +
      //getter
      +var constrainInput = $( ".selector" ).datepicker( "option", "constrainInput" );
      +//setter
      +$( ".selector" ).datepicker( "option", "constrainInput", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      currentText

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'Today'
      + +
      +
      +
      +

      The text to display for the current day link. This attribute is one of the regionalisation attributes. Use the showButtonPanel to display this button.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the currentText option specified. +
      +
      +
      $( ".selector" ).datepicker({ currentText: 'Now' });
      +
      + + +
      + Get or set the currentText option, after init. +
      +
      +
      //getter
      +var currentText = $( ".selector" ).datepicker( "option", "currentText" );
      +//setter
      +$( ".selector" ).datepicker( "option", "currentText", 'Now' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      dateFormat

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'mm/dd/yy'
      + +
      +
      +
      +

      The format for parsed and displayed dates. This attribute is one of the regionalisation attributes. For a full list of the possible formats see the formatDate function.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the dateFormat option specified. +
      +
      +
      $( ".selector" ).datepicker({ dateFormat: 'yy-mm-dd' });
      +
      + + +
      + Get or set the dateFormat option, after init. +
      +
      +
      //getter
      +var dateFormat = $( ".selector" ).datepicker( "option", "dateFormat" );
      +//setter
      +$( ".selector" ).datepicker( "option", "dateFormat", 'yy-mm-dd' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      dayNames

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
      + +
      +
      +
      +

      The list of long day names, starting from Sunday, for use as requested via the dateFormat setting. They also appear as popup hints when hovering over the corresponding column headings. This attribute is one of the regionalisation attributes.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the dayNames option specified. +
      +
      +
      $( ".selector" ).datepicker({ dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'] });
      +
      + + +
      + Get or set the dayNames option, after init. +
      +
      +
      //getter
      +var dayNames = $( ".selector" ).datepicker( "option", "dayNames" );
      +//setter
      +$( ".selector" ).datepicker( "option", "dayNames", ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      dayNamesMin

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa']
      + +
      +
      +
      +

      The list of minimised day names, starting from Sunday, for use as column headers within the datepicker. This attribute is one of the regionalisation attributes.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the dayNamesMin option specified. +
      +
      +
      $( ".selector" ).datepicker({ dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'] });
      +
      + + +
      + Get or set the dayNamesMin option, after init. +
      +
      +
      //getter
      +var dayNamesMin = $( ".selector" ).datepicker( "option", "dayNamesMin" );
      +//setter
      +$( ".selector" ).datepicker( "option", "dayNamesMin", ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      dayNamesShort

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
      + +
      +
      +
      +

      The list of abbreviated day names, starting from Sunday, for use as requested via the dateFormat setting. This attribute is one of the regionalisation attributes.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the dayNamesShort option specified. +
      +
      +
      $( ".selector" ).datepicker({ dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'] });
      +
      + + +
      + Get or set the dayNamesShort option, after init. +
      +
      +
      //getter
      +var dayNamesShort = $( ".selector" ).datepicker( "option", "dayNamesShort" );
      +//setter
      +$( ".selector" ).datepicker( "option", "dayNamesShort", ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      defaultDate

      +
      +
      Type:
      +
      Date, Number, String
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      Set the date to highlight on first opening if the field is blank. Specify either an actual date via a Date object or as a string in the current dateFormat, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +7d'), or null for today.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the defaultDate option specified. +
      +
      +
      $( ".selector" ).datepicker({ defaultDate: +7 });
      +
      + + +
      + Get or set the defaultDate option, after init. +
      +
      +
      //getter
      +var defaultDate = $( ".selector" ).datepicker( "option", "defaultDate" );
      +//setter
      +$( ".selector" ).datepicker( "option", "defaultDate", +7 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      duration

      +
      +
      Type:
      +
      String, Number
      + +
      Default:
      +
      'normal'
      + +
      +
      +
      +

      Control the speed at which the datepicker appears, it may be a time in milliseconds or a string representing one of the three predefined speeds ("slow", "normal", "fast").

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the duration option specified. +
      +
      +
      $( ".selector" ).datepicker({ duration: 'slow' });
      +
      + + +
      + Get or set the duration option, after init. +
      +
      +
      //getter
      +var duration = $( ".selector" ).datepicker( "option", "duration" );
      +//setter
      +$( ".selector" ).datepicker( "option", "duration", 'slow' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      firstDay

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      Set the first day of the week: Sunday is 0, Monday is 1, ... This attribute is one of the regionalisation attributes.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the firstDay option specified. +
      +
      +
      $( ".selector" ).datepicker({ firstDay: 1 });
      +
      + + +
      + Get or set the firstDay option, after init. +
      +
      +
      //getter
      +var firstDay = $( ".selector" ).datepicker( "option", "firstDay" );
      +//setter
      +$( ".selector" ).datepicker( "option", "firstDay", 1 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      gotoCurrent

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      When true the current day link moves to the currently selected date instead of today.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the gotoCurrent option specified. +
      +
      +
      $( ".selector" ).datepicker({ gotoCurrent: true });
      +
      + + +
      + Get or set the gotoCurrent option, after init. +
      +
      +
      //getter
      +var gotoCurrent = $( ".selector" ).datepicker( "option", "gotoCurrent" );
      +//setter
      +$( ".selector" ).datepicker( "option", "gotoCurrent", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      hideIfNoPrevNext

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Normally the previous and next links are disabled when not applicable (see minDate/maxDate). You can hide them altogether by setting this attribute to true.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the hideIfNoPrevNext option specified. +
      +
      +
      $( ".selector" ).datepicker({ hideIfNoPrevNext: true });
      +
      + + +
      + Get or set the hideIfNoPrevNext option, after init. +
      +
      +
      //getter
      +var hideIfNoPrevNext = $( ".selector" ).datepicker( "option", "hideIfNoPrevNext" );
      +//setter
      +$( ".selector" ).datepicker( "option", "hideIfNoPrevNext", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      isRTL

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      True if the current language is drawn from right to left. This attribute is one of the regionalisation attributes.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the isRTL option specified. +
      +
      +
      $( ".selector" ).datepicker({ isRTL: true });
      +
      + + +
      + Get or set the isRTL option, after init. +
      +
      +
      //getter
      +var isRTL = $( ".selector" ).datepicker( "option", "isRTL" );
      +//setter
      +$( ".selector" ).datepicker( "option", "isRTL", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      maxDate

      +
      +
      Type:
      +
      Date, Number, String
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      Set a maximum selectable date via a Date object or as a string in the current dateFormat, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +1w'), or null for no limit.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the maxDate option specified. +
      +
      +
      $( ".selector" ).datepicker({ maxDate: '+1m +1w' });
      +
      + + +
      + Get or set the maxDate option, after init. +
      +
      +
      //getter
      +var maxDate = $( ".selector" ).datepicker( "option", "maxDate" );
      +//setter
      +$( ".selector" ).datepicker( "option", "maxDate", '+1m +1w' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      minDate

      +
      +
      Type:
      +
      Date, Number, String
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      Set a minimum selectable date via a Date object or as a string in the current dateFormat, or a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '-1y -1m'), or null for no limit.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the minDate option specified. +
      +
      +
      $( ".selector" ).datepicker({ minDate: new Date(2007, 1 - 1, 1) });
      +
      + + +
      + Get or set the minDate option, after init. +
      +
      +
      //getter
      +var minDate = $( ".selector" ).datepicker( "option", "minDate" );
      +//setter
      +$( ".selector" ).datepicker( "option", "minDate", new Date(2007, 1 - 1, 1) );
      +
      + +
      +
      +
    • + + +
    • +
      +

      monthNames

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
      + +
      +
      +
      +

      The list of full month names, for use as requested via the dateFormat setting. This attribute is one of the regionalisation attributes.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the monthNames option specified. +
      +
      +
      $( ".selector" ).datepicker({ monthNames: ['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'] });
      +
      + + +
      + Get or set the monthNames option, after init. +
      +
      +
      //getter
      +var monthNames = $( ".selector" ).datepicker( "option", "monthNames" );
      +//setter
      +$( ".selector" ).datepicker( "option", "monthNames", ['Januar','Februar','Marts','April','Maj','Juni','Juli','August','September','Oktober','November','December'] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      monthNamesShort

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
      + +
      +
      +
      +

      The list of abbreviated month names, as used in the month header on each datepicker and as requested via the dateFormat setting. This attribute is one of the regionalisation attributes.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the monthNamesShort option specified. +
      +
      +
      $( ".selector" ).datepicker({ monthNamesShort: ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'] });
      +
      + + +
      + Get or set the monthNamesShort option, after init. +
      +
      +
      //getter
      +var monthNamesShort = $( ".selector" ).datepicker( "option", "monthNamesShort" );
      +//setter
      +$( ".selector" ).datepicker( "option", "monthNamesShort", ['Jan','Feb','Mar','Apr','Maj','Jun','Jul','Aug','Sep','Okt','Nov','Dec'] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      navigationAsDateFormat

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      When true the formatDate function is applied to the prevText, nextText, and currentText values before display, allowing them to display the target month names for example.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the navigationAsDateFormat option specified. +
      +
      +
      $( ".selector" ).datepicker({ navigationAsDateFormat: true });
      +
      + + +
      + Get or set the navigationAsDateFormat option, after init. +
      +
      +
      //getter
      +var navigationAsDateFormat = $( ".selector" ).datepicker( "option", "navigationAsDateFormat" );
      +//setter
      +$( ".selector" ).datepicker( "option", "navigationAsDateFormat", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      nextText

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'Next'
      + +
      +
      +
      +

      The text to display for the next month link. This attribute is one of the regionalisation attributes. With the standard ThemeRoller styling, this value is replaced by an icon.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the nextText option specified. +
      +
      +
      $( ".selector" ).datepicker({ nextText: 'Later' });
      +
      + + +
      + Get or set the nextText option, after init. +
      +
      +
      //getter
      +var nextText = $( ".selector" ).datepicker( "option", "nextText" );
      +//setter
      +$( ".selector" ).datepicker( "option", "nextText", 'Later' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      numberOfMonths

      +
      +
      Type:
      +
      Number, Array
      + +
      Default:
      +
      1
      + +
      +
      +
      +

      Set how many months to show at once. The value can be a straight integer, or can be a two-element array to define the number of rows and columns to display.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the numberOfMonths option specified. +
      +
      +
      $( ".selector" ).datepicker({ numberOfMonths: [2, 3] });
      +
      + + +
      + Get or set the numberOfMonths option, after init. +
      +
      +
      //getter
      +var numberOfMonths = $( ".selector" ).datepicker( "option", "numberOfMonths" );
      +//setter
      +$( ".selector" ).datepicker( "option", "numberOfMonths", [2, 3] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      prevText

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'Prev'
      + +
      +
      +
      +

      The text to display for the previous month link. This attribute is one of the regionalisation attributes. With the standard ThemeRoller styling, this value is replaced by an icon.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the prevText option specified. +
      +
      +
      $( ".selector" ).datepicker({ prevText: 'Earlier' });
      +
      + + +
      + Get or set the prevText option, after init. +
      +
      +
      //getter
      +var prevText = $( ".selector" ).datepicker( "option", "prevText" );
      +//setter
      +$( ".selector" ).datepicker( "option", "prevText", 'Earlier' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      selectOtherMonths

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      When true days in other months shown before or after the current month are selectable. This only applies if showOtherMonths is also true.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the selectOtherMonths option specified. +
      +
      +
      $( ".selector" ).datepicker({ selectOtherMonths: true });
      +
      + + +
      + Get or set the selectOtherMonths option, after init. +
      +
      +
      //getter
      +var selectOtherMonths = $( ".selector" ).datepicker( "option", "selectOtherMonths" );
      +//setter
      +$( ".selector" ).datepicker( "option", "selectOtherMonths", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      shortYearCutoff

      +
      +
      Type:
      +
      String, Number
      + +
      Default:
      +
      '+10'
      + +
      +
      +
      +

      Set the cutoff year for determining the century for a date (used in conjunction with dateFormat 'y'). If a numeric value (0-99) is provided then this value is used directly. If a string value is provided then it is converted to a number and added to the current year. Once the cutoff year is calculated, any dates entered with a year value less than or equal to it are considered to be in the current century, while those greater than it are deemed to be in the previous century.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the shortYearCutoff option specified. +
      +
      +
      $( ".selector" ).datepicker({ shortYearCutoff: 50 });
      +
      + + +
      + Get or set the shortYearCutoff option, after init. +
      +
      +
      //getter
      +var shortYearCutoff = $( ".selector" ).datepicker( "option", "shortYearCutoff" );
      +//setter
      +$( ".selector" ).datepicker( "option", "shortYearCutoff", 50 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      showAnim

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'show'
      + +
      +
      +
      +

      Set the name of the animation used to show/hide the datepicker. Use 'show' (the default), 'slideDown', 'fadeIn', any of the show/hide jQuery UI effects, or '' for no animation.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the showAnim option specified. +
      +
      +
      $( ".selector" ).datepicker({ showAnim: 'fold' });
      +
      + + +
      + Get or set the showAnim option, after init. +
      +
      +
      //getter
      +var showAnim = $( ".selector" ).datepicker( "option", "showAnim" );
      +//setter
      +$( ".selector" ).datepicker( "option", "showAnim", 'fold' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      showButtonPanel

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Whether to show the button panel.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the showButtonPanel option specified. +
      +
      +
      $( ".selector" ).datepicker({ showButtonPanel: true });
      +
      + + +
      + Get or set the showButtonPanel option, after init. +
      +
      +
      //getter
      +var showButtonPanel = $( ".selector" ).datepicker( "option", "showButtonPanel" );
      +//setter
      +$( ".selector" ).datepicker( "option", "showButtonPanel", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      showCurrentAtPos

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      Specify where in a multi-month display the current month shows, starting from 0 at the top/left.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the showCurrentAtPos option specified. +
      +
      +
      $( ".selector" ).datepicker({ showCurrentAtPos: 3 });
      +
      + + +
      + Get or set the showCurrentAtPos option, after init. +
      +
      +
      //getter
      +var showCurrentAtPos = $( ".selector" ).datepicker( "option", "showCurrentAtPos" );
      +//setter
      +$( ".selector" ).datepicker( "option", "showCurrentAtPos", 3 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      showMonthAfterYear

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Whether to show the month after the year in the header. This attribute is one of the regionalisation attributes.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the showMonthAfterYear option specified. +
      +
      +
      $( ".selector" ).datepicker({ showMonthAfterYear: true });
      +
      + + +
      + Get or set the showMonthAfterYear option, after init. +
      +
      +
      //getter
      +var showMonthAfterYear = $( ".selector" ).datepicker( "option", "showMonthAfterYear" );
      +//setter
      +$( ".selector" ).datepicker( "option", "showMonthAfterYear", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      showOn

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'focus'
      + +
      +
      +
      +

      Have the datepicker appear automatically when the field receives focus ('focus'), appear only when a button is clicked ('button'), or appear when either event takes place ('both').

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the showOn option specified. +
      +
      +
      $( ".selector" ).datepicker({ showOn: 'both' });
      +
      + + +
      + Get or set the showOn option, after init. +
      +
      +
      //getter
      +var showOn = $( ".selector" ).datepicker( "option", "showOn" );
      +//setter
      +$( ".selector" ).datepicker( "option", "showOn", 'both' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      showOptions

      +
      +
      Type:
      +
      Options
      + +
      Default:
      +
      {}
      + +
      +
      +
      +

      If using one of the jQuery UI effects for showAnim, you can provide additional settings for that animation via this option.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the showOptions option specified. +
      +
      +
      $( ".selector" ).datepicker({ showOptions: {direction: 'up' });
      +
      + + +
      + Get or set the showOptions option, after init. +
      +
      +
      //getter
      +var showOptions = $( ".selector" ).datepicker( "option", "showOptions" );
      +//setter
      +$( ".selector" ).datepicker( "option", "showOptions", {direction: 'up' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      showOtherMonths

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Display dates in other months (non-selectable) at the start or end of the current month. To make these days selectable use selectOtherMonths.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the showOtherMonths option specified. +
      +
      +
      $( ".selector" ).datepicker({ showOtherMonths: true });
      +
      + + +
      + Get or set the showOtherMonths option, after init. +
      +
      +
      //getter
      +var showOtherMonths = $( ".selector" ).datepicker( "option", "showOtherMonths" );
      +//setter
      +$( ".selector" ).datepicker( "option", "showOtherMonths", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      showWeek

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      When true a column is added to show the week of the year. The calculateWeek option determines how the week of the year is calculated. You may also want to change the firstDay option.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the showWeek option specified. +
      +
      +
      $( ".selector" ).datepicker({ showWeek: true });
      +
      + + +
      + Get or set the showWeek option, after init. +
      +
      +
      //getter
      +var showWeek = $( ".selector" ).datepicker( "option", "showWeek" );
      +//setter
      +$( ".selector" ).datepicker( "option", "showWeek", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      stepMonths

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      1
      + +
      +
      +
      +

      Set how many months to move when clicking the Previous/Next links.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the stepMonths option specified. +
      +
      +
      $( ".selector" ).datepicker({ stepMonths: 3 });
      +
      + + +
      + Get or set the stepMonths option, after init. +
      +
      +
      //getter
      +var stepMonths = $( ".selector" ).datepicker( "option", "stepMonths" );
      +//setter
      +$( ".selector" ).datepicker( "option", "stepMonths", 3 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      weekHeader

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'Wk'
      + +
      +
      +
      +

      The text to display for the week of the year column heading. This attribute is one of the regionalisation attributes. Use showWeek to display this column.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the weekHeader option specified. +
      +
      +
      $( ".selector" ).datepicker({ weekHeader: 'W' });
      +
      + + +
      + Get or set the weekHeader option, after init. +
      +
      +
      //getter
      +var weekHeader = $( ".selector" ).datepicker( "option", "weekHeader" );
      +//setter
      +$( ".selector" ).datepicker( "option", "weekHeader", 'W' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      yearRange

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'c-10:c+10'
      + +
      +
      +
      +

      Control the range of years displayed in the year drop-down: either relative to today's year (-nn:+nn), relative to the currently selected year (c-nn:c+nn), absolute (nnnn:nnnn), or combinations of these formats (nnnn:-nn). Note that this option only affects what appears in the drop-down, to restrict which dates may be selected use the minDate and/or maxDate options.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the yearRange option specified. +
      +
      +
      $( ".selector" ).datepicker({ yearRange: '2000:2010' });
      +
      + + +
      + Get or set the yearRange option, after init. +
      +
      +
      //getter
      +var yearRange = $( ".selector" ).datepicker( "option", "yearRange" );
      +//setter
      +$( ".selector" ).datepicker( "option", "yearRange", '2000:2010' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      yearSuffix

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      ''
      + +
      +
      +
      +

      Additional text to display after the year in the month headers. This attribute is one of the regionalisation attributes.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a datepicker with the yearSuffix option specified. +
      +
      +
      $( ".selector" ).datepicker({ yearSuffix: 'CE' });
      +
      + + +
      + Get or set the yearSuffix option, after init. +
      +
      +
      //getter
      +var yearSuffix = $( ".selector" ).datepicker( "option", "yearSuffix" );
      +//setter
      +$( ".selector" ).datepicker( "option", "yearSuffix", 'CE' );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      datepickercreate
      +
      +
      +
      +

      This event is triggered when datepicker is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).datepicker({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: datepickercreate. +
      +
      +
      $( ".selector" ).bind( "datepickercreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      beforeShow

      +
      +
      +
      function(input, inst)
      +
      +
      +
      +

      Can be a function that takes an input field and current datepicker instance and returns an options object to update the datepicker with. It is called just before the datepicker is displayed.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the beforeShow event as an init option. +
      +
      +
      $('.selector').datepicker({
      +   beforeShow: function(input, inst) { ... }
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      beforeShowDay

      +
      +
      +
      function(date)
      +
      +
      +
      +

      The function takes a date as a parameter and must return an array with [0] equal to true/false indicating whether or not this date is selectable, [1] equal to a CSS class name(s) or '' for the default presentation, and [2] an optional popup tooltip for this date. It is called for each day in the datepicker before it is displayed.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the beforeShowDay event as an init option. +
      +
      +
      $('.selector').datepicker({
      +   beforeShowDay: function(date) { ... }
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      onChangeMonthYear

      +
      +
      +
      function(year, month, inst)
      +
      +
      +
      +

      Allows you to define your own event when the datepicker moves to a new month and/or year. The function receives the selected year, month (1-12), and the datepicker instance as parameters. this refers to the associated input field.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the onChangeMonthYear event as an init option. +
      +
      +
      $('.selector').datepicker({
      +   onChangeMonthYear: function(year, month, inst) { ... }
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      onClose

      +
      +
      +
      function(dateText, inst)
      +
      +
      +
      +

      Allows you to define your own event when the datepicker is closed, whether or not a date is selected. The function receives the selected date as text ('' if none) and the datepicker instance as parameters. this refers to the associated input field.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the onClose event as an init option. +
      +
      +
      $('.selector').datepicker({
      +   onClose: function(dateText, inst) { ... }
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      onSelect

      +
      +
      +
      function(dateText, inst)
      +
      +
      +
      +

      Allows you to define your own event when the datepicker is selected. The function receives the selected date as text and the datepicker instance as parameters. this refers to the associated input field.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the onSelect event as an init option. +
      +
      +
      $('.selector').datepicker({
      +   onSelect: function(dateText, inst) { ... }
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .datepicker( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the datepicker functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .datepicker( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the datepicker.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .datepicker( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the datepicker.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .datepicker( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any datepicker option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .datepicker( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple datepicker options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .datepicker( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-datepicker element.

      +
      +
    • + + +
    • +
      +

      dialog

      +
      +
      Signature:
      +
      .datepicker( "dialog" + +, date + +, [onSelect] + +, [settings] + +, [pos] )
      +
      +
      +
      +

      Open a datepicker in a "dialog" box. +

      dateText: the initial date for the date picker as either a Date or a string in the current date format. +

      onSelect: A callback function when a date is selected. The function receives the date text and date picker instance as parameters. +

      settings: The new settings for the date picker. +

      pos: The position of the top/left of the dialog as [x, y] or a MouseEvent that contains the coordinates. If not specified the dialog is centered on the screen.

      +
      +
    • + + +
    • +
      +

      isDisabled

      +
      +
      Signature:
      +
      .datepicker( "isDisabled" + + + + + + + +)
      +
      +
      +
      +

      Determine whether a date picker has been disabled.

      +
      +
    • + + +
    • +
      +

      hide

      +
      +
      Signature:
      +
      .datepicker( "hide" + + + + + + + +)
      +
      +
      +
      +

      Close a previously opened date picker.

      +
      +
    • + + +
    • +
      +

      show

      +
      +
      Signature:
      +
      .datepicker( "show" + + + + + + + +)
      +
      +
      +
      +

      Call up a previously attached date picker.

      +
      +
    • + + +
    • +
      +

      refresh

      +
      +
      Signature:
      +
      .datepicker( "refresh" + + + + + + + +)
      +
      +
      +
      +

      Redraw a date picker, after having made some external modifications.

      +
      +
    • + + +
    • +
      +

      getDate

      +
      +
      Signature:
      +
      .datepicker( "getDate" + + + + + + + +)
      +
      +
      +
      +

      Returns the current date for the datepicker or null if no date has been selected.

      +
      +
    • + + +
    • +
      +

      setDate

      +
      +
      Signature:
      +
      .datepicker( "setDate" + +, date + + + + + +)
      +
      +
      +
      +

      Sets the current date for the datepicker. The new date may be a Date object or a string in the current date format (e.g. '01/26/2009'), a number of days from today (e.g. +7) or a string of values and periods ('y' for years, 'm' for months, 'w' for weeks, 'd' for days, e.g. '+1m +7d'), or null to clear the selected date.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Datepicker plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.datepicker.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <div id="ui-datepicker-div" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible">
    +   <div class="ui-datepicker-header ui-widget-header ui-helper-clearfix ui-corner-all">
    +      <a class="ui-datepicker-prev ui-corner-all">title="Prev"><span class="ui-icon ui-icon-circle-triangle-w">Prev</span></a>
    +      <a class="ui-datepicker-next ui-corner-all" title="Next"><span class="ui-icon ui-icon-circle-triangle-e">Next</span></a>
    +      <div class="ui-datepicker-title">
    +         <span class="ui-datepicker-month">January</span><span class="ui-datepicker-year">2009</span>
    +      </div>
    +   </div>
    +   <table class="ui-datepicker-calendar">
    +      <thead>
    +      <tr>
    +         <th class="ui-datepicker-week-end"><span title="Sunday">Su</span></th>
    +         ...
    +      </tr>
    +      </thead>
    +      <tbody><tr>
    +         <td class="ui-datepicker-week-end ui-datepicker-other-month "> 1 </td>
    +         ...
    +      </tr>
    +      </tbody>
    +   </table>
    +   <div class="ui-datepicker-buttonpane ui-widget-content">
    +      <button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all">Today</button>
    +      <button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all">Done</button>
    +   </div>
    +</div>
    +

    + + Note: This is a sample of markup generated by the datepicker plugin, not markup you should use to create a datepicker. The only markup needed for that is <input type="text" /> or <div></div>. + +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/dialog.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/dialog.html new file mode 100644 index 00000000000..90e9a79993d --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/dialog.html @@ -0,0 +1,1698 @@ + + +
    +

    jQuery UI Dialog

    +
    +

    Overview

    +
    +

    A dialog is a floating window that contains a title bar and a content area. The dialog window can be moved, resized and closed with the 'x' icon by default.

    +

    If the content length exceeds the maximum height, a scrollbar will automatically appear.

    +

    A bottom button bar and semi-transparent modal overlay layer are common options that can be added.

    +

    A call to $(foo).dialog() will initialize a dialog instance and will auto-open the dialog by default. If you want to reuse a dialog, the easiest way is to disable the "auto-open" option with: $(foo).dialog({ autoOpen: false }) and open it with $(foo).dialog('open'). To close it, use $(foo).dialog('close'). A more in-depth explanation with a full demo is available on the Nemikor blog.

    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Position
    • +
    • UI Widget
    • +
    • UI Mouse (Optional; only needed if using UI Draggable or UI Resizable)
    • +
    • UI Draggable (Optional)
    • +
    • UI Resizable (Optional)
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Dialog.
    +

    +
    $("#dialog").dialog();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  
    +  <script>
    +  $(document).ready(function() {
    +    $("#dialog").dialog();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="dialog" title="Dialog Title">I'm in a dialog</div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the dialog. Can be set when initialising (first creating) the dialog.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the disabled option specified. +
      +
      +
      $( ".selector" ).dialog({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).dialog( "option", "disabled" );
      +//setter
      +$( ".selector" ).dialog( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      autoOpen

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      When autoOpen is true the dialog will open automatically when dialog is called. If false it will stay hidden until .dialog("open") is called on it.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the autoOpen option specified. +
      +
      +
      $( ".selector" ).dialog({ autoOpen: false });
      +
      + + +
      + Get or set the autoOpen option, after init. +
      +
      +
      //getter
      +var autoOpen = $( ".selector" ).dialog( "option", "autoOpen" );
      +//setter
      +$( ".selector" ).dialog( "option", "autoOpen", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      buttons

      +
      +
      Type:
      +
      Object
      + +
      Default:
      +
      { }
      + +
      +
      +
      +

      Specifies which buttons should be displayed on the dialog. The property key is the text of the button. The value is the callback function for when the button is clicked. The context of the callback is the dialog element; if you need access to the button, it is available as the target of the event object. +

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the buttons option specified. +
      +
      +
      $( ".selector" ).dialog({ buttons: { "Ok": function() { $(this).dialog("close"); } } });
      +
      + + +
      + Get or set the buttons option, after init. +
      +
      +
      //getter
      +var buttons = $( ".selector" ).dialog( "option", "buttons" );
      +//setter
      +$( ".selector" ).dialog( "option", "buttons", { "Ok": function() { $(this).dialog("close"); } } );
      +
      + +
      +
      +
    • + + +
    • +
      +

      buttons

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      [ ]
      + +
      +
      +
      +

      Specifies which buttons should be displayed on the dialog. Each element of the array must be an Object defining the properties to set on the button. +

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the buttons option specified. +
      +
      +
      $( ".selector" ).dialog({ buttons: [
      +    {
      +        text: "Ok",
      +        click: function() { $(this).dialog("close"); }
      +    }
      +] });
      +
      + + +
      + Get or set the buttons option, after init. +
      +
      +
      //getter
      +var buttons = $( ".selector" ).dialog( "option", "buttons" );
      +//setter
      +$( ".selector" ).dialog( "option", "buttons", [
      +    {
      +        text: "Ok",
      +        click: function() { $(this).dialog("close"); }
      +    }
      +] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      closeOnEscape

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      Specifies whether the dialog should close when it has focus and the user presses the esacpe (ESC) key.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the closeOnEscape option specified. +
      +
      +
      $( ".selector" ).dialog({ closeOnEscape: false });
      +
      + + +
      + Get or set the closeOnEscape option, after init. +
      +
      +
      //getter
      +var closeOnEscape = $( ".selector" ).dialog( "option", "closeOnEscape" );
      +//setter
      +$( ".selector" ).dialog( "option", "closeOnEscape", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      closeText

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'close'
      + +
      +
      +
      +

      Specifies the text for the close button. Note that the close text is visibly hidden when using a standard theme.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the closeText option specified. +
      +
      +
      $( ".selector" ).dialog({ closeText: 'hide' });
      +
      + + +
      + Get or set the closeText option, after init. +
      +
      +
      //getter
      +var closeText = $( ".selector" ).dialog( "option", "closeText" );
      +//setter
      +$( ".selector" ).dialog( "option", "closeText", 'hide' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      dialogClass

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      ''
      + +
      +
      +
      +

      The specified class name(s) will be added to the dialog, for additional theming.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the dialogClass option specified. +
      +
      +
      $( ".selector" ).dialog({ dialogClass: 'alert' });
      +
      + + +
      + Get or set the dialogClass option, after init. +
      +
      +
      //getter
      +var dialogClass = $( ".selector" ).dialog( "option", "dialogClass" );
      +//setter
      +$( ".selector" ).dialog( "option", "dialogClass", 'alert' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      draggable

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      If set to true, the dialog will be draggable will be draggable by the titlebar.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the draggable option specified. +
      +
      +
      $( ".selector" ).dialog({ draggable: false });
      +
      + + +
      + Get or set the draggable option, after init. +
      +
      +
      //getter
      +var draggable = $( ".selector" ).dialog( "option", "draggable" );
      +//setter
      +$( ".selector" ).dialog( "option", "draggable", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      height

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      'auto'
      + +
      +
      +
      +

      The height of the dialog, in pixels. Specifying 'auto' is also supported to make the dialog adjust based on its content.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the height option specified. +
      +
      +
      $( ".selector" ).dialog({ height: 530 });
      +
      + + +
      + Get or set the height option, after init. +
      +
      +
      //getter
      +var height = $( ".selector" ).dialog( "option", "height" );
      +//setter
      +$( ".selector" ).dialog( "option", "height", 530 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      hide

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      The effect to be used when the dialog is closed.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the hide option specified. +
      +
      +
      $( ".selector" ).dialog({ hide: 'slide' });
      +
      + + +
      + Get or set the hide option, after init. +
      +
      +
      //getter
      +var hide = $( ".selector" ).dialog( "option", "hide" );
      +//setter
      +$( ".selector" ).dialog( "option", "hide", 'slide' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      maxHeight

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      The maximum height to which the dialog can be resized, in pixels.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the maxHeight option specified. +
      +
      +
      $( ".selector" ).dialog({ maxHeight: 400 });
      +
      + + +
      + Get or set the maxHeight option, after init. +
      +
      +
      //getter
      +var maxHeight = $( ".selector" ).dialog( "option", "maxHeight" );
      +//setter
      +$( ".selector" ).dialog( "option", "maxHeight", 400 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      maxWidth

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      The maximum width to which the dialog can be resized, in pixels.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the maxWidth option specified. +
      +
      +
      $( ".selector" ).dialog({ maxWidth: 600 });
      +
      + + +
      + Get or set the maxWidth option, after init. +
      +
      +
      //getter
      +var maxWidth = $( ".selector" ).dialog( "option", "maxWidth" );
      +//setter
      +$( ".selector" ).dialog( "option", "maxWidth", 600 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      minHeight

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      150
      + +
      +
      +
      +

      The minimum height to which the dialog can be resized, in pixels.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the minHeight option specified. +
      +
      +
      $( ".selector" ).dialog({ minHeight: 300 });
      +
      + + +
      + Get or set the minHeight option, after init. +
      +
      +
      //getter
      +var minHeight = $( ".selector" ).dialog( "option", "minHeight" );
      +//setter
      +$( ".selector" ).dialog( "option", "minHeight", 300 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      minWidth

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      150
      + +
      +
      +
      +

      The minimum width to which the dialog can be resized, in pixels.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the minWidth option specified. +
      +
      +
      $( ".selector" ).dialog({ minWidth: 400 });
      +
      + + +
      + Get or set the minWidth option, after init. +
      +
      +
      //getter
      +var minWidth = $( ".selector" ).dialog( "option", "minWidth" );
      +//setter
      +$( ".selector" ).dialog( "option", "minWidth", 400 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      modal

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set to true, the dialog will have modal behavior; other items on the page will be disabled (i.e. cannot be interacted with). Modal dialogs create an overlay below the dialog but above other page elements.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the modal option specified. +
      +
      +
      $( ".selector" ).dialog({ modal: true });
      +
      + + +
      + Get or set the modal option, after init. +
      +
      +
      //getter
      +var modal = $( ".selector" ).dialog( "option", "modal" );
      +//setter
      +$( ".selector" ).dialog( "option", "modal", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      position

      +
      +
      Type:
      +
      String, Array
      + +
      Default:
      +
      'center'
      + +
      +
      +
      +

      Specifies where the dialog should be displayed. Possible values:
      1) a single string representing position within viewport: 'center', 'left', 'right', 'top', 'bottom'.
      2) an array containing an x,y coordinate pair in pixel offset from left, top corner of viewport (e.g. [350,100])
      3) an array containing x,y position string values (e.g. ['right','top'] for top right corner).

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the position option specified. +
      +
      +
      $( ".selector" ).dialog({ position: 'top' });
      +
      + + +
      + Get or set the position option, after init. +
      +
      +
      //getter
      +var position = $( ".selector" ).dialog( "option", "position" );
      +//setter
      +$( ".selector" ).dialog( "option", "position", 'top' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      resizable

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      If set to true, the dialog will be resizeable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the resizable option specified. +
      +
      +
      $( ".selector" ).dialog({ resizable: false });
      +
      + + +
      + Get or set the resizable option, after init. +
      +
      +
      //getter
      +var resizable = $( ".selector" ).dialog( "option", "resizable" );
      +//setter
      +$( ".selector" ).dialog( "option", "resizable", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      show

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      The effect to be used when the dialog is opened.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the show option specified. +
      +
      +
      $( ".selector" ).dialog({ show: 'slide' });
      +
      + + +
      + Get or set the show option, after init. +
      +
      +
      //getter
      +var show = $( ".selector" ).dialog( "option", "show" );
      +//setter
      +$( ".selector" ).dialog( "option", "show", 'slide' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      stack

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      Specifies whether the dialog will stack on top of other dialogs. This will cause the dialog to move to the front of other dialogs when it gains focus.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the stack option specified. +
      +
      +
      $( ".selector" ).dialog({ stack: false });
      +
      + + +
      + Get or set the stack option, after init. +
      +
      +
      //getter
      +var stack = $( ".selector" ).dialog( "option", "stack" );
      +//setter
      +$( ".selector" ).dialog( "option", "stack", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      title

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      ''
      + +
      +
      +
      +

      Specifies the title of the dialog. Any valid HTML may be set as the title. The title can also be specified by the title attribute on the dialog source element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the title option specified. +
      +
      +
      $( ".selector" ).dialog({ title: 'Dialog Title' });
      +
      + + +
      + Get or set the title option, after init. +
      +
      +
      //getter
      +var title = $( ".selector" ).dialog( "option", "title" );
      +//setter
      +$( ".selector" ).dialog( "option", "title", 'Dialog Title' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      width

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      300
      + +
      +
      +
      +

      The width of the dialog, in pixels.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the width option specified. +
      +
      +
      $( ".selector" ).dialog({ width: 460 });
      +
      + + +
      + Get or set the width option, after init. +
      +
      +
      //getter
      +var width = $( ".selector" ).dialog( "option", "width" );
      +//setter
      +$( ".selector" ).dialog( "option", "width", 460 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      zIndex

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      1000
      + +
      +
      +
      +

      The starting z-index for the dialog.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a dialog with the zIndex option specified. +
      +
      +
      $( ".selector" ).dialog({ zIndex: 3999 });
      +
      + + +
      + Get or set the zIndex option, after init. +
      +
      +
      //getter
      +var zIndex = $( ".selector" ).dialog( "option", "zIndex" );
      +//setter
      +$( ".selector" ).dialog( "option", "zIndex", 3999 );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      dialogcreate
      +
      +
      +
      +

      This event is triggered when dialog is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: dialogcreate. +
      +
      +
      $( ".selector" ).bind( "dialogcreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      beforeClose

      +
      +
      Type:
      +
      dialogbeforeclose
      +
      +
      +
      +

      This event is triggered when a dialog attempts to close. If the beforeClose event handler (callback function) returns false, the close will be prevented.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the beforeClose event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   beforeClose: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the beforeClose event by type: dialogbeforeclose. +
      +
      +
      $( ".selector" ).bind( "dialogbeforeclose", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      open

      +
      +
      Type:
      +
      dialogopen
      +
      +
      +
      +

      This event is triggered when dialog is opened.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the open event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   open: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the open event by type: dialogopen. +
      +
      +
      $( ".selector" ).bind( "dialogopen", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      focus

      +
      +
      Type:
      +
      dialogfocus
      +
      +
      +
      +

      This event is triggered when the dialog gains focus.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the focus event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   focus: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the focus event by type: dialogfocus. +
      +
      +
      $( ".selector" ).bind( "dialogfocus", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      dragStart

      +
      +
      Type:
      +
      dialogdragstart
      +
      +
      +
      +

      This event is triggered at the beginning of the dialog being dragged.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the dragStart event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   dragStart: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the dragStart event by type: dialogdragstart. +
      +
      +
      $( ".selector" ).bind( "dialogdragstart", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      drag

      +
      +
      Type:
      +
      dialogdrag
      +
      +
      +
      +

      This event is triggered when the dialog is dragged.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the drag event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   drag: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the drag event by type: dialogdrag. +
      +
      +
      $( ".selector" ).bind( "dialogdrag", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      dragStop

      +
      +
      Type:
      +
      dialogdragstop
      +
      +
      +
      +

      This event is triggered after the dialog has been dragged.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the dragStop event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   dragStop: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the dragStop event by type: dialogdragstop. +
      +
      +
      $( ".selector" ).bind( "dialogdragstop", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      resizeStart

      +
      +
      Type:
      +
      dialogresizestart
      +
      +
      +
      +

      This event is triggered at the beginning of the dialog being resized.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the resizeStart event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   resizeStart: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the resizeStart event by type: dialogresizestart. +
      +
      +
      $( ".selector" ).bind( "dialogresizestart", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      resize

      +
      +
      Type:
      +
      dialogresize
      +
      +
      +
      +

      This event is triggered when the dialog is resized. demo

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the resize event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   resize: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the resize event by type: dialogresize. +
      +
      +
      $( ".selector" ).bind( "dialogresize", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      resizeStop

      +
      +
      Type:
      +
      dialogresizestop
      +
      +
      +
      +

      This event is triggered after the dialog has been resized.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the resizeStop event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   resizeStop: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the resizeStop event by type: dialogresizestop. +
      +
      +
      $( ".selector" ).bind( "dialogresizestop", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      close

      +
      +
      Type:
      +
      dialogclose
      +
      +
      +
      +

      This event is triggered when the dialog is closed.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the close event as an init option. +
      +
      +
      $( ".selector" ).dialog({
      +   close: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the close event by type: dialogclose. +
      +
      +
      $( ".selector" ).bind( "dialogclose", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .dialog( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the dialog functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .dialog( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the dialog.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .dialog( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the dialog.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .dialog( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any dialog option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .dialog( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple dialog options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .dialog( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-dialog element.

      +
      +
    • + + +
    • +
      +

      close

      +
      +
      Signature:
      +
      .dialog( "close" + + + + + + + +)
      +
      +
      +
      +

      Close the dialog.

      +
      +
    • + + +
    • +
      +

      isOpen

      +
      +
      Signature:
      +
      .dialog( "isOpen" + + + + + + + +)
      +
      +
      +
      +

      Returns true if the dialog is currently open.

      +
      +
    • + + +
    • +
      +

      moveToTop

      +
      +
      Signature:
      +
      .dialog( "moveToTop" + + + + + + + +)
      +
      +
      +
      +

      Move the dialog to the top of the dialogs stack.

      +
      +
    • + + +
    • +
      +

      open

      +
      +
      Signature:
      +
      .dialog( "open" + + + + + + + +)
      +
      +
      +
      +

      Open the dialog.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Dialog plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.dialog.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <div class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-draggable ui-resizable">
    +   <div class="ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix">
    +      <span id="ui-dialog-title-dialog" class="ui-dialog-title">Dialog title</span>
    +      <a class="ui-dialog-titlebar-close ui-corner-all" href="#"><span class="ui-icon ui-icon-closethick">close</span></a>
    +   </div>
    +   <div style="height: 200px; min-height: 109px; width: auto;" class="ui-dialog-content ui-widget-content" id="dialog">
    +      <p>Dialog content goes here.</p>
    +   </div>
    +</div>
    +

    + + Note: This is a sample of markup generated by the dialog plugin, not markup you should use to create a dialog. The only markup needed for that is <div></div>. + +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/draggable.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/draggable.html new file mode 100644 index 00000000000..5a17ef23d0b --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/draggable.html @@ -0,0 +1,1577 @@ + + +
    +

    jQuery UI Draggable

    +
    +

    Overview

    +
    +

    The jQuery UI Draggable plugin makes selected elements draggable by mouse.

    +

    Draggable elements gets a class of ui-draggable. During drag the element also gets a class of ui-draggable-dragging. If you want not just drag, but drag-and-drop, see the jQuery UI Droppable plugin, which provides a drop target for draggables.

    +

    All callbacks (start, stop, drag) receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):

    +
      +
    • ui.helper - the jQuery object representing the helper that's being dragged
    • +
    • ui.position - current position of the helper as { top, left } object, relative to the offset element
    • +
    • ui.offset - current absolute position of the helper as { top, left } object, relative to page
    • +
    +


    +

    +

    To manipulate the position of a draggable during drag, you can either use a wrapper as the draggable helper and position the wrapped element with absolute positioning, or you can correct internal values like so: $(this).data('draggable').offset.click.top -= x.

    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Widget
    • +
    • UI Mouse
    • +
    +
    +
    +

    Example

    +
    + +

    +Initialize a draggable with default options.
    +

    +
    $("#draggable").draggable();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <style type="text/css">
    +    #draggable { width: 100px; height: 70px; background: silver; }
    +  </style>
    +  <script>
    +  $(document).ready(function() {
    +    $("#draggable").draggable();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="draggable">Drag me</div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the draggable. Can be set when initialising (first creating) the draggable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the disabled option specified. +
      +
      +
      $( ".selector" ).draggable({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).draggable( "option", "disabled" );
      +//setter
      +$( ".selector" ).draggable( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      addClasses

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      If set to false, will prevent the ui-draggable class from being added. This may be desired as a performance optimization when calling .draggable() init on many hundreds of elements.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the addClasses option specified. +
      +
      +
      $( ".selector" ).draggable({ addClasses: false });
      +
      + + +
      + Get or set the addClasses option, after init. +
      +
      +
      //getter
      +var addClasses = $( ".selector" ).draggable( "option", "addClasses" );
      +//setter
      +$( ".selector" ).draggable( "option", "addClasses", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      appendTo

      +
      +
      Type:
      +
      Element, Selector
      + +
      Default:
      +
      'parent'
      + +
      +
      +
      +

      The element passed to or selected by the appendTo option will be used as the draggable helper's container during dragging. By default, the helper is appended to the same container as the draggable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the appendTo option specified. +
      +
      +
      $( ".selector" ).draggable({ appendTo: 'body' });
      +
      + + +
      + Get or set the appendTo option, after init. +
      +
      +
      //getter
      +var appendTo = $( ".selector" ).draggable( "option", "appendTo" );
      +//setter
      +$( ".selector" ).draggable( "option", "appendTo", 'body' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      axis

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Constrains dragging to either the horizontal (x) or vertical (y) axis. Possible values: 'x', 'y'.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the axis option specified. +
      +
      +
      $( ".selector" ).draggable({ axis: 'x' });
      +
      + + +
      + Get or set the axis option, after init. +
      +
      +
      //getter
      +var axis = $( ".selector" ).draggable( "option", "axis" );
      +//setter
      +$( ".selector" ).draggable( "option", "axis", 'x' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      cancel

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      ':input,option'
      + +
      +
      +
      +

      Prevents dragging from starting on specified elements.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the cancel option specified. +
      +
      +
      $( ".selector" ).draggable({ cancel: 'button' });
      +
      + + +
      + Get or set the cancel option, after init. +
      +
      +
      //getter
      +var cancel = $( ".selector" ).draggable( "option", "cancel" );
      +//setter
      +$( ".selector" ).draggable( "option", "cancel", 'button' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      connectToSortable

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Allows the draggable to be dropped onto the specified sortables. If this option is used (helper must be set to 'clone' in order to work flawlessly), a draggable can be dropped onto a sortable list and then becomes part of it. +

      Note: Specifying this option as an array of selectors has been removed.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the connectToSortable option specified. +
      +
      +
      $( ".selector" ).draggable({ connectToSortable: 'ul#myList' });
      +
      + + +
      + Get or set the connectToSortable option, after init. +
      +
      +
      //getter
      +var connectToSortable = $( ".selector" ).draggable( "option", "connectToSortable" );
      +//setter
      +$( ".selector" ).draggable( "option", "connectToSortable", 'ul#myList' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      containment

      +
      +
      Type:
      +
      Selector, Element, String, Array
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Constrains dragging to within the bounds of the specified element or region. Possible string values: 'parent', 'document', 'window', [x1, y1, x2, y2].

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the containment option specified. +
      +
      +
      $( ".selector" ).draggable({ containment: 'parent' });
      +
      + + +
      + Get or set the containment option, after init. +
      +
      +
      //getter
      +var containment = $( ".selector" ).draggable( "option", "containment" );
      +//setter
      +$( ".selector" ).draggable( "option", "containment", 'parent' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      cursor

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'auto'
      + +
      +
      +
      +

      The css cursor during the drag operation.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the cursor option specified. +
      +
      +
      $( ".selector" ).draggable({ cursor: 'crosshair' });
      +
      + + +
      + Get or set the cursor option, after init. +
      +
      +
      //getter
      +var cursor = $( ".selector" ).draggable( "option", "cursor" );
      +//setter
      +$( ".selector" ).draggable( "option", "cursor", 'crosshair' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      cursorAt

      +
      +
      Type:
      +
      Object
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Sets the offset of the dragging helper relative to the mouse cursor. Coordinates can be given as a hash using a combination of one or two keys: { top, left, right, bottom }.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the cursorAt option specified. +
      +
      +
      $( ".selector" ).draggable({ cursorAt: { left: 5 } });
      +
      + + +
      + Get or set the cursorAt option, after init. +
      +
      +
      //getter
      +var cursorAt = $( ".selector" ).draggable( "option", "cursorAt" );
      +//setter
      +$( ".selector" ).draggable( "option", "cursorAt", { left: 5 } );
      +
      + +
      +
      +
    • + + +
    • +
      +

      delay

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      Time in milliseconds after mousedown until dragging should start. This option can be used to prevent unwanted drags when clicking on an element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the delay option specified. +
      +
      +
      $( ".selector" ).draggable({ delay: 500 });
      +
      + + +
      + Get or set the delay option, after init. +
      +
      +
      //getter
      +var delay = $( ".selector" ).draggable( "option", "delay" );
      +//setter
      +$( ".selector" ).draggable( "option", "delay", 500 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      distance

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      1
      + +
      +
      +
      +

      Distance in pixels after mousedown the mouse must move before dragging should start. This option can be used to prevent unwanted drags when clicking on an element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the distance option specified. +
      +
      +
      $( ".selector" ).draggable({ distance: 30 });
      +
      + + +
      + Get or set the distance option, after init. +
      +
      +
      //getter
      +var distance = $( ".selector" ).draggable( "option", "distance" );
      +//setter
      +$( ".selector" ).draggable( "option", "distance", 30 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      grid

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Snaps the dragging helper to a grid, every x and y pixels. Array values: [x, y]

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the grid option specified. +
      +
      +
      $( ".selector" ).draggable({ grid: [50, 20] });
      +
      + + +
      + Get or set the grid option, after init. +
      +
      +
      //getter
      +var grid = $( ".selector" ).draggable( "option", "grid" );
      +//setter
      +$( ".selector" ).draggable( "option", "grid", [50, 20] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      handle

      +
      +
      Type:
      +
      Element, Selector
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If specified, restricts drag start click to the specified element(s).

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the handle option specified. +
      +
      +
      $( ".selector" ).draggable({ handle: 'h2' });
      +
      + + +
      + Get or set the handle option, after init. +
      +
      +
      //getter
      +var handle = $( ".selector" ).draggable( "option", "handle" );
      +//setter
      +$( ".selector" ).draggable( "option", "handle", 'h2' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      helper

      +
      +
      Type:
      +
      String, Function
      + +
      Default:
      +
      'original'
      + +
      +
      +
      +

      Allows for a helper element to be used for dragging display. Possible values: 'original', 'clone', Function. If a function is specified, it must return a DOMElement.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the helper option specified. +
      +
      +
      $( ".selector" ).draggable({ helper: 'clone' });
      +
      + + +
      + Get or set the helper option, after init. +
      +
      +
      //getter
      +var helper = $( ".selector" ).draggable( "option", "helper" );
      +//setter
      +$( ".selector" ).draggable( "option", "helper", 'clone' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      iframeFix

      +
      +
      Type:
      +
      Boolean, Selector
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Prevent iframes from capturing the mousemove events during a drag. Useful in combination with cursorAt, or in any case, if the mouse cursor is not over the helper. If set to true, transparent overlays will be placed over all iframes on the page. If a selector is supplied, the matched iframes will have an overlay placed over them.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the iframeFix option specified. +
      +
      +
      $( ".selector" ).draggable({ iframeFix: true });
      +
      + + +
      + Get or set the iframeFix option, after init. +
      +
      +
      //getter
      +var iframeFix = $( ".selector" ).draggable( "option", "iframeFix" );
      +//setter
      +$( ".selector" ).draggable( "option", "iframeFix", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      opacity

      +
      +
      Type:
      +
      Float
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Opacity for the helper while being dragged.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the opacity option specified. +
      +
      +
      $( ".selector" ).draggable({ opacity: 0.35 });
      +
      + + +
      + Get or set the opacity option, after init. +
      +
      +
      //getter
      +var opacity = $( ".selector" ).draggable( "option", "opacity" );
      +//setter
      +$( ".selector" ).draggable( "option", "opacity", 0.35 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      refreshPositions

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set to true, all droppable positions are calculated on every mousemove. Caution: This solves issues on highly dynamic pages, but dramatically decreases performance.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the refreshPositions option specified. +
      +
      +
      $( ".selector" ).draggable({ refreshPositions: true });
      +
      + + +
      + Get or set the refreshPositions option, after init. +
      +
      +
      //getter
      +var refreshPositions = $( ".selector" ).draggable( "option", "refreshPositions" );
      +//setter
      +$( ".selector" ).draggable( "option", "refreshPositions", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      revert

      +
      +
      Type:
      +
      Boolean, String
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set to true, the element will return to its start position when dragging stops. Possible string values: 'valid', 'invalid'. If set to invalid, revert will only occur if the draggable has not been dropped on a droppable. For valid, it's the other way around.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the revert option specified. +
      +
      +
      $( ".selector" ).draggable({ revert: true });
      +
      + + +
      + Get or set the revert option, after init. +
      +
      +
      //getter
      +var revert = $( ".selector" ).draggable( "option", "revert" );
      +//setter
      +$( ".selector" ).draggable( "option", "revert", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      revertDuration

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      500
      + +
      +
      +
      +

      The duration of the revert animation, in milliseconds. Ignored if revert is false.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the revertDuration option specified. +
      +
      +
      $( ".selector" ).draggable({ revertDuration: 1000 });
      +
      + + +
      + Get or set the revertDuration option, after init. +
      +
      +
      //getter
      +var revertDuration = $( ".selector" ).draggable( "option", "revertDuration" );
      +//setter
      +$( ".selector" ).draggable( "option", "revertDuration", 1000 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      scope

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'default'
      + +
      +
      +
      +

      Used to group sets of draggable and droppable items, in addition to droppable's accept option. A draggable with the same scope value as a droppable will be accepted by the droppable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the scope option specified. +
      +
      +
      $( ".selector" ).draggable({ scope: 'tasks' });
      +
      + + +
      + Get or set the scope option, after init. +
      +
      +
      //getter
      +var scope = $( ".selector" ).draggable( "option", "scope" );
      +//setter
      +$( ".selector" ).draggable( "option", "scope", 'tasks' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      scroll

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      If set to true, container auto-scrolls while dragging.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the scroll option specified. +
      +
      +
      $( ".selector" ).draggable({ scroll: false });
      +
      + + +
      + Get or set the scroll option, after init. +
      +
      +
      //getter
      +var scroll = $( ".selector" ).draggable( "option", "scroll" );
      +//setter
      +$( ".selector" ).draggable( "option", "scroll", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      scrollSensitivity

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      20
      + +
      +
      +
      +

      Distance in pixels from the edge of the viewport after which the viewport should scroll. Distance is relative to pointer, not the draggable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the scrollSensitivity option specified. +
      +
      +
      $( ".selector" ).draggable({ scrollSensitivity: 40 });
      +
      + + +
      + Get or set the scrollSensitivity option, after init. +
      +
      +
      //getter
      +var scrollSensitivity = $( ".selector" ).draggable( "option", "scrollSensitivity" );
      +//setter
      +$( ".selector" ).draggable( "option", "scrollSensitivity", 40 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      scrollSpeed

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      20
      + +
      +
      +
      +

      The speed at which the window should scroll once the mouse pointer gets within the scrollSensitivity distance.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the scrollSpeed option specified. +
      +
      +
      $( ".selector" ).draggable({ scrollSpeed: 40 });
      +
      + + +
      + Get or set the scrollSpeed option, after init. +
      +
      +
      //getter
      +var scrollSpeed = $( ".selector" ).draggable( "option", "scrollSpeed" );
      +//setter
      +$( ".selector" ).draggable( "option", "scrollSpeed", 40 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      snap

      +
      +
      Type:
      +
      Boolean, Selector
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set to a selector or to true (equivalent to '.ui-draggable'), the draggable will snap to the edges of the selected elements when near an edge of the element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the snap option specified. +
      +
      +
      $( ".selector" ).draggable({ snap: true });
      +
      + + +
      + Get or set the snap option, after init. +
      +
      +
      //getter
      +var snap = $( ".selector" ).draggable( "option", "snap" );
      +//setter
      +$( ".selector" ).draggable( "option", "snap", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      snapMode

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'both'
      + +
      +
      +
      +

      Determines which edges of snap elements the draggable will snap to. Ignored if snap is false. Possible values: 'inner', 'outer', 'both'

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the snapMode option specified. +
      +
      +
      $( ".selector" ).draggable({ snapMode: 'outer' });
      +
      + + +
      + Get or set the snapMode option, after init. +
      +
      +
      //getter
      +var snapMode = $( ".selector" ).draggable( "option", "snapMode" );
      +//setter
      +$( ".selector" ).draggable( "option", "snapMode", 'outer' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      snapTolerance

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      20
      + +
      +
      +
      +

      The distance in pixels from the snap element edges at which snapping should occur. Ignored if snap is false.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the snapTolerance option specified. +
      +
      +
      $( ".selector" ).draggable({ snapTolerance: 40 });
      +
      + + +
      + Get or set the snapTolerance option, after init. +
      +
      +
      //getter
      +var snapTolerance = $( ".selector" ).draggable( "option", "snapTolerance" );
      +//setter
      +$( ".selector" ).draggable( "option", "snapTolerance", 40 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      stack

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Controls the z-Index of the set of elements that match the selector, always brings to front the dragged item. Very useful in things like window managers.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the stack option specified. +
      +
      +
      $( ".selector" ).draggable({ stack: ".products" });
      +
      + + +
      + Get or set the stack option, after init. +
      +
      +
      //getter
      +var stack = $( ".selector" ).draggable( "option", "stack" );
      +//setter
      +$( ".selector" ).draggable( "option", "stack", ".products" );
      +
      + +
      +
      +
    • + + +
    • +
      +

      zIndex

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      z-index for the helper while being dragged.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a draggable with the zIndex option specified. +
      +
      +
      $( ".selector" ).draggable({ zIndex: 2700 });
      +
      + + +
      + Get or set the zIndex option, after init. +
      +
      +
      //getter
      +var zIndex = $( ".selector" ).draggable( "option", "zIndex" );
      +//setter
      +$( ".selector" ).draggable( "option", "zIndex", 2700 );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      dragcreate
      +
      +
      +
      +

      This event is triggered when draggable is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).draggable({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: dragcreate. +
      +
      +
      $( ".selector" ).bind( "dragcreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      start

      +
      +
      Type:
      +
      dragstart
      +
      +
      +
      +

      This event is triggered when dragging starts.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the start event as an init option. +
      +
      +
      $( ".selector" ).draggable({
      +   start: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the start event by type: dragstart. +
      +
      +
      $( ".selector" ).bind( "dragstart", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      drag

      +
      +
      Type:
      +
      drag
      +
      +
      +
      +

      This event is triggered when the mouse is moved during the dragging.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the drag event as an init option. +
      +
      +
      $( ".selector" ).draggable({
      +   drag: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the drag event by type: drag. +
      +
      +
      $( ".selector" ).bind( "drag", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      stop

      +
      +
      Type:
      +
      dragstop
      +
      +
      +
      +

      This event is triggered when dragging stops.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the stop event as an init option. +
      +
      +
      $( ".selector" ).draggable({
      +   stop: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the stop event by type: dragstop. +
      +
      +
      $( ".selector" ).bind( "dragstop", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .draggable( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the draggable functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .draggable( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the draggable.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .draggable( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the draggable.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .draggable( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any draggable option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .draggable( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple draggable options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .draggable( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-draggable element.

      +
      +
    • + + +
    +
    +
    +

    Theming

    +

    The jQuery UI Draggable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.draggable.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <div class="ui-draggable"></div> +

    + + Note: This is a sample of markup generated by the draggable plugin, not markup you should use to create a draggable. The only markup needed for that is <div></div>. + +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/droppable.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/droppable.html new file mode 100644 index 00000000000..6815c8db809 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/droppable.html @@ -0,0 +1,829 @@ + + +
    +

    jQuery UI Droppable

    +
    +

    Overview

    +
    +

    The jQuery UI Droppable plugin makes selected elements droppable (meaning they accept being dropped on by draggables). You can specify which (individually) or which kind of draggables each will accept.

    +

    All callbacks receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):

    +
      +
    • ui.draggable - current draggable element, a jQuery object.
    • +
    • ui.helper - current draggable helper, a jQuery object
    • +
    • ui.position - current position of the draggable helper { top: , left: }
    • +
    • ui.offset - current absolute position of the draggable helper { top: , left: }
    • +
    +
    +
    +

    Dependencies

    + +
    +
    +

    Example

    +
    + +

    +Makes the div droppable (a drop target for a draggable).
    +

    +
    $("#draggable").draggable();
    +    $("#droppable").droppable({
    +      drop: function() { alert('dropped'); }
    +    });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <style type="text/css">
    +    #draggable { width: 75px; height: 25px; background: silver; padding: 10px; }
    +    #droppable { position: absolute; left: 250px; top: 0; width: 125px; height: 75px; background: gray; color: white; padding: 10px; }
    +  </style>
    +  <script>
    +  $(document).ready(function() {
    +    $("#draggable").draggable();
    +    $("#droppable").droppable({
    +      drop: function() { alert('dropped'); }
    +    });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="droppable">Drop here</div>
    +<div id="draggable">Drag me</div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the droppable. Can be set when initialising (first creating) the droppable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a droppable with the disabled option specified. +
      +
      +
      $( ".selector" ).droppable({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).droppable( "option", "disabled" );
      +//setter
      +$( ".selector" ).droppable( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      accept

      +
      +
      Type:
      +
      Selector, Function
      + +
      Default:
      +
      '*'
      + +
      +
      +
      +

      All draggables that match the selector will be accepted. If a function is specified, the function will be called for each draggable on the page (passed as the first argument to the function), to provide a custom filter. The function should return true if the draggable should be accepted.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a droppable with the accept option specified. +
      +
      +
      $( ".selector" ).droppable({ accept: '.special' });
      +
      + + +
      + Get or set the accept option, after init. +
      +
      +
      //getter
      +var accept = $( ".selector" ).droppable( "option", "accept" );
      +//setter
      +$( ".selector" ).droppable( "option", "accept", '.special' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      activeClass

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If specified, the class will be added to the droppable while an acceptable draggable is being dragged.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a droppable with the activeClass option specified. +
      +
      +
      $( ".selector" ).droppable({ activeClass: 'ui-state-highlight' });
      +
      + + +
      + Get or set the activeClass option, after init. +
      +
      +
      //getter
      +var activeClass = $( ".selector" ).droppable( "option", "activeClass" );
      +//setter
      +$( ".selector" ).droppable( "option", "activeClass", 'ui-state-highlight' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      addClasses

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      If set to false, will prevent the ui-droppable class from being added. This may be desired as a performance optimization when calling .droppable() init on many hundreds of elements.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a droppable with the addClasses option specified. +
      +
      +
      $( ".selector" ).droppable({ addClasses: false });
      +
      + + +
      + Get or set the addClasses option, after init. +
      +
      +
      //getter
      +var addClasses = $( ".selector" ).droppable( "option", "addClasses" );
      +//setter
      +$( ".selector" ).droppable( "option", "addClasses", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      greedy

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If true, will prevent event propagation on nested droppables.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a droppable with the greedy option specified. +
      +
      +
      $( ".selector" ).droppable({ greedy: true });
      +
      + + +
      + Get or set the greedy option, after init. +
      +
      +
      //getter
      +var greedy = $( ".selector" ).droppable( "option", "greedy" );
      +//setter
      +$( ".selector" ).droppable( "option", "greedy", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      hoverClass

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If specified, the class will be added to the droppable while an acceptable draggable is being hovered.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a droppable with the hoverClass option specified. +
      +
      +
      $( ".selector" ).droppable({ hoverClass: 'drophover' });
      +
      + + +
      + Get or set the hoverClass option, after init. +
      +
      +
      //getter
      +var hoverClass = $( ".selector" ).droppable( "option", "hoverClass" );
      +//setter
      +$( ".selector" ).droppable( "option", "hoverClass", 'drophover' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      scope

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'default'
      + +
      +
      +
      +

      Used to group sets of draggable and droppable items, in addition to droppable's accept option. A draggable with the same scope value as a droppable will be accepted.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a droppable with the scope option specified. +
      +
      +
      $( ".selector" ).droppable({ scope: 'tasks' });
      +
      + + +
      + Get or set the scope option, after init. +
      +
      +
      //getter
      +var scope = $( ".selector" ).droppable( "option", "scope" );
      +//setter
      +$( ".selector" ).droppable( "option", "scope", 'tasks' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      tolerance

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'intersect'
      + +
      +
      +
      +

      Specifies which mode to use for testing whether a draggable is 'over' a droppable. Possible values: 'fit', 'intersect', 'pointer', 'touch'. +

      +
        +
      • fit: draggable overlaps the droppable entirely
      • +
      • intersect: draggable overlaps the droppable at least 50%
      • +
      • pointer: mouse pointer overlaps the droppable
      • +
      • touch: draggable overlaps the droppable any amount
      • +
      +

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a droppable with the tolerance option specified. +
      +
      +
      $( ".selector" ).droppable({ tolerance: 'fit' });
      +
      + + +
      + Get or set the tolerance option, after init. +
      +
      +
      //getter
      +var tolerance = $( ".selector" ).droppable( "option", "tolerance" );
      +//setter
      +$( ".selector" ).droppable( "option", "tolerance", 'fit' );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      dropcreate
      +
      +
      +
      +

      This event is triggered when droppable is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).droppable({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: dropcreate. +
      +
      +
      $( ".selector" ).bind( "dropcreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      activate

      +
      +
      Type:
      +
      dropactivate
      +
      +
      +
      +

      This event is triggered any time an accepted draggable starts dragging. This can be useful if you want to make the droppable 'light up' when it can be dropped on.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the activate event as an init option. +
      +
      +
      $( ".selector" ).droppable({
      +   activate: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the activate event by type: dropactivate. +
      +
      +
      $( ".selector" ).bind( "dropactivate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      deactivate

      +
      +
      Type:
      +
      dropdeactivate
      +
      +
      +
      +

      This event is triggered any time an accepted draggable stops dragging.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the deactivate event as an init option. +
      +
      +
      $( ".selector" ).droppable({
      +   deactivate: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the deactivate event by type: dropdeactivate. +
      +
      +
      $( ".selector" ).bind( "dropdeactivate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      over

      +
      +
      Type:
      +
      dropover
      +
      +
      +
      +

      This event is triggered as an accepted draggable is dragged 'over' (within the tolerance of) this droppable.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the over event as an init option. +
      +
      +
      $( ".selector" ).droppable({
      +   over: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the over event by type: dropover. +
      +
      +
      $( ".selector" ).bind( "dropover", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      out

      +
      +
      Type:
      +
      dropout
      +
      +
      +
      +

      This event is triggered when an accepted draggable is dragged out (within the tolerance of) this droppable.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the out event as an init option. +
      +
      +
      $( ".selector" ).droppable({
      +   out: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the out event by type: dropout. +
      +
      +
      $( ".selector" ).bind( "dropout", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      drop

      +
      +
      Type:
      +
      drop
      +
      +
      +
      +

      This event is triggered when an accepted draggable is dropped 'over' (within the tolerance of) this droppable. In the callback, $(this) represents the droppable the draggable is dropped on. +ui.draggable represents the draggable.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the drop event as an init option. +
      +
      +
      $( ".selector" ).droppable({
      +   drop: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the drop event by type: drop. +
      +
      +
      $( ".selector" ).bind( "drop", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .droppable( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the droppable functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .droppable( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the droppable.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .droppable( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the droppable.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .droppable( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any droppable option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .droppable( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple droppable options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .droppable( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-droppable element.

      +
      +
    • + + +
    +
    +
    +

    Theming

    +

    The jQuery UI Droppable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.droppable.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <div class="ui-droppable"></div> +

    + + Note: This is a sample of markup generated by the droppable plugin, not markup you should use to create a droppable. The only markup needed for that is <div></div>. + +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/effect.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/effect.html new file mode 100644 index 00000000000..fca68571db4 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/effect.html @@ -0,0 +1,143 @@ + + +
    +

    jQuery UI effect

    +
    +

    Overview

    +
    +

    effect( effect, [options], [speed], [callback] )

    +

    Uses a specific effect on an element (without the show/hide logic).

    +
    +
    +

    Dependencies

    +
      +
    • Effects Core
    • +
    +
    +
    +

    Example

    +
    + +

    +Apply the effect explode if you click on the element.
    +

    +
    $("p").click(function () {
    +      $("div").effect("explode");
    +    });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <script src="http://ui.jquery.com/latest/ui/effects.core.js"></script>
    +<script src="http://ui.jquery.com/latest/ui/effects.explode.js"></script>
    +<style type="text/css">
    +  div { margin: 0 auto; width: 100px; height: 80px; background: blue; position: relative; }
    +</style>
    +  <script>
    +  $(document).ready(function() {
    +    $("p").click(function () {
    +      $("div").effect("explode");
    +    });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<p>Click me</p><div></div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Arguments

    +
      + +
    • +
      +

      effect

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      The effect to be used. Possible values: 'blind', 'bounce', 'clip', 'drop', 'explode', 'fold', 'highlight', 'puff', 'pulsate', 'scale', 'shake', 'size', 'slide', 'transfer'.

      +
      +
    • + + +
    • +
      +

      options

      +
      +
      Type:
      +
      Hash
      + +
      Optional
      + +
      +
      +
      +

      A object/hash including specific options for the effect.

      +
      +
    • + + +
    • +
      +

      speed

      +
      +
      Type:
      +
      String, Number
      + +
      Optional
      + +
      +
      +
      +

      A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).

      +
      +
    • + + +
    • +
      +

      callback

      +
      +
      Type:
      +
      Function
      + +
      Optional
      + +
      +
      +
      +

      A function that is called after the effect is completed.

      +
      +
    • + +
    +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/hide.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/hide.html new file mode 100644 index 00000000000..5ef2d43ab79 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/hide.html @@ -0,0 +1,144 @@ + + +
    +

    jQuery UI hide

    +
    +

    Overview

    +
    +

    hide( effect, [options], [speed], [callback] )

    +

    The enhanced hide method optionally accepts jQuery UI advanced effects.

    +

    Uses a specific effect on an element to hide the element if the first argument is an effect string.

    +
    +
    +

    Dependencies

    +
      +
    • Effects Core
    • +
    +
    +
    +

    Example

    +
    + +

    +Apply the effect slide if you click on the p to hide a div.
    +

    +
    $("p").click(function () {
    +      $("div").hide("slide", {}, 1000);
    +    });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <script src="http://ui.jquery.com/latest/ui/effects.core.js"></script>
    +<script src="http://ui.jquery.com/latest/ui/effects.slide.js"></script>
    +<style type="text/css">
    +  div { margin: 0px; width: 100px; height: 80px; background: blue; position: relative; }
    +</style>
    +  <script>
    +  $(document).ready(function() {
    +    $("p").click(function () {
    +      $("div").hide("slide", {}, 1000);
    +    });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<p>Click me</p><div></div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Arguments

    +
      + +
    • +
      +

      effect

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      The effect to be used. Possible values: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'.

      +
      +
    • + + +
    • +
      +

      options

      +
      +
      Type:
      +
      Hash
      + +
      Optional
      + +
      +
      +
      +

      A object/hash including specific options for the effect.

      +
      +
    • + + +
    • +
      +

      speed

      +
      +
      Type:
      +
      String, Number
      + +
      Optional
      + +
      +
      +
      +

      A string representing one of the predefined speeds ("slow" or "fast") or the number of milliseconds to run the animation (e.g. 1000).

      +
      +
    • + + +
    • +
      +

      callback

      +
      +
      Type:
      +
      Function
      + +
      Optional
      + +
      +
      +
      +

      A function that is called after the effect is completed.

      +
      +
    • + +
    +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/position.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/position.html new file mode 100644 index 00000000000..51a36e5b843 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/position.html @@ -0,0 +1,227 @@ + + +
    +

    jQuery UI Position Utility

    +
    +

    Overview

    +
    +

    Utility script for positioning any widget relative to the window, document, a particular element, or the cursor/mouse.

    +

    Note: jQuery UI does not support positioning hidden elements.

    +

    Does not need ui.core.js or effects.core.js.

    +
    +
    +

    Dependencies

    +
      +
    • none (only jQuery core)
    • +
    +
    +
    +

    Example

    +
    + +

    +Clicking on the green element transfers to the other.
    +

    +
    +$("#position1").position({
    +  my: "center",
    +  at: "center",
    +  of: "#targetElement"
    +});
    +$("#position2").position({
    +  my: "left top",
    +  at: "left top",
    +  of: "#targetElement"
    +});
    +$("#position3").position({
    +  my: "right center",
    +  at: "right bottom",
    +  of: "#targetElement"
    +});
    +$(document).mousemove(function(ev){
    +  $("#position4").position({
    +    my: "left bottom",
    +    of: ev,
    +    offset: "3 -3",
    +    collision: "fit"
    +  });
    +});
    +
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <style type="text/css">
    +#targetElement { width:240px;height:200px;background-color:#999;margin:30px auto; }
    +.positionDiv { width:50px;height:50px;opacity:0.6; }
    +#position1 {background-color:#F00;}
    +#position2 {background-color:#0F0;}
    +#position3 {background-color:#00F;}
    +#position4 {background-color:#FF0;}
    +</style>
    +
    +  <script>
    +  $(document).ready(function() {
    +    
    +$("#position1").position({
    +  my: "center",
    +  at: "center",
    +  of: "#targetElement"
    +});
    +$("#position2").position({
    +  my: "left top",
    +  at: "left top",
    +  of: "#targetElement"
    +});
    +$("#position3").position({
    +  my: "right center",
    +  at: "right bottom",
    +  of: "#targetElement"
    +});
    +$(document).mousemove(function(ev){
    +  $("#position4").position({
    +    my: "left bottom",
    +    of: ev,
    +    offset: "3 -3",
    +    collision: "fit"
    +  });
    +});
    +
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="targetElement">
    +  <div class="positionDiv" id="position1"></div>
    +  <div class="positionDiv" id="position2"></div>
    +  <div class="positionDiv" id="position3"></div>
    +  <div class="positionDiv" id="position4"></div>
    +</div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Arguments

    +
      + +
    • +
      +

      my

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      Defines which position on the element being positioned to align with the target element: "horizontal vertical" alignment. A single value such as "right" will default to "right center", "top" will default to "center top" (following CSS convention). Acceptable values: "top", "center", "bottom", "left", "right". Example: "left top" or "center center"

      +
      +
    • + + +
    • +
      +

      at

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      Defines which position on the target element to align the positioned element against: "horizontal vertical" alignment. A single value such as "right" will default to "right center", "top" will default to "center top" (following CSS convention). Acceptable values: "top", "center", "bottom", "left", "right". Example: "left top" or "center center"

      +
      +
    • + + +
    • +
      +

      of

      +
      +
      Type:
      +
      Selector, Element, jQuery, Event
      + +
      +
      +
      +

      Element to position against. If you provide a selector, the first matching element will be used. If you provide a jQuery object, the first element will be used. If you provide an event object, the pageX and pageY properties will be used. Example: "#top-menu"

      +
      +
    • + + +
    • +
      +

      offset

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      Add these left-top values to the calculated position, eg. "50 50" (left top) A single value such as "50" will apply to both.

      +
      +
    • + + +
    • +
      +

      collision

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      When the positioned element overflows the window in some direction, move it to an alternative position. Similar to my and at, this accepts a single value or a pair for horizontal/vertical, eg. "flip", "fit", "fit flip", "fit none". +

      +
      • flip: to the opposite side and the collision detection is run again to see if it will fit. If it won't fit in either position, the center option should be used as a fall back. +
      • fit: so the element keeps in the desired direction, but is re-positioned so it fits. +
      • none: not do collision detection. +
      +

      +
      +
    • + + +
    • +
      +

      using

      +
      +
      Type:
      +
      Function
      + +
      +
      +
      +

      When specified the actual property setting is delegated to this callback. Receives a single parameter which is a hash of top and left values for the position that should be set.

      +
      +
    • + +
    +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/progressbar.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/progressbar.html new file mode 100644 index 00000000000..f7e52990a58 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/progressbar.html @@ -0,0 +1,460 @@ + + +
    +

    jQuery UI Progressbar

    +
    +

    Overview

    +
    +

    +The progress bar is designed to simply display the current % complete for a process. The bar is coded to be flexibly sized through CSS and will scale to fit inside it's parent container by default. +

    +

    +This is a determinate progress bar, meaning that it should only be used in situations where the system can accurately update the current status complete. A determinate progress bar should never fill from left to right, then loop back to empty for a single process -- if the actual percent complete status cannot be calculated, an indeterminate progress bar (coming soon) or spinner animation is a better way to provide user feedback. +

    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Widget
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Progressbar.
    +

    +
    $("#progressbar").progressbar({ value: 37 });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  
    +  <script>
    +  $(document).ready(function() {
    +    $("#progressbar").progressbar({ value: 37 });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="progressbar"></div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the progressbar. Can be set when initialising (first creating) the progressbar.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a progressbar with the disabled option specified. +
      +
      +
      $( ".selector" ).progressbar({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).progressbar( "option", "disabled" );
      +//setter
      +$( ".selector" ).progressbar( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      value

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      The value of the progressbar.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a progressbar with the value option specified. +
      +
      +
      $( ".selector" ).progressbar({ value: 37 });
      +
      + + +
      + Get or set the value option, after init. +
      +
      +
      //getter
      +var value = $( ".selector" ).progressbar( "option", "value" );
      +//setter
      +$( ".selector" ).progressbar( "option", "value", 37 );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      progressbarcreate
      +
      +
      +
      +

      This event is triggered when progressbar is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).progressbar({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: progressbarcreate. +
      +
      +
      $( ".selector" ).bind( "progressbarcreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      change

      +
      +
      Type:
      +
      progressbarchange
      +
      +
      +
      +

      This event is triggered when the value of the progressbar changes.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the change event as an init option. +
      +
      +
      $( ".selector" ).progressbar({
      +   change: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the change event by type: progressbarchange. +
      +
      +
      $( ".selector" ).bind( "progressbarchange", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      complete

      +
      +
      Type:
      +
      progressbarcomplete
      +
      +
      +
      +

      This event is triggered when the value of the progressbar reaches the maximum value of 100.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the complete event as an init option. +
      +
      +
      $( ".selector" ).progressbar({
      +   complete: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the complete event by type: progressbarcomplete. +
      +
      +
      $( ".selector" ).bind( "progressbarcomplete", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .progressbar( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the progressbar functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .progressbar( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the progressbar.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .progressbar( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the progressbar.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .progressbar( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any progressbar option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .progressbar( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple progressbar options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .progressbar( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-progressbar element.

      +
      +
    • + + +
    • +
      +

      value

      +
      +
      Signature:
      +
      .progressbar( "value" + +, [value] + + + + + +)
      +
      +
      +
      +

      This method gets or sets the current value of the progressbar.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Progressbar plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.progressbar.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <div class="ui-progressbar ui-widget ui-widget-content ui-corner-all">
    +    <div style="width: 37%;" class="ui-progressbar-value ui-widget-header ui-corner-left"></div>
    + </div> +

    + + Note: This is a sample of markup generated by the progressbar plugin, not markup you should use to create a progressbar. The only markup needed for that is <div></div>. + +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/removeClass.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/removeClass.html new file mode 100644 index 00000000000..fbc530ee8f3 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/removeClass.html @@ -0,0 +1,113 @@ + + +
    +

    jQuery UI removeClass

    +
    +

    Overview

    +
    +

    removeClass( [class], [duration] )

    +

    Removes all or specified class from each of the set of matched elements with an optional transition between the states.

    +
    +
    +

    Dependencies

    +
      +
    • Effects Core
    • +
    +
    +
    +

    Example

    +
    + +

    +Removes the class 'selected' from the matched elements with a one second transition.
    +

    +
    $("p").click(function () {
    +      $(this).removeClass("selected", 1000);
    +    });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <script src="http://ui.jquery.com/latest/ui/effects.core.js"></script>
    +<style type="text/css">
    +  p { cursor: pointer; font-size: 1.2em; }
    +  .selected { color:red; }
    +</style>
    +  <script>
    +  $(document).ready(function() {
    +    $("p").click(function () {
    +      $(this).removeClass("selected", 1000);
    +    });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<p class="selected">Click me to remove 'selected' class.</p>
    +<p class="selected">Click me to remove 'selected' class.</p>
    +<p class="selected">Click me to remove 'selected' class.</p>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Arguments

    +
      + +
    • +
      +

      class

      +
      +
      Type:
      +
      String
      + +
      Optional
      + +
      +
      +
      +

      CSS classes to remove from the elements.

      +
      +
    • + + +
    • +
      +

      duration

      +
      +
      Type:
      +
      String, Number
      + +
      Optional
      + +
      +
      +
      +

      A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).

      +
      +
    • + +
    +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/resizable.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/resizable.html new file mode 100644 index 00000000000..032b6c41fc8 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/resizable.html @@ -0,0 +1,1201 @@ + + +
    +

    jQuery UI Resizable

    +
    +

    Overview

    +
    +

    The jQuery UI Resizable plugin makes selected elements resizable (meaning they have draggable resize handles). You can specify one or more handles as well as min and max width and height.

    +

    All callbacks (start,stop,resize) receive two arguments: The original browser event and a prepared ui object. The ui object has the following fields:

    +
      +
    • ui.helper - a jQuery object containing the helper element
    • +
    • ui.originalPosition - {top, left} before resizing started
    • +
    • ui.originalSize - {width, height} before resizing started
    • +
    • ui.position - {top, left} current position
    • +
    • ui.size - {width, height} current size
    • +
    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Widget
    • +
    • UI Mouse
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Resizable.
    +

    +
    $("#resizable").resizable();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <style type="text/css">
    +    #resizable { width: 100px; height: 100px; background: silver; }
    +  </style>
    +  <script>
    +  $(document).ready(function() {
    +    $("#resizable").resizable();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="resizable"></div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the resizable. Can be set when initialising (first creating) the resizable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the disabled option specified. +
      +
      +
      $( ".selector" ).resizable({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).resizable( "option", "disabled" );
      +//setter
      +$( ".selector" ).resizable( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      alsoResize

      +
      +
      Type:
      +
      Selector, jQuery, Element
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Resize these elements synchronous when resizing.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the alsoResize option specified. +
      +
      +
      $( ".selector" ).resizable({ alsoResize: '.other' });
      +
      + + +
      + Get or set the alsoResize option, after init. +
      +
      +
      //getter
      +var alsoResize = $( ".selector" ).resizable( "option", "alsoResize" );
      +//setter
      +$( ".selector" ).resizable( "option", "alsoResize", '.other' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      animate

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Animates to the final size after resizing.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the animate option specified. +
      +
      +
      $( ".selector" ).resizable({ animate: true });
      +
      + + +
      + Get or set the animate option, after init. +
      +
      +
      //getter
      +var animate = $( ".selector" ).resizable( "option", "animate" );
      +//setter
      +$( ".selector" ).resizable( "option", "animate", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      animateDuration

      +
      +
      Type:
      +
      Integer, String
      + +
      Default:
      +
      'slow'
      + +
      +
      +
      +

      Duration time for animating, in milliseconds. Other possible values: 'slow', 'normal', 'fast'.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the animateDuration option specified. +
      +
      +
      $( ".selector" ).resizable({ animateDuration: 500 });
      +
      + + +
      + Get or set the animateDuration option, after init. +
      +
      +
      //getter
      +var animateDuration = $( ".selector" ).resizable( "option", "animateDuration" );
      +//setter
      +$( ".selector" ).resizable( "option", "animateDuration", 500 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      animateEasing

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'swing'
      + +
      +
      +
      +

      Easing effect for animating.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the animateEasing option specified. +
      +
      +
      $( ".selector" ).resizable({ animateEasing: 'swing' });
      +
      + + +
      + Get or set the animateEasing option, after init. +
      +
      +
      //getter
      +var animateEasing = $( ".selector" ).resizable( "option", "animateEasing" );
      +//setter
      +$( ".selector" ).resizable( "option", "animateEasing", 'swing' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      aspectRatio

      +
      +
      Type:
      +
      Boolean, Float
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set to true, resizing is constrained by the original aspect ratio. Otherwise a custom aspect ratio can be specified, such as 9 / 16, or 0.5.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the aspectRatio option specified. +
      +
      +
      $( ".selector" ).resizable({ aspectRatio: .75 });
      +
      + + +
      + Get or set the aspectRatio option, after init. +
      +
      +
      //getter
      +var aspectRatio = $( ".selector" ).resizable( "option", "aspectRatio" );
      +//setter
      +$( ".selector" ).resizable( "option", "aspectRatio", .75 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      autoHide

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set to true, automatically hides the handles except when the mouse hovers over the element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the autoHide option specified. +
      +
      +
      $( ".selector" ).resizable({ autoHide: true });
      +
      + + +
      + Get or set the autoHide option, after init. +
      +
      +
      //getter
      +var autoHide = $( ".selector" ).resizable( "option", "autoHide" );
      +//setter
      +$( ".selector" ).resizable( "option", "autoHide", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      cancel

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      ':input,option'
      + +
      +
      +
      +

      Prevents resizing if you start on elements matching the selector.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the cancel option specified. +
      +
      +
      $( ".selector" ).resizable({ cancel: ':input,option' });
      +
      + + +
      + Get or set the cancel option, after init. +
      +
      +
      //getter
      +var cancel = $( ".selector" ).resizable( "option", "cancel" );
      +//setter
      +$( ".selector" ).resizable( "option", "cancel", ':input,option' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      containment

      +
      +
      Type:
      +
      String, Element, Selector
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Constrains resizing to within the bounds of the specified element. Possible values: 'parent', 'document', a DOMElement, or a Selector.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the containment option specified. +
      +
      +
      $( ".selector" ).resizable({ containment: 'parent' });
      +
      + + +
      + Get or set the containment option, after init. +
      +
      +
      //getter
      +var containment = $( ".selector" ).resizable( "option", "containment" );
      +//setter
      +$( ".selector" ).resizable( "option", "containment", 'parent' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      delay

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      Tolerance, in milliseconds, for when resizing should start. If specified, resizing will not start until after mouse is moved beyond duration. This can help prevent unintended resizing when clicking on an element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the delay option specified. +
      +
      +
      $( ".selector" ).resizable({ delay: 20 });
      +
      + + +
      + Get or set the delay option, after init. +
      +
      +
      //getter
      +var delay = $( ".selector" ).resizable( "option", "delay" );
      +//setter
      +$( ".selector" ).resizable( "option", "delay", 20 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      distance

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      1
      + +
      +
      +
      +

      Tolerance, in pixels, for when resizing should start. If specified, resizing will not start until after mouse is moved beyond distance. This can help prevent unintended resizing when clicking on an element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the distance option specified. +
      +
      +
      $( ".selector" ).resizable({ distance: 20 });
      +
      + + +
      + Get or set the distance option, after init. +
      +
      +
      //getter
      +var distance = $( ".selector" ).resizable( "option", "distance" );
      +//setter
      +$( ".selector" ).resizable( "option", "distance", 20 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      ghost

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set to true, a semi-transparent helper element is shown for resizing.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the ghost option specified. +
      +
      +
      $( ".selector" ).resizable({ ghost: true });
      +
      + + +
      + Get or set the ghost option, after init. +
      +
      +
      //getter
      +var ghost = $( ".selector" ).resizable( "option", "ghost" );
      +//setter
      +$( ".selector" ).resizable( "option", "ghost", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      grid

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Snaps the resizing element to a grid, every x and y pixels. Array values: [x, y]

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the grid option specified. +
      +
      +
      $( ".selector" ).resizable({ grid: [50, 50] });
      +
      + + +
      + Get or set the grid option, after init. +
      +
      +
      //getter
      +var grid = $( ".selector" ).resizable( "option", "grid" );
      +//setter
      +$( ".selector" ).resizable( "option", "grid", [50, 50] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      handles

      +
      +
      Type:
      +
      String, Object
      + +
      Default:
      +
      'e, s, se'
      + +
      +
      +
      +

      If specified as a string, should be a comma-split list of any of the following: 'n, e, s, w, ne, se, sw, nw, all'. The necessary handles will be auto-generated by the plugin. +

      If specified as an object, the following keys are supported: { n, e, s, w, ne, se, sw, nw }. The value of any specified should be a jQuery selector matching the child element of the resizable to use as that handle. If the handle is not a child of the resizable, you can pass in the DOMElement or a valid jQuery object directly.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the handles option specified. +
      +
      +
      $( ".selector" ).resizable({ handles: 'n, e, s, w' });
      +
      + + +
      + Get or set the handles option, after init. +
      +
      +
      //getter
      +var handles = $( ".selector" ).resizable( "option", "handles" );
      +//setter
      +$( ".selector" ).resizable( "option", "handles", 'n, e, s, w' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      helper

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      This is the css class that will be added to a proxy element to outline the resize during the drag of the resize handle. Once the resize is complete, the original element is sized.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the helper option specified. +
      +
      +
      $( ".selector" ).resizable({ helper: 'ui-state-highlight' });
      +
      + + +
      + Get or set the helper option, after init. +
      +
      +
      //getter
      +var helper = $( ".selector" ).resizable( "option", "helper" );
      +//setter
      +$( ".selector" ).resizable( "option", "helper", 'ui-state-highlight' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      maxHeight

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      This is the maximum height the resizable should be allowed to resize to.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the maxHeight option specified. +
      +
      +
      $( ".selector" ).resizable({ maxHeight: 300 });
      +
      + + +
      + Get or set the maxHeight option, after init. +
      +
      +
      //getter
      +var maxHeight = $( ".selector" ).resizable( "option", "maxHeight" );
      +//setter
      +$( ".selector" ).resizable( "option", "maxHeight", 300 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      maxWidth

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      This is the maximum width the resizable should be allowed to resize to.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the maxWidth option specified. +
      +
      +
      $( ".selector" ).resizable({ maxWidth: 250 });
      +
      + + +
      + Get or set the maxWidth option, after init. +
      +
      +
      //getter
      +var maxWidth = $( ".selector" ).resizable( "option", "maxWidth" );
      +//setter
      +$( ".selector" ).resizable( "option", "maxWidth", 250 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      minHeight

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      10
      + +
      +
      +
      +

      This is the minimum height the resizable should be allowed to resize to.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the minHeight option specified. +
      +
      +
      $( ".selector" ).resizable({ minHeight: 150 });
      +
      + + +
      + Get or set the minHeight option, after init. +
      +
      +
      //getter
      +var minHeight = $( ".selector" ).resizable( "option", "minHeight" );
      +//setter
      +$( ".selector" ).resizable( "option", "minHeight", 150 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      minWidth

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      10
      + +
      +
      +
      +

      This is the minimum width the resizable should be allowed to resize to.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a resizable with the minWidth option specified. +
      +
      +
      $( ".selector" ).resizable({ minWidth: 75 });
      +
      + + +
      + Get or set the minWidth option, after init. +
      +
      +
      //getter
      +var minWidth = $( ".selector" ).resizable( "option", "minWidth" );
      +//setter
      +$( ".selector" ).resizable( "option", "minWidth", 75 );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      resizecreate
      +
      +
      +
      +

      This event is triggered when resizable is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).resizable({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: resizecreate. +
      +
      +
      $( ".selector" ).bind( "resizecreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      start

      +
      +
      Type:
      +
      resizestart
      +
      +
      +
      +

      This event is triggered at the start of a resize operation.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the start event as an init option. +
      +
      +
      $( ".selector" ).resizable({
      +   start: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the start event by type: resizestart. +
      +
      +
      $( ".selector" ).bind( "resizestart", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      resize

      +
      +
      Type:
      +
      resize
      +
      +
      +
      +

      This event is triggered during the resize, on the drag of the resize handler.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the resize event as an init option. +
      +
      +
      $( ".selector" ).resizable({
      +   resize: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the resize event by type: resize. +
      +
      +
      $( ".selector" ).bind( "resize", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      stop

      +
      +
      Type:
      +
      resizestop
      +
      +
      +
      +

      This event is triggered at the end of a resize operation.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the stop event as an init option. +
      +
      +
      $( ".selector" ).resizable({
      +   stop: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the stop event by type: resizestop. +
      +
      +
      $( ".selector" ).bind( "resizestop", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .resizable( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the resizable functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .resizable( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the resizable.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .resizable( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the resizable.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .resizable( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any resizable option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .resizable( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple resizable options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .resizable( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-resizable element.

      +
      +
    • + + +
    +
    +
    +

    Theming

    +

    The jQuery UI Resizable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.resizable.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <div class="ui-resizable">
    +   <div style="-moz-user-select: none;" unselectable="on" class="ui-resizable-handle ui-resizable-e"></div>
    +   <div style="-moz-user-select: none;" unselectable="on" class="ui-resizable-handle ui-resizable-s"></div>
    +   <div unselectable="on" style="z-index: 1001; -moz-user-select: none;" class="ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se"></div>
    +</div> +

    + + Note: This is a sample of markup generated by the resizable plugin, not markup you should use to create a resizable. The only markup needed for that is <div></div>. + +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/selectable.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/selectable.html new file mode 100644 index 00000000000..44e3b179082 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/selectable.html @@ -0,0 +1,848 @@ + + +
    +

    jQuery UI Selectable

    +
    +

    Overview

    +
    +

    The jQuery UI Selectable plugin allows for elements to be selected by dragging a box (sometimes called a lasso) with the mouse over the elements. Also, elements can be selected by click or drag while holding the Ctrl/Meta key, allowing for multiple (non-contiguous) selections.

    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Widget
    • +
    • UI Mouse
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Selectable.
    +

    +
    $("#selectable").selectable();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <style type="text/css">
    +#selectable .ui-selecting {
    +	background: silver;
    +}
    +#selectable .ui-selected {
    +	background: gray;
    +}
    +</style>
    +
    +  <script>
    +  $(document).ready(function() {
    +    $("#selectable").selectable();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<ul id="selectable">
    +<li>Item 1</li>
    +<li>Item 2</li>
    +<li>Item 3</li>
    +<li>Item 4</li>
    +<li>Item 5</li>
    +</ul>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the selectable. Can be set when initialising (first creating) the selectable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a selectable with the disabled option specified. +
      +
      +
      $( ".selector" ).selectable({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).selectable( "option", "disabled" );
      +//setter
      +$( ".selector" ).selectable( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      autoRefresh

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      This determines whether to refresh (recalculate) the position and size of each selectee at the beginning of each select operation. If you have many many items, you may want to set this to false and call the refresh method manually.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a selectable with the autoRefresh option specified. +
      +
      +
      $( ".selector" ).selectable({ autoRefresh: false });
      +
      + + +
      + Get or set the autoRefresh option, after init. +
      +
      +
      //getter
      +var autoRefresh = $( ".selector" ).selectable( "option", "autoRefresh" );
      +//setter
      +$( ".selector" ).selectable( "option", "autoRefresh", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      cancel

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      ':input,option'
      + +
      +
      +
      +

      Prevents selecting if you start on elements matching the selector.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a selectable with the cancel option specified. +
      +
      +
      $( ".selector" ).selectable({ cancel: ':input,option' });
      +
      + + +
      + Get or set the cancel option, after init. +
      +
      +
      //getter
      +var cancel = $( ".selector" ).selectable( "option", "cancel" );
      +//setter
      +$( ".selector" ).selectable( "option", "cancel", ':input,option' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      delay

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      Time in milliseconds to define when the selecting should start. It helps preventing unwanted selections when clicking on an element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a selectable with the delay option specified. +
      +
      +
      $( ".selector" ).selectable({ delay: 20 });
      +
      + + +
      + Get or set the delay option, after init. +
      +
      +
      //getter
      +var delay = $( ".selector" ).selectable( "option", "delay" );
      +//setter
      +$( ".selector" ).selectable( "option", "delay", 20 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      distance

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      Tolerance, in pixels, for when selecting should start. If specified, selecting will not start until after mouse is dragged beyond distance.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a selectable with the distance option specified. +
      +
      +
      $( ".selector" ).selectable({ distance: 20 });
      +
      + + +
      + Get or set the distance option, after init. +
      +
      +
      //getter
      +var distance = $( ".selector" ).selectable( "option", "distance" );
      +//setter
      +$( ".selector" ).selectable( "option", "distance", 20 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      filter

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      '*'
      + +
      +
      +
      +

      The matching child elements will be made selectees (able to be selected).

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a selectable with the filter option specified. +
      +
      +
      $( ".selector" ).selectable({ filter: 'li' });
      +
      + + +
      + Get or set the filter option, after init. +
      +
      +
      //getter
      +var filter = $( ".selector" ).selectable( "option", "filter" );
      +//setter
      +$( ".selector" ).selectable( "option", "filter", 'li' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      tolerance

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'touch'
      + +
      +
      +
      +

      Possible values: 'touch', 'fit'. +

      +
        +
      • fit: draggable overlaps the droppable entirely
      • +
      • touch: draggable overlaps the droppable any amount
      • +
      +

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a selectable with the tolerance option specified. +
      +
      +
      $( ".selector" ).selectable({ tolerance: 'fit' });
      +
      + + +
      + Get or set the tolerance option, after init. +
      +
      +
      //getter
      +var tolerance = $( ".selector" ).selectable( "option", "tolerance" );
      +//setter
      +$( ".selector" ).selectable( "option", "tolerance", 'fit' );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      selectablecreate
      +
      +
      +
      +

      This event is triggered when selectable is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).selectable({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: selectablecreate. +
      +
      +
      $( ".selector" ).bind( "selectablecreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      selected

      +
      +
      Type:
      +
      selectableselected
      +
      +
      +
      +

      This event is triggered at the end of the select operation, on each element added to the selection.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the selected event as an init option. +
      +
      +
      $( ".selector" ).selectable({
      +   selected: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the selected event by type: selectableselected. +
      +
      +
      $( ".selector" ).bind( "selectableselected", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      selecting

      +
      +
      Type:
      +
      selectableselecting
      +
      +
      +
      +

      This event is triggered during the select operation, on each element added to the selection.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the selecting event as an init option. +
      +
      +
      $( ".selector" ).selectable({
      +   selecting: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the selecting event by type: selectableselecting. +
      +
      +
      $( ".selector" ).bind( "selectableselecting", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      start

      +
      +
      Type:
      +
      selectablestart
      +
      +
      +
      +

      This event is triggered at the beginning of the select operation.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the start event as an init option. +
      +
      +
      $( ".selector" ).selectable({
      +   start: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the start event by type: selectablestart. +
      +
      +
      $( ".selector" ).bind( "selectablestart", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      stop

      +
      +
      Type:
      +
      selectablestop
      +
      +
      +
      +

      This event is triggered at the end of the select operation.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the stop event as an init option. +
      +
      +
      $( ".selector" ).selectable({
      +   stop: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the stop event by type: selectablestop. +
      +
      +
      $( ".selector" ).bind( "selectablestop", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      unselected

      +
      +
      Type:
      +
      selectableunselected
      +
      +
      +
      +

      This event is triggered at the end of the select operation, on each element removed from the selection.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the unselected event as an init option. +
      +
      +
      $( ".selector" ).selectable({
      +   unselected: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the unselected event by type: selectableunselected. +
      +
      +
      $( ".selector" ).bind( "selectableunselected", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      unselecting

      +
      +
      Type:
      +
      selectableunselecting
      +
      +
      +
      +

      This event is triggered during the select operation, on each element removed from the selection.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the unselecting event as an init option. +
      +
      +
      $( ".selector" ).selectable({
      +   unselecting: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the unselecting event by type: selectableunselecting. +
      +
      +
      $( ".selector" ).bind( "selectableunselecting", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .selectable( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the selectable functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .selectable( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the selectable.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .selectable( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the selectable.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .selectable( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any selectable option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .selectable( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple selectable options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .selectable( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-selectable element.

      +
      +
    • + + +
    • +
      +

      refresh

      +
      +
      Signature:
      +
      .selectable( "refresh" + + + + + + + +)
      +
      +
      +
      +

      Refresh the position and size of each selectee element. This method can be used to manually recalculate the position and size of each selectee element. Very useful if autoRefresh is set to false.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Selectable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.selectable.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <ul class="ui-selectable">
    +   <li class="ui-selectee"></li>
    +   <li class="ui-selectee"></li>
    +   <li class="ui-selectee"></li>
    +</ul> +

    + + Note: This is a sample of markup generated by the selectable plugin, not markup you should use to create a selectable. The only markup needed for that is
    <ul>
    +   <li></li>
    +   <li></li>
    +   <li></li>
    +</ul>. +
    +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/show.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/show.html new file mode 100644 index 00000000000..e77dade434d --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/show.html @@ -0,0 +1,144 @@ + + +
    +

    jQuery UI show

    +
    +

    Overview

    +
    +

    show( effect, [options], [speed], [callback] )

    +

    The enhanced show method optionally accepts jQuery UI advanced effects.

    +

    Uses a specific effect on an element to show the element if the first argument is a effect string.

    +
    +
    +

    Dependencies

    +
      +
    • Effects Core
    • +
    +
    +
    +

    Example

    +
    + +

    +Apply the effect slide if you click on the p to show a div.
    +

    +
    $("p").click(function () {
    +      $("div").show("slide", {}, 1000);
    +    });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <script src="http://ui.jquery.com/latest/ui/effects.core.js"></script>
    +<script src="http://ui.jquery.com/latest/ui/effects.slide.js"></script>
    +<style type="text/css">
    +  div { display: none; margin: 0px; width: 100px; height: 80px; background: blue; position: relative; }
    +</style>
    +  <script>
    +  $(document).ready(function() {
    +    $("p").click(function () {
    +      $("div").show("slide", {}, 1000);
    +    });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<p>Click me</p><div></div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Arguments

    +
      + +
    • +
      +

      effect

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      The effect to be used. Possible values: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'.

      +
      +
    • + + +
    • +
      +

      options

      +
      +
      Type:
      +
      Hash
      + +
      Optional
      + +
      +
      +
      +

      A object/hash including specific options for the effect.

      +
      +
    • + + +
    • +
      +

      speed

      +
      +
      Type:
      +
      String, Number
      + +
      Optional
      + +
      +
      +
      +

      A string representing one of the predefined speeds ("slow" or "fast") or the number of milliseconds to run the animation (e.g. 1000).

      +
      +
    • + + +
    • +
      +

      callback

      +
      +
      Type:
      +
      Function
      + +
      Optional
      + +
      +
      +
      +

      A function that is called after the effect is completed.

      +
      +
    • + +
    +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/slider.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/slider.html new file mode 100644 index 00000000000..fdc9138a512 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/slider.html @@ -0,0 +1,860 @@ + + +
    +

    jQuery UI Slider

    +
    +

    Overview

    +
    +

    The jQuery UI Slider plugin makes selected elements into sliders. There are various options such as multiple handles, and ranges. The handle can be moved with the mouse or the arrow keys.

    +

    All callbacks receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'): +

    The slider widget will create handle elements with the class 'ui-slider-handle' on initialization. You can specify custom handle elements by creating and appending the elements and adding the 'ui-slider-handle' class before init. It will only create the number of handles needed to match the length of value/values. For example, if you specify 'values: [1, 5, 18]' and create one custom handle, the plugin will create the other two. +

    +
      +
    • ui.handle: DOMElement - the current focused handle +
    • ui.value: Integer - the current handle's value +
    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Widget
    • +
    • UI Mouse
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Slider.
    +

    +
    $("#slider").slider();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +    <style type="text/css">
    +    #slider { margin: 10px; }
    +  </style>
    +  <script>
    +  $(document).ready(function() {
    +    $("#slider").slider();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="slider"></div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the slider. Can be set when initialising (first creating) the slider.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a slider with the disabled option specified. +
      +
      +
      $( ".selector" ).slider({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).slider( "option", "disabled" );
      +//setter
      +$( ".selector" ).slider( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      animate

      +
      +
      Type:
      +
      Boolean, String, Number
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Whether to slide handle smoothly when user click outside handle on the bar. Will also accept a string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a slider with the animate option specified. +
      +
      +
      $( ".selector" ).slider({ animate: true });
      +
      + + +
      + Get or set the animate option, after init. +
      +
      +
      //getter
      +var animate = $( ".selector" ).slider( "option", "animate" );
      +//setter
      +$( ".selector" ).slider( "option", "animate", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      max

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      100
      + +
      +
      +
      +

      The maximum value of the slider.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a slider with the max option specified. +
      +
      +
      $( ".selector" ).slider({ max: 7 });
      +
      + + +
      + Get or set the max option, after init. +
      +
      +
      //getter
      +var max = $( ".selector" ).slider( "option", "max" );
      +//setter
      +$( ".selector" ).slider( "option", "max", 7 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      min

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      The minimum value of the slider.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a slider with the min option specified. +
      +
      +
      $( ".selector" ).slider({ min: -7 });
      +
      + + +
      + Get or set the min option, after init. +
      +
      +
      //getter
      +var min = $( ".selector" ).slider( "option", "min" );
      +//setter
      +$( ".selector" ).slider( "option", "min", -7 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      orientation

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'horizontal'
      + +
      +
      +
      +

      This option determines whether the slider has the min at the left, the max at the right or the min at the bottom, the max at the top. Possible values: 'horizontal', 'vertical'.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a slider with the orientation option specified. +
      +
      +
      $( ".selector" ).slider({ orientation: 'vertical' });
      +
      + + +
      + Get or set the orientation option, after init. +
      +
      +
      //getter
      +var orientation = $( ".selector" ).slider( "option", "orientation" );
      +//setter
      +$( ".selector" ).slider( "option", "orientation", 'vertical' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      range

      +
      +
      Type:
      +
      Boolean, String
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set to true, the slider will detect if you have two handles and create a stylable range element between these two. Two other possible values are 'min' and 'max'. A min range goes from the slider min to one handle. A max range goes from one handle to the slider max.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a slider with the range option specified. +
      +
      +
      $( ".selector" ).slider({ range: 'min' });
      +
      + + +
      + Get or set the range option, after init. +
      +
      +
      //getter
      +var range = $( ".selector" ).slider( "option", "range" );
      +//setter
      +$( ".selector" ).slider( "option", "range", 'min' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      step

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      1
      + +
      +
      +
      +

      Determines the size or amount of each interval or step the slider takes between min and max. The full specified value range of the slider (max - min) needs to be evenly divisible by the step.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a slider with the step option specified. +
      +
      +
      $( ".selector" ).slider({ step: 5 });
      +
      + + +
      + Get or set the step option, after init. +
      +
      +
      //getter
      +var step = $( ".selector" ).slider( "option", "step" );
      +//setter
      +$( ".selector" ).slider( "option", "step", 5 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      value

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      Determines the value of the slider, if there's only one handle. If there is more than one handle, determines the value of the first handle.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a slider with the value option specified. +
      +
      +
      $( ".selector" ).slider({ value: 37 });
      +
      + + +
      + Get or set the value option, after init. +
      +
      +
      //getter
      +var value = $( ".selector" ).slider( "option", "value" );
      +//setter
      +$( ".selector" ).slider( "option", "value", 37 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      values

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      This option can be used to specify multiple handles. If range is set to true, the length of 'values' should be 2.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a slider with the values option specified. +
      +
      +
      $( ".selector" ).slider({ values: [1,5,9] });
      +
      + + +
      + Get or set the values option, after init. +
      +
      +
      //getter
      +var values = $( ".selector" ).slider( "option", "values" );
      +//setter
      +$( ".selector" ).slider( "option", "values", [1,5,9] );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      slidecreate
      +
      +
      +
      +

      This event is triggered when slider is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).slider({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: slidecreate. +
      +
      +
      $( ".selector" ).bind( "slidecreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      start

      +
      +
      Type:
      +
      slidestart
      +
      +
      +
      +

      This event is triggered when the user starts sliding.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the start event as an init option. +
      +
      +
      $( ".selector" ).slider({
      +   start: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the start event by type: slidestart. +
      +
      +
      $( ".selector" ).bind( "slidestart", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      slide

      +
      +
      Type:
      +
      slide
      +
      +
      +
      +

      This event is triggered on every mouse move during slide. Use ui.value (single-handled sliders) to obtain the value of the current handle, $(..).slider('value', index) to get another handles' value. +

      Return false in order to prevent a slide, based on ui.value.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the slide event as an init option. +
      +
      +
      $( ".selector" ).slider({
      +   slide: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the slide event by type: slide. +
      +
      +
      $( ".selector" ).bind( "slide", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      change

      +
      +
      Type:
      +
      slidechange
      +
      +
      +
      +

      This event is triggered on slide stop, or if the value is changed programmatically (by the value method). Takes arguments event and ui. Use event.orginalEvent to detect whether the value changed by mouse, keyboard, or programmatically. Use ui.value (single-handled sliders) to obtain the value of the current handle, $(this).slider('values', index) to get another handle's value.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the change event as an init option. +
      +
      +
      $( ".selector" ).slider({
      +   change: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the change event by type: slidechange. +
      +
      +
      $( ".selector" ).bind( "slidechange", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      stop

      +
      +
      Type:
      +
      slidestop
      +
      +
      +
      +

      This event is triggered when the user stops sliding.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the stop event as an init option. +
      +
      +
      $( ".selector" ).slider({
      +   stop: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the stop event by type: slidestop. +
      +
      +
      $( ".selector" ).bind( "slidestop", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .slider( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the slider functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .slider( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the slider.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .slider( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the slider.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .slider( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any slider option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .slider( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple slider options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .slider( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-slider element.

      +
      +
    • + + +
    • +
      +

      value

      +
      +
      Signature:
      +
      .slider( "value" + +, [value] + + + + + +)
      +
      +
      +
      +

      Gets or sets the value of the slider. For single handle sliders.

      +
      +
    • + + +
    • +
      +

      values

      +
      +
      Signature:
      +
      .slider( "values" + +, index + +, [value] + + + +)
      +
      +
      +
      +

      Gets or sets the values of the slider. For multiple handle or range sliders.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Slider plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.slider.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <div class="ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all">
    +   <a style="left: 0%;" class="ui-slider-handle ui-state-default ui-corner-all" href="#"></a>
    +</div>
    +

    + + Note: This is a sample of markup generated by the slider plugin, not markup you should use to create a slider. The only markup needed for that is <div><div>. + +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/sortable.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/sortable.html new file mode 100644 index 00000000000..15d63ff5e45 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/sortable.html @@ -0,0 +1,1952 @@ + + +
    +

    jQuery UI Sortable

    +
    +

    Overview

    +
    +

    The jQuery UI Sortable plugin makes selected elements sortable by dragging with the mouse.

    +

    All callbacks receive two arguments: The original browser event and a prepared ui object, view below for a documentation of this object (if you name your second argument 'ui'):

    +
      +
    • ui.helper - the current helper element (most often a clone of the item)
    • +
    • ui.position - current position of the helper
    • +
    • ui.offset - current absolute position of the helper
    • +
    • ui.item - the current dragged element
    • +
    • ui.placeholder - the placeholder (if you defined one)
    • +
    • ui.sender - the sortable where the item comes from (only exists if you move from one connected list to another)
    • +
    +
    +
    +

    Dependencies

    +
      +
    • UI Core
    • +
    • UI Widget
    • +
    • UI Mouse
    • +
    +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Sortable.
    +

    +
    $("#sortable").sortable();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  
    +  <script>
    +  $(document).ready(function() {
    +    $("#sortable").sortable();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<ul id="sortable">
    +<li>Item 1</li>
    +<li>Item 2</li>
    +<li>Item 3</li>
    +<li>Item 4</li>
    +<li>Item 5</li>
    +</ul>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the sortable. Can be set when initialising (first creating) the sortable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the disabled option specified. +
      +
      +
      $( ".selector" ).sortable({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).sortable( "option", "disabled" );
      +//setter
      +$( ".selector" ).sortable( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      appendTo

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'parent'
      + +
      +
      +
      +

      Defines where the helper that moves with the mouse is being appended to during the drag (for example, to resolve overlap/zIndex issues).

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the appendTo option specified. +
      +
      +
      $( ".selector" ).sortable({ appendTo: 'body' });
      +
      + + +
      + Get or set the appendTo option, after init. +
      +
      +
      //getter
      +var appendTo = $( ".selector" ).sortable( "option", "appendTo" );
      +//setter
      +$( ".selector" ).sortable( "option", "appendTo", 'body' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      axis

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If defined, the items can be dragged only horizontally or vertically. Possible values:'x', 'y'.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the axis option specified. +
      +
      +
      $( ".selector" ).sortable({ axis: 'x' });
      +
      + + +
      + Get or set the axis option, after init. +
      +
      +
      //getter
      +var axis = $( ".selector" ).sortable( "option", "axis" );
      +//setter
      +$( ".selector" ).sortable( "option", "axis", 'x' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      cancel

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      ':input,button'
      + +
      +
      +
      +

      Prevents sorting if you start on elements matching the selector.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the cancel option specified. +
      +
      +
      $( ".selector" ).sortable({ cancel: 'button' });
      +
      + + +
      + Get or set the cancel option, after init. +
      +
      +
      //getter
      +var cancel = $( ".selector" ).sortable( "option", "cancel" );
      +//setter
      +$( ".selector" ).sortable( "option", "cancel", 'button' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      connectWith

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Takes a jQuery selector with items that also have sortables applied. If used, the sortable is now connected to the other one-way, so you can drag from this sortable to the other.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the connectWith option specified. +
      +
      +
      $( ".selector" ).sortable({ connectWith: '.otherlist' });
      +
      + + +
      + Get or set the connectWith option, after init. +
      +
      +
      //getter
      +var connectWith = $( ".selector" ).sortable( "option", "connectWith" );
      +//setter
      +$( ".selector" ).sortable( "option", "connectWith", '.otherlist' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      containment

      +
      +
      Type:
      +
      Element, String, Selector
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Constrains dragging to within the bounds of the specified element - can be a DOM element, 'parent', 'document', 'window', or a jQuery selector.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the containment option specified. +
      +
      +
      $( ".selector" ).sortable({ containment: 'parent' });
      +
      + + +
      + Get or set the containment option, after init. +
      +
      +
      //getter
      +var containment = $( ".selector" ).sortable( "option", "containment" );
      +//setter
      +$( ".selector" ).sortable( "option", "containment", 'parent' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      cursor

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'auto'
      + +
      +
      +
      +

      Defines the cursor that is being shown while sorting.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the cursor option specified. +
      +
      +
      $( ".selector" ).sortable({ cursor: 'crosshair' });
      +
      + + +
      + Get or set the cursor option, after init. +
      +
      +
      //getter
      +var cursor = $( ".selector" ).sortable( "option", "cursor" );
      +//setter
      +$( ".selector" ).sortable( "option", "cursor", 'crosshair' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      cursorAt

      +
      +
      Type:
      +
      Object
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Moves the sorting element or helper so the cursor always appears to drag from the same position. Coordinates can be given as a hash using a combination of one or two keys: { top, left, right, bottom }.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the cursorAt option specified. +
      +
      +
      $( ".selector" ).sortable({ cursorAt: 'top' });
      +
      + + +
      + Get or set the cursorAt option, after init. +
      +
      +
      //getter
      +var cursorAt = $( ".selector" ).sortable( "option", "cursorAt" );
      +//setter
      +$( ".selector" ).sortable( "option", "cursorAt", 'top' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      delay

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      Time in milliseconds to define when the sorting should start. It helps preventing unwanted drags when clicking on an element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the delay option specified. +
      +
      +
      $( ".selector" ).sortable({ delay: 500 });
      +
      + + +
      + Get or set the delay option, after init. +
      +
      +
      //getter
      +var delay = $( ".selector" ).sortable( "option", "delay" );
      +//setter
      +$( ".selector" ).sortable( "option", "delay", 500 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      distance

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      1
      + +
      +
      +
      +

      Tolerance, in pixels, for when sorting should start. If specified, sorting will not start until after mouse is dragged beyond distance. Can be used to allow for clicks on elements within a handle.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the distance option specified. +
      +
      +
      $( ".selector" ).sortable({ distance: 30 });
      +
      + + +
      + Get or set the distance option, after init. +
      +
      +
      //getter
      +var distance = $( ".selector" ).sortable( "option", "distance" );
      +//setter
      +$( ".selector" ).sortable( "option", "distance", 30 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      dropOnEmpty

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      If false items from this sortable can't be dropped to an empty linked sortable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the dropOnEmpty option specified. +
      +
      +
      $( ".selector" ).sortable({ dropOnEmpty: false });
      +
      + + +
      + Get or set the dropOnEmpty option, after init. +
      +
      +
      //getter
      +var dropOnEmpty = $( ".selector" ).sortable( "option", "dropOnEmpty" );
      +//setter
      +$( ".selector" ).sortable( "option", "dropOnEmpty", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      forceHelperSize

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If true, forces the helper to have a size.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the forceHelperSize option specified. +
      +
      +
      $( ".selector" ).sortable({ forceHelperSize: true });
      +
      + + +
      + Get or set the forceHelperSize option, after init. +
      +
      +
      //getter
      +var forceHelperSize = $( ".selector" ).sortable( "option", "forceHelperSize" );
      +//setter
      +$( ".selector" ).sortable( "option", "forceHelperSize", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      forcePlaceholderSize

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If true, forces the placeholder to have a size.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the forcePlaceholderSize option specified. +
      +
      +
      $( ".selector" ).sortable({ forcePlaceholderSize: true });
      +
      + + +
      + Get or set the forcePlaceholderSize option, after init. +
      +
      +
      //getter
      +var forcePlaceholderSize = $( ".selector" ).sortable( "option", "forcePlaceholderSize" );
      +//setter
      +$( ".selector" ).sortable( "option", "forcePlaceholderSize", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      grid

      +
      +
      Type:
      +
      Array
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Snaps the sorting element or helper to a grid, every x and y pixels. Array values: [x, y]

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the grid option specified. +
      +
      +
      $( ".selector" ).sortable({ grid: [50, 20] });
      +
      + + +
      + Get or set the grid option, after init. +
      +
      +
      //getter
      +var grid = $( ".selector" ).sortable( "option", "grid" );
      +//setter
      +$( ".selector" ).sortable( "option", "grid", [50, 20] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      handle

      +
      +
      Type:
      +
      Selector, Element
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Restricts sort start click to the specified element.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the handle option specified. +
      +
      +
      $( ".selector" ).sortable({ handle: 'h2' });
      +
      + + +
      + Get or set the handle option, after init. +
      +
      +
      //getter
      +var handle = $( ".selector" ).sortable( "option", "handle" );
      +//setter
      +$( ".selector" ).sortable( "option", "handle", 'h2' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      helper

      +
      +
      Type:
      +
      String, Function
      + +
      Default:
      +
      'original'
      + +
      +
      +
      +

      Allows for a helper element to be used for dragging display. The supplied function receives the event and the element being sorted, and should return a DOMElement to be used as a custom proxy helper. Possible values: 'original', 'clone'

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the helper option specified. +
      +
      +
      $( ".selector" ).sortable({ helper: 'clone' });
      +
      + + +
      + Get or set the helper option, after init. +
      +
      +
      //getter
      +var helper = $( ".selector" ).sortable( "option", "helper" );
      +//setter
      +$( ".selector" ).sortable( "option", "helper", 'clone' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      items

      +
      +
      Type:
      +
      Selector
      + +
      Default:
      +
      '> *'
      + +
      +
      +
      +

      Specifies which items inside the element should be sortable.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the items option specified. +
      +
      +
      $( ".selector" ).sortable({ items: 'li' });
      +
      + + +
      + Get or set the items option, after init. +
      +
      +
      //getter
      +var items = $( ".selector" ).sortable( "option", "items" );
      +//setter
      +$( ".selector" ).sortable( "option", "items", 'li' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      opacity

      +
      +
      Type:
      +
      Float
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Defines the opacity of the helper while sorting. From 0.01 to 1

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the opacity option specified. +
      +
      +
      $( ".selector" ).sortable({ opacity: 0.6 });
      +
      + + +
      + Get or set the opacity option, after init. +
      +
      +
      //getter
      +var opacity = $( ".selector" ).sortable( "option", "opacity" );
      +//setter
      +$( ".selector" ).sortable( "option", "opacity", 0.6 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      placeholder

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Class that gets applied to the otherwise white space.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the placeholder option specified. +
      +
      +
      $( ".selector" ).sortable({ placeholder: 'ui-state-highlight' });
      +
      + + +
      + Get or set the placeholder option, after init. +
      +
      +
      //getter
      +var placeholder = $( ".selector" ).sortable( "option", "placeholder" );
      +//setter
      +$( ".selector" ).sortable( "option", "placeholder", 'ui-state-highlight' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      revert

      +
      +
      Type:
      +
      Boolean/Integer
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      If set to true, the item will be reverted to its new DOM position with a smooth animation. Optionally, it can also be set to a number that controls the duration of the animation in ms.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the revert option specified. +
      +
      +
      $( ".selector" ).sortable({ revert: true });
      +
      + + +
      + Get or set the revert option, after init. +
      +
      +
      //getter
      +var revert = $( ".selector" ).sortable( "option", "revert" );
      +//setter
      +$( ".selector" ).sortable( "option", "revert", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      scroll

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      true
      + +
      +
      +
      +

      If set to true, the page scrolls when coming to an edge.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the scroll option specified. +
      +
      +
      $( ".selector" ).sortable({ scroll: false });
      +
      + + +
      + Get or set the scroll option, after init. +
      +
      +
      //getter
      +var scroll = $( ".selector" ).sortable( "option", "scroll" );
      +//setter
      +$( ".selector" ).sortable( "option", "scroll", false );
      +
      + +
      +
      +
    • + + +
    • +
      +

      scrollSensitivity

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      20
      + +
      +
      +
      +

      Defines how near the mouse must be to an edge to start scrolling.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the scrollSensitivity option specified. +
      +
      +
      $( ".selector" ).sortable({ scrollSensitivity: 40 });
      +
      + + +
      + Get or set the scrollSensitivity option, after init. +
      +
      +
      //getter
      +var scrollSensitivity = $( ".selector" ).sortable( "option", "scrollSensitivity" );
      +//setter
      +$( ".selector" ).sortable( "option", "scrollSensitivity", 40 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      scrollSpeed

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      20
      + +
      +
      +
      +

      The speed at which the window should scroll once the mouse pointer gets within the scrollSensitivity distance.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the scrollSpeed option specified. +
      +
      +
      $( ".selector" ).sortable({ scrollSpeed: 40 });
      +
      + + +
      + Get or set the scrollSpeed option, after init. +
      +
      +
      //getter
      +var scrollSpeed = $( ".selector" ).sortable( "option", "scrollSpeed" );
      +//setter
      +$( ".selector" ).sortable( "option", "scrollSpeed", 40 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      tolerance

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'intersect'
      + +
      +
      +
      +

      This is the way the reordering behaves during drag. Possible values: 'intersect', 'pointer'. In some setups, 'pointer' is more natural. +

      +
        +
      • intersect: draggable overlaps the droppable at least 50%
      • +
      • pointer: mouse pointer overlaps the droppable
      • +
      +

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the tolerance option specified. +
      +
      +
      $( ".selector" ).sortable({ tolerance: 'pointer' });
      +
      + + +
      + Get or set the tolerance option, after init. +
      +
      +
      //getter
      +var tolerance = $( ".selector" ).sortable( "option", "tolerance" );
      +//setter
      +$( ".selector" ).sortable( "option", "tolerance", 'pointer' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      zIndex

      +
      +
      Type:
      +
      Integer
      + +
      Default:
      +
      1000
      + +
      +
      +
      +

      Z-index for element/helper while being sorted.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a sortable with the zIndex option specified. +
      +
      +
      $( ".selector" ).sortable({ zIndex: 5 });
      +
      + + +
      + Get or set the zIndex option, after init. +
      +
      +
      //getter
      +var zIndex = $( ".selector" ).sortable( "option", "zIndex" );
      +//setter
      +$( ".selector" ).sortable( "option", "zIndex", 5 );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      sortcreate
      +
      +
      +
      +

      This event is triggered when sortable is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: sortcreate. +
      +
      +
      $( ".selector" ).bind( "sortcreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      start

      +
      +
      Type:
      +
      sortstart
      +
      +
      +
      +

      This event is triggered when sorting starts.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the start event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   start: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the start event by type: sortstart. +
      +
      +
      $( ".selector" ).bind( "sortstart", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      sort

      +
      +
      Type:
      +
      sort
      +
      +
      +
      +

      This event is triggered during sorting.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the sort event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   sort: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the sort event by type: sort. +
      +
      +
      $( ".selector" ).bind( "sort", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      change

      +
      +
      Type:
      +
      sortchange
      +
      +
      +
      +

      This event is triggered during sorting, but only when the DOM position has changed.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the change event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   change: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the change event by type: sortchange. +
      +
      +
      $( ".selector" ).bind( "sortchange", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      beforeStop

      +
      +
      Type:
      +
      sortbeforestop
      +
      +
      +
      +

      This event is triggered when sorting stops, but when the placeholder/helper is still available.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the beforeStop event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   beforeStop: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the beforeStop event by type: sortbeforestop. +
      +
      +
      $( ".selector" ).bind( "sortbeforestop", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      stop

      +
      +
      Type:
      +
      sortstop
      +
      +
      +
      +

      This event is triggered when sorting has stopped.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the stop event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   stop: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the stop event by type: sortstop. +
      +
      +
      $( ".selector" ).bind( "sortstop", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      update

      +
      +
      Type:
      +
      sortupdate
      +
      +
      +
      +

      This event is triggered when the user stopped sorting and the DOM position has changed.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the update event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   update: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the update event by type: sortupdate. +
      +
      +
      $( ".selector" ).bind( "sortupdate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      receive

      +
      +
      Type:
      +
      sortreceive
      +
      +
      +
      +

      This event is triggered when a connected sortable list has received an item from another list.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the receive event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   receive: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the receive event by type: sortreceive. +
      +
      +
      $( ".selector" ).bind( "sortreceive", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      remove

      +
      +
      Type:
      +
      sortremove
      +
      +
      +
      +

      This event is triggered when a sortable item has been dragged out from the list and into another.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the remove event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   remove: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the remove event by type: sortremove. +
      +
      +
      $( ".selector" ).bind( "sortremove", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      over

      +
      +
      Type:
      +
      sortover
      +
      +
      +
      +

      This event is triggered when a sortable item is moved into a connected list.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the over event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   over: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the over event by type: sortover. +
      +
      +
      $( ".selector" ).bind( "sortover", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      out

      +
      +
      Type:
      +
      sortout
      +
      +
      +
      +

      This event is triggered when a sortable item is moved away from a connected list.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the out event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   out: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the out event by type: sortout. +
      +
      +
      $( ".selector" ).bind( "sortout", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      activate

      +
      +
      Type:
      +
      sortactivate
      +
      +
      +
      +

      This event is triggered when using connected lists, every connected list on drag start receives it.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the activate event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   activate: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the activate event by type: sortactivate. +
      +
      +
      $( ".selector" ).bind( "sortactivate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      deactivate

      +
      +
      Type:
      +
      sortdeactivate
      +
      +
      +
      +

      This event is triggered when sorting was stopped, is propagated to all possible connected lists.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the deactivate event as an init option. +
      +
      +
      $( ".selector" ).sortable({
      +   deactivate: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the deactivate event by type: sortdeactivate. +
      +
      +
      $( ".selector" ).bind( "sortdeactivate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .sortable( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the sortable functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .sortable( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the sortable.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .sortable( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the sortable.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .sortable( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any sortable option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .sortable( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple sortable options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .sortable( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-sortable element.

      +
      +
    • + + +
    • +
      +

      serialize

      +
      +
      Signature:
      +
      .sortable( "serialize" + +, [options] + + + + + +)
      +
      +
      +
      +

      Serializes the sortable's item id's into a form/ajax submittable string. Calling this method produces a hash that can be appended to any url to easily submit a new item order back to the server. +

      It works by default by looking at the id of each item in the format 'setname_number', and it spits out a hash like "setname[]=number&setname[]=number". +

      You can also give in a option hash as second argument to custom define how the function works. The possible options are: 'key' (replaces part1[] with whatever you want), 'attribute' (test another attribute than 'id') and 'expression' (use your own regexp). +

      If serialize returns an empty string, make sure the id attributes include an underscore. They must be in the form: "set_number" For example, a 3 element list with id attributes foo_1, foo_5, foo_2 will serialize to foo[]=1&foo[]=5&foo[]=2. You can use an underscore, equal sign or hyphen to separate the set and number. For example foo=1 or foo-1 or foo_1 all serialize to foo[]=1.

      +
      +
    • + + +
    • +
      +

      toArray

      +
      +
      Signature:
      +
      .sortable( "toArray" + + + + + + + +)
      +
      +
      +
      +

      Serializes the sortable's item id's into an array of string. If you have +

      +
      +<ul id="a_sortable"><br>
      +<li id="hello">Hello</li><br>
      +<li id="goodbye">Good bye</li><br>
      +</ul>
      +
      +

      and do +

      +
      var result = $('#a_sortable').sortable('toArray');
      +

      then +

      +
      result[0] will contain "hello" and result[1] will contain "goodbye".

      +
      +
    • + +

      +

    • +
      +

      refresh

      +
      +
      Signature:
      +
      .sortable( "refresh" + + + + + + + +)
      +
      +
      +
      +

      Refresh the sortable items. Custom trigger the reloading of all sortable items, causing new items to be recognized.

      +
      +
    • + + +
    • +
      +

      refreshPositions

      +
      +
      Signature:
      +
      .sortable( "refreshPositions" + + + + + + + +)
      +
      +
      +
      +

      Refresh the cached positions of the sortables' items. Calling this method refreshes the cached item positions of all sortables. This is usually done automatically by the script and slows down performance. Use wisely.

      +
      +
    • + + +
    • +
      +

      cancel

      +
      +
      Signature:
      +
      .sortable( "cancel" + + + + + + + +)
      +
      +
      +
      +

      Cancels a change in the current sortable and reverts it back to how it was before the current sort started. Useful in the stop and receive callback functions. +

      If the sortable item is not being moved from one connected sortable to another: +

      +
      $(this).sortable('cancel');
      +

      will cancel the change. +

      If the sortable item is being moved from one connected sortable to another: +

      +
      $(ui.sender).sortable('cancel');
      +

      will cancel the change. Useful in the 'receive' callback.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Sortable plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.sortable.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <ul class="ui-sortable">
    +   <li></li>
    +   <li class="ui-sortable-helper"></li>
    +   <li class="ui-sortable-placeholder"></li>
    +   <li></li>
    +</ul> +

    + + Note: This is a sample of markup generated by the sortable plugin, not markup you should use to create a sortable. The only markup needed for that is
    <ul>
    +   <li></li>
    +   <li></li>
    +   <li></li>
    +</ul>. +
    +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/switchClass.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/switchClass.html new file mode 100644 index 00000000000..1f5ae75227c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/switchClass.html @@ -0,0 +1,129 @@ + + +
    +

    jQuery UI switchClass

    +
    +

    Overview

    +
    +

    switchClass( remove, add, [duration] )

    +

    Switches from the class defined in the first argument to the class defined as second argument, using an optional transition.

    +
    +
    +

    Dependencies

    +
      +
    • Effects Core
    • +
    +
    +
    +

    Example

    +
    + +

    +Switch the class 'highlight' to 'blue' when a paragraph is clicked with a one second transition.
    +

    +
    $("p").click(function () {
    +      $(this).switchClass("highlight", "blue", 1000);
    +    });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <script src="http://ui.jquery.com/latest/ui/effects.core.js"></script>
    +<style type="text/css">
    +  p { margin: 4px; font-size:16px; font-weight:bolder; 
    +      cursor:pointer; }
    +  .blue { background: blue; }
    +  .highlight { background:yellow; }
    +</style>
    +  <script>
    +  $(document).ready(function() {
    +    $("p").click(function () {
    +      $(this).switchClass("highlight", "blue", 1000);
    +    });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<p class="highlight">Click to switch</p>
    +<p class="highlight">to blue</p>
    +<p class="highlight">on these</p>
    +<p class="highlight">paragraphs</p>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Arguments

    +
      + +
    • +
      +

      remove

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      The CSS class that will be removed.

      +
      +
    • + + +
    • +
      +

      add

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      The CSS class that will be added.

      +
      +
    • + + +
    • +
      +

      duration

      +
      +
      Type:
      +
      String, Number
      + +
      Optional
      + +
      +
      +
      +

      A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).

      +
      +
    • + +
    +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/tabs.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/tabs.html new file mode 100644 index 00000000000..0affd40226d --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/tabs.html @@ -0,0 +1,1549 @@ + + +
    +

    jQuery UI Tabs

    +
    +

    Overview

    +
    +

    Tabs are generally used to break content into multiple sections that can be swapped to save space, much like an accordion.

    +

    By default a tab widget will swap between tabbed sections onClick, but the events can be changed to onHover through an option. Tab content can be loaded via Ajax by setting an href on a tab.

    +

    NOTE: Tabs created dynamically using .tabs( "add", ... ) are given an id of ui-tabs-NUM, where NUM is an auto-incrementing id. If you use this naming convention for your own elements, you may encounter problems.

    +

    Contents

    + +
    +

    Events

    +

    A series of events fire when interacting with a tabs interface: +

    +
    • tabsselect, tabsload, tabsshow (in that order) +
    • tabsadd, tabsremove +
    • tabsenable, tabsdisable +
    +

    Event binding example: +

    +
    $('#example').bind('tabsselect', function(event, ui) {
    +
    +    // Objects available in the function context:
    +    ui.tab     // anchor element of the selected (clicked) tab
    +    ui.panel   // element, that contains the selected/clicked tab contents
    +    ui.index   // zero-based index of the selected (clicked) tab
    +
    +});
    +

    Note that if a handler for the tabsselect event returns false, the clicked tab will not become selected (useful for example if switching to the next tab requires a form validation). +

    +

    Ajax mode

    +

    Tabs supports loading tab content via Ajax in an unobtrusive manner. +

    The HTML you need is slightly different from the one that is used for static tabs: A list of links pointing to existing resources (from where the content gets loaded) and no additional containers at all (unobtrusive!). The containers' markup is going to be created on the fly: +

    +
    +<div id="example">
    +     <ul>
    +         <li><a href="ahah_1.html"><span>Content 1</span></a></li>
    +         <li><a href="ahah_2.html"><span>Content 2</span></a></li>
    +         <li><a href="ahah_3.html"><span>Content 3</span></a></li>
    +     </ul>
    +</div>
    +
    +

    Obviously this degrades gracefully - the links, e.g. the content, will still be accessible with JavaScript disabled. +

    Note that if you wish to reuse an existing container, you +could do so by matching a title attribute and the container's id: +

    +
    +<li><a href="hello/world.html" title="Todo Overview"> ... </a></li>
    +
    +

    and a container like: +

    +
    +<div id="Todo_Overview"> ... </div>
    +
    +

    (Note how white space is replaced with an underscore) +

    This is useful if you want a human readable hash in the URL instead of +a cryptic generated one. +

    +

    Back button and bookmarking

    +

    Tabs 2 already supported this functionality, although the history plugin needs a rewrite first (it doesn't support Safari 3 and is in general a little inflexible) before it can be build back into the tabs. It is planned and Klaus is working on it whenever he finds the time. Actual bugs in the UI Tabs plugin itself always have higher priority though. +

    +

    How to...

    +

    ...retrieve the index of the currently selected tab

    +
    var $tabs = $('#example').tabs();
    +var selected = $tabs.tabs('option', 'selected'); // => 0
    +

    ...open links in the current tab instead of leaving the page

    +

    "Hijax" links after tab content has been loaded: +

    +
    $('#example').tabs({
    +    load: function(event, ui) {
    +        $('a', ui.panel).click(function() {
    +            $(ui.panel).load(this.href);
    +            return false;
    +        });
    +    }
    +});
    +

    ...select a tab from a text link instead of clicking a tab itself

    +
    var $tabs = $('#example').tabs(); // first tab selected
    +
    +$('#my-text-link').click(function() { // bind click event to link
    +    $tabs.tabs('select', 2); // switch to third tab
    +    return false;
    +});
    +

    ...prevent switching to the tab on click depending on form validation

    +

    Returning false in the tabs select handler prevents the clicked tab from becoming selected. +

    +
    $('#example').tabs({
    +    select: function(event, ui) {
    +        var isValid = ... // form validation returning true or false
    +        return isValid;
    +    }
    +});
    +

    ...immediately select a just added tab

    +
    var $tabs = $('#example').tabs({
    +    add: function(event, ui) {
    +        $tabs.tabs('select', '#' + ui.panel.id);
    +    }
    +});
    +

    ...follow a tab's URL instead of loading its content via ajax

    +

    Note that opening a tab in a new window is unexpected, e.g. +inconsistent behaviour exposing a usablity problem (http://www.useit.com/alertbox/tabs.html). +

    +
    $('#example').tabs({
    +    select: function(event, ui) {
    +        var url = $.data(ui.tab, 'load.tabs');
    +        if( url ) {
    +            location.href = url;
    +            return false;
    +        }
    +        return true;
    +    }
    +});
    +


    +

    +

    ...prevent a FOUC (Flash of Unstyled Content) before tabs are initialized

    +

    Add the necessary classes to hide an inactive tab panel to the HTML right away - note that this will not degrade gracefully with JavaScript being disabled: +

    +
    <div id="example" class="ui-tabs">
    +  ...
    +  <div id="a-tab-panel" class="ui-tabs-hide"> </div>
    +  ...
    +</div>
    +

    Why does...

    +

    ...my slider, Google Map, sIFR etc. not work when placed in a hidden (inactive) tab?

    +

    Any component that requires some dimensional computation for its initialization won't work in a hidden tab, because the tab panel itself is hidden via display: none so that any elements inside won't report their actual width and height (0 in most browsers). +

    There's an easy workaround. Use the off-left technique for hiding inactive tab panels. E.g. in your style sheet replace the rule for the class selector ".ui-tabs .ui-tabs-hide" with +

    +
    .ui-tabs .ui-tabs-hide {
    +    position: absolute;
    +    left: -10000px;
    +}
    +

    For Google maps you can also resize the map once the tab is displayed like this: +

    +
    $('#example').bind('tabsshow', function(event, ui) {
    +    if (ui.panel.id == "map-tab") {
    +        resizeMap();
    +    }
    +});
    +resizeMap() will call Google Maps' checkResize() on the particular map. +
    +
    +

    Dependencies

    + +
    +
    +

    Example

    +
    + +

    +A simple jQuery UI Tabs.
    +

    +
    $("#tabs").tabs();
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  
    +  <script>
    +  $(document).ready(function() {
    +    $("#tabs").tabs();
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<div id="tabs">
    +    <ul>
    +        <li><a href="#fragment-1"><span>One</span></a></li>
    +        <li><a href="#fragment-2"><span>Two</span></a></li>
    +        <li><a href="#fragment-3"><span>Three</span></a></li>
    +    </ul>
    +    <div id="fragment-1">
    +        <p>First tab is active by default:</p>
    +        <pre><code>$('#example').tabs();</code></pre>
    +    </div>
    +    <div id="fragment-2">
    +        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
    +        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
    +    </div>
    +    <div id="fragment-3">
    +        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
    +        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
    +        Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
    +    </div>
    +</div>
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Options

    +
      + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Disables (true) or enables (false) the tabs. Can be set when initialising (first creating) the tabs.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the disabled option specified. +
      +
      +
      $( ".selector" ).tabs({ disabled: true });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).tabs( "option", "disabled" );
      +//setter
      +$( ".selector" ).tabs( "option", "disabled", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      ajaxOptions

      +
      +
      Type:
      +
      Options
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      Additional Ajax options to consider when loading tab content (see $.ajax).

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the ajaxOptions option specified. +
      +
      +
      $( ".selector" ).tabs({ ajaxOptions: { async: false } });
      +
      + + +
      + Get or set the ajaxOptions option, after init. +
      +
      +
      //getter
      +var ajaxOptions = $( ".selector" ).tabs( "option", "ajaxOptions" );
      +//setter
      +$( ".selector" ).tabs( "option", "ajaxOptions", { async: false } );
      +
      + +
      +
      +
    • + + +
    • +
      +

      cache

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Whether or not to cache remote tabs content, e.g. load only once or with every click. Cached content is being lazy loaded, e.g once and only once for the first click. Note that to prevent the actual Ajax requests from being cached by the browser you need to provide an extra cache: false flag to ajaxOptions.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the cache option specified. +
      +
      +
      $( ".selector" ).tabs({ cache: true });
      +
      + + +
      + Get or set the cache option, after init. +
      +
      +
      //getter
      +var cache = $( ".selector" ).tabs( "option", "cache" );
      +//setter
      +$( ".selector" ).tabs( "option", "cache", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      collapsible

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      Set to true to allow an already selected tab to become unselected again upon reselection.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the collapsible option specified. +
      +
      +
      $( ".selector" ).tabs({ collapsible: true });
      +
      + + +
      + Get or set the collapsible option, after init. +
      +
      +
      //getter
      +var collapsible = $( ".selector" ).tabs( "option", "collapsible" );
      +//setter
      +$( ".selector" ).tabs( "option", "collapsible", true );
      +
      + +
      +
      +
    • + + + + + +
    • +
      +

      deselectable

      +
      +
      Type:
      +
      Boolean
      + +
      Default:
      +
      false
      + +
      +
      +
      +

      deprecated in jQuery UI 1.7, use collapsible.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the deselectable option specified. +
      +
      +
      $( ".selector" ).tabs({ deselectable: true });
      +
      + + +
      + Get or set the deselectable option, after init. +
      +
      +
      //getter
      +var deselectable = $( ".selector" ).tabs( "option", "deselectable" );
      +//setter
      +$( ".selector" ).tabs( "option", "deselectable", true );
      +
      + +
      +
      +
    • + + +
    • +
      +

      disabled

      +
      +
      Type:
      +
      Array<Number>
      + +
      Default:
      +
      []
      + +
      +
      +
      +

      An array containing the position of the tabs (zero-based index) that should be disabled on initialization.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the disabled option specified. +
      +
      +
      $( ".selector" ).tabs({ disabled: [1, 2] });
      +
      + + +
      + Get or set the disabled option, after init. +
      +
      +
      //getter
      +var disabled = $( ".selector" ).tabs( "option", "disabled" );
      +//setter
      +$( ".selector" ).tabs( "option", "disabled", [1, 2] );
      +
      + +
      +
      +
    • + + +
    • +
      +

      event

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'click'
      + +
      +
      +
      +

      The type of event to be used for selecting a tab.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the event option specified. +
      +
      +
      $( ".selector" ).tabs({ event: 'mouseover' });
      +
      + + +
      + Get or set the event option, after init. +
      +
      +
      //getter
      +var event = $( ".selector" ).tabs( "option", "event" );
      +//setter
      +$( ".selector" ).tabs( "option", "event", 'mouseover' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      fx

      +
      +
      Type:
      +
      Options, Array<Options>
      + +
      Default:
      +
      null
      + +
      +
      +
      +

      Enable animations for hiding and showing tab panels. The duration option can be a string representing one of the three predefined speeds ("slow", "normal", "fast") or the duration in milliseconds to run an animation (default is "normal").

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the fx option specified. +
      +
      +
      $( ".selector" ).tabs({ fx: { opacity: 'toggle' } });
      +
      + + +
      + Get or set the fx option, after init. +
      +
      +
      //getter
      +var fx = $( ".selector" ).tabs( "option", "fx" );
      +//setter
      +$( ".selector" ).tabs( "option", "fx", { opacity: 'toggle' } );
      +
      + +
      +
      +
    • + + +
    • +
      +

      idPrefix

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      'ui-tabs-'
      + +
      +
      +
      +

      If the remote tab, its anchor element that is, has no title attribute to generate an id from, an id/fragment identifier is created from this prefix and a unique id returned by $.data(el), for example "ui-tabs-54".

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the idPrefix option specified. +
      +
      +
      $( ".selector" ).tabs({ idPrefix: 'ui-tabs-primary' });
      +
      + + +
      + Get or set the idPrefix option, after init. +
      +
      +
      //getter
      +var idPrefix = $( ".selector" ).tabs( "option", "idPrefix" );
      +//setter
      +$( ".selector" ).tabs( "option", "idPrefix", 'ui-tabs-primary' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      panelTemplate

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      '<div></div>'
      + +
      +
      +
      +

      HTML template from which a new tab panel is created in case of adding a tab with the add method or when creating a panel for a remote tab on the fly.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the panelTemplate option specified. +
      +
      +
      $( ".selector" ).tabs({ panelTemplate: '<li></li>' });
      +
      + + +
      + Get or set the panelTemplate option, after init. +
      +
      +
      //getter
      +var panelTemplate = $( ".selector" ).tabs( "option", "panelTemplate" );
      +//setter
      +$( ".selector" ).tabs( "option", "panelTemplate", '<li></li>' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      selected

      +
      +
      Type:
      +
      Number
      + +
      Default:
      +
      0
      + +
      +
      +
      +

      Zero-based index of the tab to be selected on initialization. To set all tabs to unselected pass -1 as value.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the selected option specified. +
      +
      +
      $( ".selector" ).tabs({ selected: 3 });
      +
      + + +
      + Get or set the selected option, after init. +
      +
      +
      //getter
      +var selected = $( ".selector" ).tabs( "option", "selected" );
      +//setter
      +$( ".selector" ).tabs( "option", "selected", 3 );
      +
      + +
      +
      +
    • + + +
    • +
      +

      spinner

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      '<em>Loading&#8230;</em>'
      + +
      +
      +
      +

      The HTML content of this string is shown in a tab title while remote content is loading. Pass in empty string to deactivate that behavior. An span element must be present in the A tag of the title, for the spinner content to be visible.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the spinner option specified. +
      +
      +
      $( ".selector" ).tabs({ spinner: 'Retrieving data...' });
      +
      + + +
      + Get or set the spinner option, after init. +
      +
      +
      //getter
      +var spinner = $( ".selector" ).tabs( "option", "spinner" );
      +//setter
      +$( ".selector" ).tabs( "option", "spinner", 'Retrieving data...' );
      +
      + +
      +
      +
    • + + +
    • +
      +

      tabTemplate

      +
      +
      Type:
      +
      String
      + +
      Default:
      +
      '<li><a href="#{href}"><span>#{label}</span></a></li>'
      + +
      +
      +
      +

      HTML template from which a new tab is created and added. The placeholders #{href} and #{label} are replaced with the url and tab label that are passed as arguments to the add method.

      +
      +
      +

      Code examples

      +
      + +
      + Initialize a tabs with the tabTemplate option specified. +
      +
      +
      $( ".selector" ).tabs({ tabTemplate: '<div><a href="#{href}"><span>#{label}</span></a></div>' });
      +
      + + +
      + Get or set the tabTemplate option, after init. +
      +
      +
      //getter
      +var tabTemplate = $( ".selector" ).tabs( "option", "tabTemplate" );
      +//setter
      +$( ".selector" ).tabs( "option", "tabTemplate", '<div><a href="#{href}"><span>#{label}</span></a></div>' );
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Events

    +
      + +
    • +
      +

      create

      +
      +
      Type:
      +
      tabscreate
      +
      +
      +
      +

      This event is triggered when tabs is created.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the create event as an init option. +
      +
      +
      $( ".selector" ).tabs({
      +   create: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the create event by type: tabscreate. +
      +
      +
      $( ".selector" ).bind( "tabscreate", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      select

      +
      +
      Type:
      +
      tabsselect
      +
      +
      +
      +

      This event is triggered when clicking a tab.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the select event as an init option. +
      +
      +
      $( ".selector" ).tabs({
      +   select: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the select event by type: tabsselect. +
      +
      +
      $( ".selector" ).bind( "tabsselect", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      load

      +
      +
      Type:
      +
      tabsload
      +
      +
      +
      +

      This event is triggered after the content of a remote tab has been loaded.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the load event as an init option. +
      +
      +
      $( ".selector" ).tabs({
      +   load: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the load event by type: tabsload. +
      +
      +
      $( ".selector" ).bind( "tabsload", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      show

      +
      +
      Type:
      +
      tabsshow
      +
      +
      +
      +

      This event is triggered when a tab is shown.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the show event as an init option. +
      +
      +
      $( ".selector" ).tabs({
      +   show: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the show event by type: tabsshow. +
      +
      +
      $( ".selector" ).bind( "tabsshow", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      add

      +
      +
      Type:
      +
      tabsadd
      +
      +
      +
      +

      This event is triggered when a tab is added.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the add event as an init option. +
      +
      +
      $( ".selector" ).tabs({
      +   add: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the add event by type: tabsadd. +
      +
      +
      $( ".selector" ).bind( "tabsadd", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      remove

      +
      +
      Type:
      +
      tabsremove
      +
      +
      +
      +

      This event is triggered when a tab is removed.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the remove event as an init option. +
      +
      +
      $( ".selector" ).tabs({
      +   remove: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the remove event by type: tabsremove. +
      +
      +
      $( ".selector" ).bind( "tabsremove", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Type:
      +
      tabsenable
      +
      +
      +
      +

      This event is triggered when a tab is enabled.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the enable event as an init option. +
      +
      +
      $( ".selector" ).tabs({
      +   enable: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the enable event by type: tabsenable. +
      +
      +
      $( ".selector" ).bind( "tabsenable", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Type:
      +
      tabsdisable
      +
      +
      +
      +

      This event is triggered when a tab is disabled.

      +
      +
      +

      Code examples

      +
      + +
      + Supply a callback function to handle the disable event as an init option. +
      +
      +
      $( ".selector" ).tabs({
      +   disable: function(event, ui) { ... }
      +});
      +
      + + +
      + Bind to the disable event by type: tabsdisable. +
      +
      +
      $( ".selector" ).bind( "tabsdisable", function(event, ui) {
      +  ...
      +});
      +
      + +
      +
      +
    • + +
    +
    +
    +

    Methods

    +
      + +
    • +
      +

      destroy

      +
      +
      Signature:
      +
      .tabs( "destroy" + + + + + + + +)
      +
      +
      +
      +

      Remove the tabs functionality completely. This will return the element back to its pre-init state.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .tabs( "disable" + + + + + + + +)
      +
      +
      +
      +

      Disable the tabs.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .tabs( "enable" + + + + + + + +)
      +
      +
      +
      +

      Enable the tabs.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .tabs( "option" + +, optionName + +, [value] + + + +)
      +
      +
      +
      +

      Get or set any tabs option. If no value is specified, will act as a getter.

      +
      +
    • + + +
    • +
      +

      option

      +
      +
      Signature:
      +
      .tabs( "option" + +, options + + + + + +)
      +
      +
      +
      +

      Set multiple tabs options at once by providing an options object.

      +
      +
    • + + +
    • +
      +

      widget

      +
      +
      Signature:
      +
      .tabs( "widget" + + + + + + + +)
      +
      +
      +
      +

      Returns the .ui-tabs element.

      +
      +
    • + + +
    • +
      +

      add

      +
      +
      Signature:
      +
      .tabs( "add" + +, url + +, label + +, [index] + +)
      +
      +
      +
      +

      Add a new tab. The second argument is either a URL consisting of a fragment identifier only to create an in-page tab or a full url (relative or absolute, no cross-domain support) to turn the new tab into an Ajax (remote) tab. The third is the zero-based position where to insert the new tab. Optional, by default a new tab is appended at the end.

      +
      +
    • + + +
    • +
      +

      remove

      +
      +
      Signature:
      +
      .tabs( "remove" + +, index + + + + + +)
      +
      +
      +
      +

      Remove a tab. The second argument is the zero-based index of the tab to be removed.

      +
      +
    • + + +
    • +
      +

      enable

      +
      +
      Signature:
      +
      .tabs( "enable" + +, index + + + + + +)
      +
      +
      +
      +

      Enable a disabled tab. To enable more than one tab at once reset the disabled property like: $('#example').tabs("option","disabled",[]);. The second argument is the zero-based index of the tab to be enabled.

      +
      +
    • + + +
    • +
      +

      disable

      +
      +
      Signature:
      +
      .tabs( "disable" + +, index + + + + + +)
      +
      +
      +
      +

      Disable a tab. The selected tab cannot be disabled. To disable more than one tab at once use: $('#example').tabs("option","disabled", [1, 2, 3]); The second argument is the zero-based index of the tab to be disabled.

      +
      +
    • + + +
    • +
      +

      select

      +
      +
      Signature:
      +
      .tabs( "select" + +, index + + + + + +)
      +
      +
      +
      +

      Select a tab, as if it were clicked. The second argument is the zero-based index of the tab to be selected or the id selector of the panel the tab is associated with (the tab's href fragment identifier, e.g. hash, points to the panel's id).

      +
      +
    • + + +
    • +
      +

      load

      +
      +
      Signature:
      +
      .tabs( "load" + +, index + + + + + +)
      +
      +
      +
      +

      Reload the content of an Ajax tab programmatically. This method always loads the tab content from the remote location, even if cache is set to true. The second argument is the zero-based index of the tab to be reloaded.

      +
      +
    • + + +
    • +
      +

      url

      +
      +
      Signature:
      +
      .tabs( "url" + +, index + +, url + + + +)
      +
      +
      +
      +

      Change the url from which an Ajax (remote) tab will be loaded. The specified URL will be used for subsequent loads. Note that you can not only change the URL for an existing remote tab with this method, but also turn an in-page tab into a remote tab. The second argument is the zero-based index of the tab of which its URL is to be updated. The third is a URL the content of the tab is loaded from.

      +
      +
    • + + +
    • +
      +

      length

      +
      +
      Signature:
      +
      .tabs( "length" + + + + + + + +)
      +
      +
      +
      +

      Retrieve the number of tabs of the first matched tab pane.

      +
      +
    • + + +
    • +
      +

      abort

      +
      +
      Signature:
      +
      .tabs( "abort" + + + + + + + +)
      +
      +
      +
      +

      Terminate all running tab ajax requests and animations.

      +
      +
    • + + +
    • +
      +

      rotate

      +
      +
      Signature:
      +
      .tabs( "rotate" + +, ms + +, [continuing] + + + +)
      +
      +
      +
      +

      Set up an automatic rotation through tabs of a tab pane. The second argument is an amount of time in milliseconds until the next tab in the cycle gets activated. Use 0 or null to stop the rotation. The third controls whether or not to continue the rotation after a tab has been selected by a user. Default: false.

      +
      +
    • + +
    +
    +
    +

    Theming

    +

    The jQuery UI Tabs plugin uses the jQuery UI CSS Framework to style its look and feel, including colors and background textures. We recommend using the ThemeRoller tool to create and download custom themes that are easy to build and maintain. +

    +

    If a deeper level of customization is needed, there are widget-specific classes referenced within the jquery.ui.tabs.css stylesheet that can be modified. These classes are highlighed in bold below. +

    + +

    Sample markup with jQuery UI CSS Framework classes

    + <div class="ui-tabs ui-widget ui-widget-content ui-corner-all" id="tabs">
    +   <ul class="ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all">
    +     <li class="ui-state-default ui-corner-top ui-tabs-selected ui-state-active"><a href="#tabs-1">Nunc tincidunt</a></li>
    +      <li class="ui-state-default ui-corner-top"><a href="#tabs-2">Proin dolor</a></li>
    +   <div class="ui-tabs-panel ui-widget-content ui-corner-bottom" id="tabs-1">
    +      <p>Tab one content goes here.</p>
    +   </div>
    +    ...
    +</div>
    +

    + + Note: This is a sample of markup generated by the tabs plugin, not markup you should use to create a tabs. The only markup needed for that is
    <div id="tabs">
    +   <ul>
    +      <li><a href="#tabs-1">Nunc tincidunt</a></li>
    +      <li><a href="#tabs-2">Proin dolor</a></li>
    +      <li><a href="#tabs-3">Aenean lacinia</a></li>
    +   </ul>
    +   <div id="tabs-1">
    +      <p>Tab 1 content</p>
    +   </div>
    +   <div id="tabs-2">
    +      <p>Tab 2 content</p>
    +   </div>
    +   <div id="tabs-3">
    +      <p>Tab 3 content</p>
    +   </div>
    +</div>. +
    +

    + +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/toggle.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/toggle.html new file mode 100644 index 00000000000..9b1504feecb --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/toggle.html @@ -0,0 +1,144 @@ + + +
    +

    jQuery UI toggle

    +
    +

    Overview

    +
    +

    toggle( effect, [options], [speed], [callback] )

    +

    The enhanced toggle method optionally accepts jQuery UI advanced effects.

    +

    Uses a specific effect on an element to toggle the element if the first argument is an effect string.

    +
    +
    +

    Dependencies

    +
      +
    • Effects Core
    • +
    +
    +
    +

    Example

    +
    + +

    +Apply the effect slide if you click on the p to toggle a div.
    +

    +
    $("p").click(function () {
    +      $("div").toggle("slide", {}, 1000);
    +    });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <script src="http://ui.jquery.com/latest/ui/effects.core.js"></script>
    +<script src="http://ui.jquery.com/latest/ui/effects.slide.js"></script>
    +<style type="text/css">
    +  div { display: none; margin: 0px; width: 100px; height: 80px; background: blue; position: relative; }
    +</style>
    +  <script>
    +  $(document).ready(function() {
    +    $("p").click(function () {
    +      $("div").toggle("slide", {}, 1000);
    +    });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<p>Click me</p><div></div>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Arguments

    +
      + +
    • +
      +

      effect

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      The effect to be used. Possible values: 'blind', 'clip', 'drop', 'explode', 'fold', 'puff', 'slide', 'scale', 'size', 'pulsate'.

      +
      +
    • + + +
    • +
      +

      options

      +
      +
      Type:
      +
      Hash
      + +
      Optional
      + +
      +
      +
      +

      A object/hash including specific options for the effect.

      +
      +
    • + + +
    • +
      +

      speed

      +
      +
      Type:
      +
      String, Number
      + +
      Optional
      + +
      +
      +
      +

      A string representing one of the predefined speeds ("slow" or "fast") or the number of milliseconds to run the animation (e.g. 1000).

      +
      +
    • + + +
    • +
      +

      callback

      +
      +
      Type:
      +
      Function
      + +
      Optional
      + +
      +
      +
      +

      A function that is called after the effect is completed.

      +
      +
    • + +
    +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/toggleClass.html b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/toggleClass.html new file mode 100644 index 00000000000..931c73df100 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/docs/toggleClass.html @@ -0,0 +1,111 @@ + + +
    +

    jQuery UI toggleClass

    +
    +

    Overview

    +
    +

    toggleClass( class, [duration] )

    +

    Adds the specified class if it is not present, and removes the specified class if it is present, using an optional transition.

    +
    +
    +

    Dependencies

    +
      +
    • Effects Core
    • +
    +
    +
    +

    Example

    +
    + +

    +Adds the 'selected' class if it is not present, and removes the 'selected' class if it is present.
    +

    +
    $("p").click(function () {
    +      $(this).toggleClass("selected", 1000);
    +    });
    +
    +

    +

    +
    <!DOCTYPE html>
    +<html>
    +<head>
    +  <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
    +  <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js"></script>
    +  <script src="http://ui.jquery.com/latest/ui/effects.core.js"></script>
    +<style type="text/css">
    +  p { cursor: pointer; font-size: 1.2em; }
    +  .selected { color:red; }
    +</style>
    +  <script>
    +  $(document).ready(function() {
    +    $("p").click(function () {
    +      $(this).toggleClass("selected", 1000);
    +    });
    +  });
    +  </script>
    +</head>
    +<body style="font-size:62.5%;">
    +  
    +<p>Click me to toggle 'selected' class.</p>
    +<p class="selected">Click me to toggle 'selected' class.</p>
    +<p>Click me to toggle 'selected' class.</p>
    +
    +</body>
    +</html>
    +
    +

    +

    +
    +
    +
    +

    Arguments

    +
      + +
    • +
      +

      class

      +
      +
      Type:
      +
      String
      + +
      +
      +
      +

      A CSS class to toggle on the elements.

      +
      +
    • + + +
    • +
      +

      duration

      +
      +
      Type:
      +
      String, Number
      + +
      Optional
      + +
      +
      +
      +

      A string representing one of the three predefined speeds ("slow", "normal", or "fast") or the number of milliseconds to run the animation (e.g. 1000).

      +
      +
    • + +
    +
    +
    + +

    + + diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/external/jquery.bgiframe-2.1.2.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/external/jquery.bgiframe-2.1.2.js new file mode 100644 index 00000000000..5cd38bb1d15 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/external/jquery.bgiframe-2.1.2.js @@ -0,0 +1,39 @@ +/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net) + * Licensed under the MIT License (LICENSE.txt). + * + * Version 2.1.2 + */ + +(function($){ + +$.fn.bgiframe = ($.browser.msie && /msie 6\.0/i.test(navigator.userAgent) ? function(s) { + s = $.extend({ + top : 'auto', // auto == .currentStyle.borderTopWidth + left : 'auto', // auto == .currentStyle.borderLeftWidth + width : 'auto', // auto == offsetWidth + height : 'auto', // auto == offsetHeight + opacity : true, + src : 'javascript:false;' + }, s); + var html = '' : ''); + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + var changeMonth = this._get(inst, 'changeMonth'); + var changeYear = this._get(inst, 'changeYear'); + var showMonthAfterYear = this._get(inst, 'showMonthAfterYear'); + var html = '
    '; + var monthHtml = ''; + // month selection + if (secondary || !changeMonth) + monthHtml += '' + monthNames[drawMonth] + ''; + else { + var inMinYear = (minDate && minDate.getFullYear() == drawYear); + var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear); + monthHtml += ''; + } + if (!showMonthAfterYear) + html += monthHtml + (secondary || !(changeMonth && changeYear) ? ' ' : ''); + // year selection + inst.yearshtml = ''; + if (secondary || !changeYear) + html += '' + drawYear + ''; + else { + // determine range of years to display + var years = this._get(inst, 'yearRange').split(':'); + var thisYear = new Date().getFullYear(); + var determineYear = function(value) { + var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + var year = determineYear(years[0]); + var endYear = Math.max(year, determineYear(years[1] || '')); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + inst.yearshtml += ''; + //when showing there is no need for later update + if( ! $.browser.mozilla ){ + html += inst.yearshtml; + inst.yearshtml = null; + } else { + // will be replaced later with inst.yearshtml + html += ''; + } + } + html += this._get(inst, 'yearSuffix'); + if (showMonthAfterYear) + html += (secondary || !(changeMonth && changeYear) ? ' ' : '') + monthHtml; + html += '
    '; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period == 'Y' ? offset : 0); + var month = inst.drawMonth + (period == 'M' ? offset : 0); + var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + + (period == 'D' ? offset : 0); + var date = this._restrictMinMax(inst, + this._daylightSavingAdjust(new Date(year, month, day))); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period == 'M' || period == 'Y') + this._notifyChange(inst); + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + var newDate = (minDate && date < minDate ? minDate : date); + newDate = (maxDate && newDate > maxDate ? maxDate : newDate); + return newDate; + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, 'onChangeMonthYear'); + if (onChange) + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, 'numberOfMonths'); + return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + 'Date'), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst); + var date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + if (offset < 0) + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime())); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, 'shortYearCutoff'); + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'), + monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day == 'object' ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)); + } +}); + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) + if (props[name] == null || props[name] == undefined) + target[name] = props[name]; + return target; +}; + +/* Determine whether an object is an array. */ +function isArray(a) { + return (a && (($.browser.safari && typeof a == 'object' && a.length) || + (a.constructor && a.constructor.toString().match(/\Array\(\)/)))); +}; + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Verify an empty collection wasn't passed - Fixes #6976 */ + if ( !this.length ) { + return this; + } + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick). + find('body').append($.datepicker.dpDiv); + $.datepicker.initialized = true; + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget')) + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string') + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + return this.each(function() { + typeof options == 'string' ? + $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.8.11"; + +// Workaround for #4055 +// Add another global to avoid noConflict issues with inline event handlers +window['DP_jQuery_' + dpuuid] = $; + +})(jQuery); +/* + * jQuery UI Progressbar 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.widget( "ui.progressbar", { + options: { + value: 0, + max: 100 + }, + + min: 0, + + _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.options.max, + "aria-valuenow": this._value() + }); + + this.valueDiv = $( "
    " ) + .appendTo( this.element ); + + this.oldValue = this._value(); + 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(); + + $.Widget.prototype.destroy.apply( this, arguments ); + }, + + value: function( newValue ) { + if ( newValue === undefined ) { + return this._value(); + } + + this._setOption( "value", newValue ); + return this; + }, + + _setOption: function( key, value ) { + if ( key === "value" ) { + this.options.value = value; + this._refreshValue(); + if ( this._value() === this.options.max ) { + this._trigger( "complete" ); + } + } + + $.Widget.prototype._setOption.apply( this, arguments ); + }, + + _value: function() { + var val = this.options.value; + // normalize invalid value + if ( typeof val !== "number" ) { + val = 0; + } + return Math.min( this.options.max, Math.max( this.min, val ) ); + }, + + _percentage: function() { + return 100 * this._value() / this.options.max; + }, + + _refreshValue: function() { + var value = this.value(); + var percentage = this._percentage(); + + if ( this.oldValue !== value ) { + this.oldValue = value; + this._trigger( "change" ); + } + + this.valueDiv + .toggleClass( "ui-corner-right", value === this.options.max ) + .width( percentage.toFixed(0) + "%" ); + this.element.attr( "aria-valuenow", value ); + } +}); + +$.extend( $.ui.progressbar, { + version: "1.8.11" +}); + +})( jQuery ); +/* + * jQuery UI Effects 1.8.11 + * + * Copyright 2011, 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($, undefined) { + +$.effects = {}; + + + +/******************************************************************************/ +/****************************** COLOR ANIMATIONS ******************************/ +/******************************************************************************/ + +// override the animation for color styles +$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', + 'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'], +function(i, attr) { + $.fx.step[attr] = function(fx) { + if (!fx.colorInit) { + fx.start = getColor(fx.elem, attr); + fx.end = getRGB(fx.end); + fx.colorInit = true; + } + + fx.elem.style[attr] = 'rgb(' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')'; + }; +}); + +// Color Conversion functions from highlightFade +// By Blair Mitchelmore +// http://jquery.offput.ca/highlightFade/ + +// Parse strings looking for color tuples [255,255,255] +function getRGB(color) { + var result; + + // Check if we're already dealing with an array of colors + if ( color && color.constructor == Array && color.length == 3 ) + return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) + return colors['transparent']; + + // Otherwise, we're most likely dealing with a named color + return colors[$.trim(color).toLowerCase()]; +} + +function getColor(elem, attr) { + var color; + + do { + color = $.curCSS(elem, attr); + + // Keep going until we find an element that has color, or we hit the body + if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") ) + break; + + attr = "backgroundColor"; + } while ( elem = elem.parentNode ); + + return getRGB(color); +}; + +// Some named colors to work with +// From Interface by Stefan Petre +// http://interface.eyecon.ro/ + +var colors = { + 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] +}; + + + +/******************************************************************************/ +/****************************** CLASS ANIMATIONS ******************************/ +/******************************************************************************/ + +var classAnimationActions = ['add', 'remove', 'toggle'], + shorthandStyles = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1 + }; + +function getElementStyles() { + var style = document.defaultView + ? document.defaultView.getComputedStyle(this, null) + : this.currentStyle, + newStyle = {}, + key, + camelCase; + + // webkit enumerates style porperties + if (style && style.length && style[0] && style[style[0]]) { + var len = style.length; + while (len--) { + key = style[len]; + if (typeof style[key] == 'string') { + camelCase = key.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + newStyle[camelCase] = style[key]; + } + } + } else { + for (key in style) { + if (typeof style[key] === 'string') { + newStyle[key] = style[key]; + } + } + } + + return newStyle; +} + +function filterStyles(styles) { + var name, value; + for (name in styles) { + value = styles[name]; + if ( + // ignore null and undefined values + value == null || + // ignore functions (when does this occur?) + $.isFunction(value) || + // shorthand styles that need to be expanded + name in shorthandStyles || + // ignore scrollbars (break in IE) + (/scrollbar/).test(name) || + + // only colors or values that can be converted to numbers + (!(/color/i).test(name) && isNaN(parseFloat(value))) + ) { + delete styles[name]; + } + } + + return styles; +} + +function styleDifference(oldStyle, newStyle) { + var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459 + name; + + for (name in newStyle) { + if (oldStyle[name] != newStyle[name]) { + diff[name] = newStyle[name]; + } + } + + return diff; +} + +$.effects.animateClass = function(value, duration, easing, callback) { + if ($.isFunction(easing)) { + callback = easing; + easing = null; + } + + return this.queue('fx', function() { + var that = $(this), + originalStyleAttr = that.attr('style') || ' ', + originalStyle = filterStyles(getElementStyles.call(this)), + newStyle, + className = that.attr('className'); + + $.each(classAnimationActions, function(i, action) { + if (value[action]) { + that[action + 'Class'](value[action]); + } + }); + newStyle = filterStyles(getElementStyles.call(this)); + that.attr('className', className); + + that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() { + $.each(classAnimationActions, function(i, action) { + if (value[action]) { that[action + 'Class'](value[action]); } + }); + // work around bug in IE by clearing the cssText before setting it + if (typeof that.attr('style') == 'object') { + that.attr('style').cssText = ''; + that.attr('style').cssText = originalStyleAttr; + } else { + that.attr('style', originalStyleAttr); + } + if (callback) { callback.apply(this, arguments); } + }); + + // $.animate adds a function to the end of the queue + // but we want it at the front + var queue = $.queue(this), + anim = queue.splice(queue.length - 1, 1)[0]; + queue.splice(1, 0, anim); + $.dequeue(this); + }); +}; + +$.fn.extend({ + _addClass: $.fn.addClass, + addClass: function(classNames, speed, easing, callback) { + return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames); + }, + + _removeClass: $.fn.removeClass, + removeClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames); + }, + + _toggleClass: $.fn.toggleClass, + toggleClass: function(classNames, force, speed, easing, callback) { + if ( typeof force == "boolean" || force === undefined ) { + if ( !speed ) { + // without speed parameter; + return this._toggleClass(classNames, force); + } else { + return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]); + } + } else { + // without switch parameter; + return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]); + } + }, + + switchClass: function(remove,add,speed,easing,callback) { + return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]); + } +}); + + + +/******************************************************************************/ +/*********************************** EFFECTS **********************************/ +/******************************************************************************/ + +$.extend($.effects, { + version: "1.8.11", + + // Saves a set of properties in a data storage + save: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]); + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i])); + } + }, + + setMode: function(el, mode) { + if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle + return mode; + }, + + getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value + // this should be a little more flexible in the future to handle a string & hash + var y, x; + switch (origin[0]) { + case 'top': y = 0; break; + case 'middle': y = 0.5; break; + case 'bottom': y = 1; break; + default: y = origin[0] / original.height; + }; + switch (origin[1]) { + case 'left': x = 0; break; + case 'center': x = 0.5; break; + case 'right': x = 1; break; + default: x = origin[1] / original.width; + }; + return {x: x, y: y}; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function(element) { + + // if the element is already wrapped, return it + if (element.parent().is('.ui-effects-wrapper')) { + return element.parent(); + } + + // wrap the element + var props = { + width: element.outerWidth(true), + height: element.outerHeight(true), + 'float': element.css('float') + }, + wrapper = $('
    ') + .addClass('ui-effects-wrapper') + .css({ + fontSize: '100%', + background: 'transparent', + border: 'none', + margin: 0, + padding: 0 + }); + + element.wrap(wrapper); + wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element + + // transfer positioning properties to the wrapper + if (element.css('position') == 'static') { + wrapper.css({ position: 'relative' }); + element.css({ position: 'relative' }); + } else { + $.extend(props, { + position: element.css('position'), + zIndex: element.css('z-index') + }); + $.each(['top', 'left', 'bottom', 'right'], function(i, pos) { + props[pos] = element.css(pos); + if (isNaN(parseInt(props[pos], 10))) { + props[pos] = 'auto'; + } + }); + element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' }); + } + + return wrapper.css(props).show(); + }, + + removeWrapper: function(element) { + if (element.parent().is('.ui-effects-wrapper')) + return element.parent().replaceWith(element); + return element; + }, + + setTransition: function(element, list, factor, value) { + value = value || {}; + $.each(list, function(i, x){ + unit = element.cssUnit(x); + if (unit[0] > 0) value[x] = unit[0] * factor + unit[1]; + }); + return value; + } +}); + + +function _normalizeArguments(effect, options, speed, callback) { + // shift params for method overloading + if (typeof effect == 'object') { + callback = options; + speed = null; + options = effect; + effect = options.effect; + } + if ($.isFunction(options)) { + callback = options; + speed = null; + options = {}; + } + if (typeof options == 'number' || $.fx.speeds[options]) { + callback = speed; + speed = options; + options = {}; + } + if ($.isFunction(speed)) { + callback = speed; + speed = null; + } + + options = options || {}; + + speed = speed || options.duration; + speed = $.fx.off ? 0 : typeof speed == 'number' + ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default; + + callback = callback || options.complete; + + return [effect, options, speed, callback]; +} + +function standardSpeed( speed ) { + // valid standard speeds + if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) { + return true; + } + + // invalid strings - treat as "normal" speed + if ( typeof speed === "string" && !$.effects[ speed ] ) { + return true; + } + + return false; +} + +$.fn.extend({ + effect: function(effect, options, speed, callback) { + var args = _normalizeArguments.apply(this, arguments), + // TODO: make effects take actual parameters instead of a hash + args2 = { + options: args[1], + duration: args[2], + callback: args[3] + }, + mode = args2.options.mode, + effectMethod = $.effects[effect]; + + if ( $.fx.off || !effectMethod ) { + // delegate to the original method (e.g., .show()) if possible + if ( mode ) { + return this[ mode ]( args2.duration, args2.callback ); + } else { + return this.each(function() { + if ( args2.callback ) { + args2.callback.call( this ); + } + }); + } + } + + return effectMethod.call(this, args2); + }, + + _show: $.fn.show, + show: function(speed) { + if ( standardSpeed( speed ) ) { + return this._show.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'show'; + return this.effect.apply(this, args); + } + }, + + _hide: $.fn.hide, + hide: function(speed) { + if ( standardSpeed( speed ) ) { + return this._hide.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'hide'; + return this.effect.apply(this, args); + } + }, + + // jQuery core overloads toggle and creates _toggle + __toggle: $.fn.toggle, + toggle: function(speed) { + if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) { + return this.__toggle.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'toggle'; + return this.effect.apply(this, args); + } + }, + + // helper functions + cssUnit: function(key) { + var style = this.css(key), val = []; + $.each( ['em','px','%','pt'], function(i, unit){ + if(style.indexOf(unit) > 0) + val = [parseFloat(style), unit]; + }); + return val; + } +}); + + + +/******************************************************************************/ +/*********************************** EASING ***********************************/ +/******************************************************************************/ + +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +$.easing.jswing = $.easing.swing; + +$.extend($.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert($.easing.default); + return $.easing[$.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +})(jQuery); +/* + * jQuery UI Effects Blind 1.8.11 + * + * Copyright 2011, 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/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.blind = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'vertical') ? 'height' : 'width'; + var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width(); + if(mode == 'show') wrapper.css(ref, 0); // Shift + + // Animation + var animation = {}; + animation[ref] = mode == 'show' ? distance : 0; + + // Animate + wrapper.animate(animation, o.duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Bounce 1.8.11 + * + * Copyright 2011, 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/Bounce + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.bounce = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'up'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 5; // Default # of times + var speed = o.duration || 250; // Default speed per bounce + if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + if (mode == 'hide') distance = distance / (times * 2); + if (mode != 'hide') times--; + + // Animate + if (mode == 'show') { // Show Bounce + var animation = {opacity: 1}; + animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation, speed / 2, o.options.easing); + distance = distance / 2; + times--; + }; + for (var i = 0; i < times; i++) { // Bounces + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing); + distance = (mode == 'hide') ? distance * 2 : distance / 2; + }; + if (mode == 'hide') { // Last Bounce + var animation = {opacity: 0}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + el.animate(animation, speed / 2, o.options.easing, function(){ + el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + } else { + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){ + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + }; + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Clip 1.8.11 + * + * Copyright 2011, 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/Clip + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.clip = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right','height','width']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var animate = el[0].tagName == 'IMG' ? wrapper : el; + var ref = { + size: (direction == 'vertical') ? 'height' : 'width', + position: (direction == 'vertical') ? 'top' : 'left' + }; + var distance = (direction == 'vertical') ? animate.height() : animate.width(); + if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift + + // Animation + var animation = {}; + animation[ref.size] = mode == 'show' ? distance : 0; + animation[ref.position] = mode == 'show' ? 0 : distance / 2; + + // Animate + animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Drop 1.8.11 + * + * Copyright 2011, 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/Drop + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.drop = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right','opacity']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {opacity: mode == 'show' ? 1 : 0}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Explode 1.8.11 + * + * Copyright 2011, 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/Explode + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.explode = function(o) { + + return this.queue(function() { + + var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + + o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode; + var el = $(this).show().css('visibility', 'hidden'); + var offset = el.offset(); + + //Substract the margins - not fixing the problem yet. + offset.top -= parseInt(el.css("marginTop"),10) || 0; + offset.left -= parseInt(el.css("marginLeft"),10) || 0; + + var width = el.outerWidth(true); + var height = el.outerHeight(true); + + for(var i=0;i
    ') + .css({ + position: 'absolute', + visibility: 'visible', + left: -j*(width/cells), + top: -i*(height/rows) + }) + .parent() + .addClass('ui-effects-explode') + .css({ + position: 'absolute', + overflow: 'hidden', + width: width/cells, + height: height/rows, + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0), + opacity: o.options.mode == 'show' ? 0 : 1 + }).animate({ + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)), + opacity: o.options.mode == 'show' ? 1 : 0 + }, o.duration || 500); + } + } + + // Set a timeout, to call the callback approx. when the other animations have finished + setTimeout(function() { + + o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide(); + if(o.callback) o.callback.apply(el[0]); // Callback + el.dequeue(); + + $('div.ui-effects-explode').remove(); + + }, o.duration || 500); + + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Fade 1.8.11 + * + * Copyright 2011, 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/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.fade = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'hide'); + + elem.animate({ opacity: mode }, { + queue: false, + duration: o.duration, + easing: o.options.easing, + complete: function() { + (o.callback && o.callback.apply(this, arguments)); + elem.dequeue(); + } + }); + }); +}; + +})(jQuery); +/* + * jQuery UI Effects Fold 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.effects.fold = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var size = o.options.size || 15; // Default fold size + var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value + var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2; + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var widthFirst = ((mode == 'show') != horizFirst); + var ref = widthFirst ? ['width', 'height'] : ['height', 'width']; + var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()]; + var percent = /([0-9]+)%/.exec(size); + if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1]; + if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift + + // Animation + var animation1 = {}, animation2 = {}; + animation1[ref[0]] = mode == 'show' ? distance[0] : size; + animation2[ref[1]] = mode == 'show' ? distance[1] : 0; + + // Animate + wrapper.animate(animation1, duration, o.options.easing) + .animate(animation2, duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Highlight 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.effects.highlight = function(o) { + return this.queue(function() { + var elem = $(this), + props = ['backgroundImage', 'backgroundColor', 'opacity'], + mode = $.effects.setMode(elem, o.options.mode || 'show'), + animation = { + backgroundColor: elem.css('backgroundColor') + }; + + if (mode == 'hide') { + animation.opacity = 0; + } + + $.effects.save(elem, props); + elem + .show() + .css({ + backgroundImage: 'none', + backgroundColor: o.options.color || '#ffff99' + }) + .animate(animation, { + queue: false, + duration: o.duration, + easing: o.options.easing, + complete: function() { + (mode == 'hide' && elem.hide()); + $.effects.restore(elem, props); + (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter')); + (o.callback && o.callback.apply(this, arguments)); + elem.dequeue(); + } + }); + }); +}; + +})(jQuery); +/* + * jQuery UI Effects Pulsate 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.effects.pulsate = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'show'); + times = ((o.options.times || 5) * 2) - 1; + duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2, + isVisible = elem.is(':visible'), + animateTo = 0; + + if (!isVisible) { + elem.css('opacity', 0).show(); + animateTo = 1; + } + + if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) { + times--; + } + + for (var i = 0; i < times; i++) { + elem.animate({ opacity: animateTo }, duration, o.options.easing); + animateTo = (animateTo + 1) % 2; + } + + elem.animate({ opacity: animateTo }, duration, o.options.easing, function() { + if (animateTo == 0) { + elem.hide(); + } + (o.callback && o.callback.apply(this, arguments)); + }); + + elem + .queue('fx', function() { elem.dequeue(); }) + .dequeue(); + }); +}; + +})(jQuery); +/* + * jQuery UI Effects Scale 1.8.11 + * + * Copyright 2011, 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/Scale + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.puff = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'hide'), + percent = parseInt(o.options.percent, 10) || 150, + factor = percent / 100, + original = { height: elem.height(), width: elem.width() }; + + $.extend(o.options, { + fade: true, + mode: mode, + percent: mode == 'hide' ? percent : 100, + from: mode == 'hide' + ? original + : { + height: original.height * factor, + width: original.width * factor + } + }); + + elem.effect('scale', o.options, o.duration, o.callback); + elem.dequeue(); + }); +}; + +$.effects.scale = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var options = $.extend(true, {}, o.options); + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent + var direction = o.options.direction || 'both'; // Set default axis + var origin = o.options.origin; // The origin of the scaling + if (mode != 'effect') { // Set default origin and restore for show/hide + options.origin = origin || ['middle','center']; + options.restore = true; + } + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state + + // Adjust + var factor = { // Set scaling factor + y: direction != 'horizontal' ? (percent / 100) : 1, + x: direction != 'vertical' ? (percent / 100) : 1 + }; + el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state + + if (o.options.fade) { // Fade option to support puff + if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;}; + if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;}; + }; + + // Animation + options.from = el.from; options.to = el.to; options.mode = mode; + + // Animate + el.effect('size', options, o.duration, o.callback); + el.dequeue(); + }); + +}; + +$.effects.size = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity']; + var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore + var props2 = ['width','height','overflow']; // Copy for children + var cProps = ['fontSize']; + var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom']; + var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var restore = o.options.restore || false; // Default restore + var scale = o.options.scale || 'both'; // Default scale mode + var origin = o.options.origin; // The origin of the sizing + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || original; // Default from state + el.to = o.options.to || original; // Default to state + // Adjust + if (origin) { // Calculate baseline shifts + var baseline = $.effects.getBaseline(origin, original); + el.from.top = (original.height - el.from.height) * baseline.y; + el.from.left = (original.width - el.from.width) * baseline.x; + el.to.top = (original.height - el.to.height) * baseline.y; + el.to.left = (original.width - el.to.width) * baseline.x; + }; + var factor = { // Set scaling factor + from: {y: el.from.height / original.height, x: el.from.width / original.width}, + to: {y: el.to.height / original.height, x: el.to.width / original.width} + }; + if (scale == 'box' || scale == 'both') { // Scale the css box + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(vProps); + el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + props = props.concat(hProps); + el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from); + el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to); + }; + }; + if (scale == 'content' || scale == 'both') { // Scale the content + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(cProps); + el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to); + }; + }; + $.effects.save(el, restore ? props : props1); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + el.css('overflow','hidden').css(el.from); // Shift + + // Animate + if (scale == 'content' || scale == 'both') { // Scale the children + vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size + hProps = hProps.concat(['marginLeft','marginRight']); // Add margins + props2 = props.concat(vProps).concat(hProps); // Concat + el.find("*[width]").each(function(){ + child = $(this); + if (restore) $.effects.save(child, props2); + var c_original = {height: child.height(), width: child.width()}; // Save original + child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x}; + child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x}; + if (factor.from.y != factor.to.y) { // Vertical props scaling + child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from); + child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from); + child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to); + }; + child.css(child.from); // Shift children + child.animate(child.to, o.duration, o.options.easing, function(){ + if (restore) $.effects.restore(child, props2); // Restore children + }); // Animate children + }); + }; + + // Animate + el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if (el.to.opacity === 0) { + el.css('opacity', el.from.opacity); + } + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Shake 1.8.11 + * + * Copyright 2011, 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/Shake + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.shake = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'left'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 3; // Default # of times + var speed = o.duration || o.options.duration || 140; // Default speed per shake + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + + // Animation + var animation = {}, animation1 = {}, animation2 = {}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2; + animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2; + + // Animate + el.animate(animation, speed, o.options.easing); + for (var i = 1; i < times; i++) { // Shakes + el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing); + }; + el.animate(animation1, speed, o.options.easing). + animate(animation, speed / 2, o.options.easing, function(){ // Last shake + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Slide 1.8.11 + * + * Copyright 2011, 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/Slide + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.slide = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true})); + if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift + + // Animation + var animation = {}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); +/* + * jQuery UI Effects Transfer 1.8.11 + * + * Copyright 2011, 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/Transfer + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.transfer = function(o) { + return this.queue(function() { + var elem = $(this), + target = $(o.options.to), + endPosition = target.offset(), + animation = { + top: endPosition.top, + left: endPosition.left, + height: target.innerHeight(), + width: target.innerWidth() + }, + startPosition = elem.offset(), + transfer = $('
    ') + .appendTo(document.body) + .addClass(o.options.className) + .css({ + top: startPosition.top, + left: startPosition.left, + height: elem.innerHeight(), + width: elem.innerWidth(), + position: 'absolute' + }) + .animate(animation, o.duration, o.options.easing, function() { + transfer.remove(); + (o.callback && o.callback.apply(elem[0], arguments)); + elem.dequeue(); + }); + }); +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.blind.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.blind.js new file mode 100644 index 00000000000..6e1f1741c16 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.blind.js @@ -0,0 +1,49 @@ +/* + * jQuery UI Effects Blind 1.8.11 + * + * Copyright 2011, 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/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.blind = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'vertical') ? 'height' : 'width'; + var distance = (direction == 'vertical') ? wrapper.height() : wrapper.width(); + if(mode == 'show') wrapper.css(ref, 0); // Shift + + // Animation + var animation = {}; + animation[ref] = mode == 'show' ? distance : 0; + + // Animate + wrapper.animate(animation, o.duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.bounce.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.bounce.js new file mode 100644 index 00000000000..5648494b469 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.bounce.js @@ -0,0 +1,78 @@ +/* + * jQuery UI Effects Bounce 1.8.11 + * + * Copyright 2011, 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/Bounce + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.bounce = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'up'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 5; // Default # of times + var speed = o.duration || 250; // Default speed per bounce + if (/show|hide/.test(mode)) props.push('opacity'); // Avoid touching opacity to prevent clearType and PNG issues in IE + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 3 : el.outerWidth({margin:true}) / 3); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + if (mode == 'hide') distance = distance / (times * 2); + if (mode != 'hide') times--; + + // Animate + if (mode == 'show') { // Show Bounce + var animation = {opacity: 1}; + animation[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation, speed / 2, o.options.easing); + distance = distance / 2; + times--; + }; + for (var i = 0; i < times; i++) { // Bounces + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing); + distance = (mode == 'hide') ? distance * 2 : distance / 2; + }; + if (mode == 'hide') { // Last Bounce + var animation = {opacity: 0}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + el.animate(animation, speed / 2, o.options.easing, function(){ + el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + } else { + var animation1 = {}, animation2 = {}; + animation1[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation2[ref] = (motion == 'pos' ? '+=' : '-=') + distance; + el.animate(animation1, speed / 2, o.options.easing).animate(animation2, speed / 2, o.options.easing, function(){ + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + }; + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.clip.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.clip.js new file mode 100644 index 00000000000..0f86d098d42 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.clip.js @@ -0,0 +1,54 @@ +/* + * jQuery UI Effects Clip 1.8.11 + * + * Copyright 2011, 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/Clip + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.clip = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right','height','width']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'vertical'; // Default direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var animate = el[0].tagName == 'IMG' ? wrapper : el; + var ref = { + size: (direction == 'vertical') ? 'height' : 'width', + position: (direction == 'vertical') ? 'top' : 'left' + }; + var distance = (direction == 'vertical') ? animate.height() : animate.width(); + if(mode == 'show') { animate.css(ref.size, 0); animate.css(ref.position, distance / 2); } // Shift + + // Animation + var animation = {}; + animation[ref.size] = mode == 'show' ? distance : 0; + animation[ref.position] = mode == 'show' ? 0 : distance / 2; + + // Animate + animate.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.core.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.core.js new file mode 100644 index 00000000000..072305b01bc --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.core.js @@ -0,0 +1,747 @@ +/* + * jQuery UI Effects 1.8.11 + * + * Copyright 2011, 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($, undefined) { + +$.effects = {}; + + + +/******************************************************************************/ +/****************************** COLOR ANIMATIONS ******************************/ +/******************************************************************************/ + +// override the animation for color styles +$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', + 'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'], +function(i, attr) { + $.fx.step[attr] = function(fx) { + if (!fx.colorInit) { + fx.start = getColor(fx.elem, attr); + fx.end = getRGB(fx.end); + fx.colorInit = true; + } + + fx.elem.style[attr] = 'rgb(' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' + + Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')'; + }; +}); + +// Color Conversion functions from highlightFade +// By Blair Mitchelmore +// http://jquery.offput.ca/highlightFade/ + +// Parse strings looking for color tuples [255,255,255] +function getRGB(color) { + var result; + + // Check if we're already dealing with an array of colors + if ( color && color.constructor == Array && color.length == 3 ) + return color; + + // Look for rgb(num,num,num) + if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color)) + return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)]; + + // Look for rgb(num%,num%,num%) + if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color)) + return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55]; + + // Look for #a0b1c2 + if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color)) + return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)]; + + // Look for #fff + if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color)) + return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)]; + + // Look for rgba(0, 0, 0, 0) == transparent in Safari 3 + if (result = /rgba\(0, 0, 0, 0\)/.exec(color)) + return colors['transparent']; + + // Otherwise, we're most likely dealing with a named color + return colors[$.trim(color).toLowerCase()]; +} + +function getColor(elem, attr) { + var color; + + do { + color = $.curCSS(elem, attr); + + // Keep going until we find an element that has color, or we hit the body + if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") ) + break; + + attr = "backgroundColor"; + } while ( elem = elem.parentNode ); + + return getRGB(color); +}; + +// Some named colors to work with +// From Interface by Stefan Petre +// http://interface.eyecon.ro/ + +var colors = { + 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] +}; + + + +/******************************************************************************/ +/****************************** CLASS ANIMATIONS ******************************/ +/******************************************************************************/ + +var classAnimationActions = ['add', 'remove', 'toggle'], + shorthandStyles = { + border: 1, + borderBottom: 1, + borderColor: 1, + borderLeft: 1, + borderRight: 1, + borderTop: 1, + borderWidth: 1, + margin: 1, + padding: 1 + }; + +function getElementStyles() { + var style = document.defaultView + ? document.defaultView.getComputedStyle(this, null) + : this.currentStyle, + newStyle = {}, + key, + camelCase; + + // webkit enumerates style porperties + if (style && style.length && style[0] && style[style[0]]) { + var len = style.length; + while (len--) { + key = style[len]; + if (typeof style[key] == 'string') { + camelCase = key.replace(/\-(\w)/g, function(all, letter){ + return letter.toUpperCase(); + }); + newStyle[camelCase] = style[key]; + } + } + } else { + for (key in style) { + if (typeof style[key] === 'string') { + newStyle[key] = style[key]; + } + } + } + + return newStyle; +} + +function filterStyles(styles) { + var name, value; + for (name in styles) { + value = styles[name]; + if ( + // ignore null and undefined values + value == null || + // ignore functions (when does this occur?) + $.isFunction(value) || + // shorthand styles that need to be expanded + name in shorthandStyles || + // ignore scrollbars (break in IE) + (/scrollbar/).test(name) || + + // only colors or values that can be converted to numbers + (!(/color/i).test(name) && isNaN(parseFloat(value))) + ) { + delete styles[name]; + } + } + + return styles; +} + +function styleDifference(oldStyle, newStyle) { + var diff = { _: 0 }, // http://dev.jquery.com/ticket/5459 + name; + + for (name in newStyle) { + if (oldStyle[name] != newStyle[name]) { + diff[name] = newStyle[name]; + } + } + + return diff; +} + +$.effects.animateClass = function(value, duration, easing, callback) { + if ($.isFunction(easing)) { + callback = easing; + easing = null; + } + + return this.queue('fx', function() { + var that = $(this), + originalStyleAttr = that.attr('style') || ' ', + originalStyle = filterStyles(getElementStyles.call(this)), + newStyle, + className = that.attr('className'); + + $.each(classAnimationActions, function(i, action) { + if (value[action]) { + that[action + 'Class'](value[action]); + } + }); + newStyle = filterStyles(getElementStyles.call(this)); + that.attr('className', className); + + that.animate(styleDifference(originalStyle, newStyle), duration, easing, function() { + $.each(classAnimationActions, function(i, action) { + if (value[action]) { that[action + 'Class'](value[action]); } + }); + // work around bug in IE by clearing the cssText before setting it + if (typeof that.attr('style') == 'object') { + that.attr('style').cssText = ''; + that.attr('style').cssText = originalStyleAttr; + } else { + that.attr('style', originalStyleAttr); + } + if (callback) { callback.apply(this, arguments); } + }); + + // $.animate adds a function to the end of the queue + // but we want it at the front + var queue = $.queue(this), + anim = queue.splice(queue.length - 1, 1)[0]; + queue.splice(1, 0, anim); + $.dequeue(this); + }); +}; + +$.fn.extend({ + _addClass: $.fn.addClass, + addClass: function(classNames, speed, easing, callback) { + return speed ? $.effects.animateClass.apply(this, [{ add: classNames },speed,easing,callback]) : this._addClass(classNames); + }, + + _removeClass: $.fn.removeClass, + removeClass: function(classNames,speed,easing,callback) { + return speed ? $.effects.animateClass.apply(this, [{ remove: classNames },speed,easing,callback]) : this._removeClass(classNames); + }, + + _toggleClass: $.fn.toggleClass, + toggleClass: function(classNames, force, speed, easing, callback) { + if ( typeof force == "boolean" || force === undefined ) { + if ( !speed ) { + // without speed parameter; + return this._toggleClass(classNames, force); + } else { + return $.effects.animateClass.apply(this, [(force?{add:classNames}:{remove:classNames}),speed,easing,callback]); + } + } else { + // without switch parameter; + return $.effects.animateClass.apply(this, [{ toggle: classNames },force,speed,easing]); + } + }, + + switchClass: function(remove,add,speed,easing,callback) { + return $.effects.animateClass.apply(this, [{ add: add, remove: remove },speed,easing,callback]); + } +}); + + + +/******************************************************************************/ +/*********************************** EFFECTS **********************************/ +/******************************************************************************/ + +$.extend($.effects, { + version: "1.8.11", + + // Saves a set of properties in a data storage + save: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.data("ec.storage."+set[i], element[0].style[set[i]]); + } + }, + + // Restores a set of previously saved properties from a data storage + restore: function(element, set) { + for(var i=0; i < set.length; i++) { + if(set[i] !== null) element.css(set[i], element.data("ec.storage."+set[i])); + } + }, + + setMode: function(el, mode) { + if (mode == 'toggle') mode = el.is(':hidden') ? 'show' : 'hide'; // Set for toggle + return mode; + }, + + getBaseline: function(origin, original) { // Translates a [top,left] array into a baseline value + // this should be a little more flexible in the future to handle a string & hash + var y, x; + switch (origin[0]) { + case 'top': y = 0; break; + case 'middle': y = 0.5; break; + case 'bottom': y = 1; break; + default: y = origin[0] / original.height; + }; + switch (origin[1]) { + case 'left': x = 0; break; + case 'center': x = 0.5; break; + case 'right': x = 1; break; + default: x = origin[1] / original.width; + }; + return {x: x, y: y}; + }, + + // Wraps the element around a wrapper that copies position properties + createWrapper: function(element) { + + // if the element is already wrapped, return it + if (element.parent().is('.ui-effects-wrapper')) { + return element.parent(); + } + + // wrap the element + var props = { + width: element.outerWidth(true), + height: element.outerHeight(true), + 'float': element.css('float') + }, + wrapper = $('
    ') + .addClass('ui-effects-wrapper') + .css({ + fontSize: '100%', + background: 'transparent', + border: 'none', + margin: 0, + padding: 0 + }); + + element.wrap(wrapper); + wrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually loose the reference to the wrapped element + + // transfer positioning properties to the wrapper + if (element.css('position') == 'static') { + wrapper.css({ position: 'relative' }); + element.css({ position: 'relative' }); + } else { + $.extend(props, { + position: element.css('position'), + zIndex: element.css('z-index') + }); + $.each(['top', 'left', 'bottom', 'right'], function(i, pos) { + props[pos] = element.css(pos); + if (isNaN(parseInt(props[pos], 10))) { + props[pos] = 'auto'; + } + }); + element.css({position: 'relative', top: 0, left: 0, right: 'auto', bottom: 'auto' }); + } + + return wrapper.css(props).show(); + }, + + removeWrapper: function(element) { + if (element.parent().is('.ui-effects-wrapper')) + return element.parent().replaceWith(element); + return element; + }, + + setTransition: function(element, list, factor, value) { + value = value || {}; + $.each(list, function(i, x){ + unit = element.cssUnit(x); + if (unit[0] > 0) value[x] = unit[0] * factor + unit[1]; + }); + return value; + } +}); + + +function _normalizeArguments(effect, options, speed, callback) { + // shift params for method overloading + if (typeof effect == 'object') { + callback = options; + speed = null; + options = effect; + effect = options.effect; + } + if ($.isFunction(options)) { + callback = options; + speed = null; + options = {}; + } + if (typeof options == 'number' || $.fx.speeds[options]) { + callback = speed; + speed = options; + options = {}; + } + if ($.isFunction(speed)) { + callback = speed; + speed = null; + } + + options = options || {}; + + speed = speed || options.duration; + speed = $.fx.off ? 0 : typeof speed == 'number' + ? speed : speed in $.fx.speeds ? $.fx.speeds[speed] : $.fx.speeds._default; + + callback = callback || options.complete; + + return [effect, options, speed, callback]; +} + +function standardSpeed( speed ) { + // valid standard speeds + if ( !speed || typeof speed === "number" || $.fx.speeds[ speed ] ) { + return true; + } + + // invalid strings - treat as "normal" speed + if ( typeof speed === "string" && !$.effects[ speed ] ) { + return true; + } + + return false; +} + +$.fn.extend({ + effect: function(effect, options, speed, callback) { + var args = _normalizeArguments.apply(this, arguments), + // TODO: make effects take actual parameters instead of a hash + args2 = { + options: args[1], + duration: args[2], + callback: args[3] + }, + mode = args2.options.mode, + effectMethod = $.effects[effect]; + + if ( $.fx.off || !effectMethod ) { + // delegate to the original method (e.g., .show()) if possible + if ( mode ) { + return this[ mode ]( args2.duration, args2.callback ); + } else { + return this.each(function() { + if ( args2.callback ) { + args2.callback.call( this ); + } + }); + } + } + + return effectMethod.call(this, args2); + }, + + _show: $.fn.show, + show: function(speed) { + if ( standardSpeed( speed ) ) { + return this._show.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'show'; + return this.effect.apply(this, args); + } + }, + + _hide: $.fn.hide, + hide: function(speed) { + if ( standardSpeed( speed ) ) { + return this._hide.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'hide'; + return this.effect.apply(this, args); + } + }, + + // jQuery core overloads toggle and creates _toggle + __toggle: $.fn.toggle, + toggle: function(speed) { + if ( standardSpeed( speed ) || typeof speed === "boolean" || $.isFunction( speed ) ) { + return this.__toggle.apply(this, arguments); + } else { + var args = _normalizeArguments.apply(this, arguments); + args[1].mode = 'toggle'; + return this.effect.apply(this, args); + } + }, + + // helper functions + cssUnit: function(key) { + var style = this.css(key), val = []; + $.each( ['em','px','%','pt'], function(i, unit){ + if(style.indexOf(unit) > 0) + val = [parseFloat(style), unit]; + }); + return val; + } +}); + + + +/******************************************************************************/ +/*********************************** EASING ***********************************/ +/******************************************************************************/ + +/* + * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/ + * + * Uses the built in easing capabilities added In jQuery 1.1 + * to offer multiple easing options + * + * TERMS OF USE - jQuery Easing + * + * Open source under the BSD License. + * + * Copyright 2008 George McGinley Smith + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * +*/ + +// t: current time, b: begInnIng value, c: change In value, d: duration +$.easing.jswing = $.easing.swing; + +$.extend($.easing, +{ + def: 'easeOutQuad', + swing: function (x, t, b, c, d) { + //alert($.easing.default); + return $.easing[$.easing.def](x, t, b, c, d); + }, + easeInQuad: function (x, t, b, c, d) { + return c*(t/=d)*t + b; + }, + easeOutQuad: function (x, t, b, c, d) { + return -c *(t/=d)*(t-2) + b; + }, + easeInOutQuad: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t + b; + return -c/2 * ((--t)*(t-2) - 1) + b; + }, + easeInCubic: function (x, t, b, c, d) { + return c*(t/=d)*t*t + b; + }, + easeOutCubic: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t + 1) + b; + }, + easeInOutCubic: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t + b; + return c/2*((t-=2)*t*t + 2) + b; + }, + easeInQuart: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t + b; + }, + easeOutQuart: function (x, t, b, c, d) { + return -c * ((t=t/d-1)*t*t*t - 1) + b; + }, + easeInOutQuart: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t + b; + return -c/2 * ((t-=2)*t*t*t - 2) + b; + }, + easeInQuint: function (x, t, b, c, d) { + return c*(t/=d)*t*t*t*t + b; + }, + easeOutQuint: function (x, t, b, c, d) { + return c*((t=t/d-1)*t*t*t*t + 1) + b; + }, + easeInOutQuint: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; + return c/2*((t-=2)*t*t*t*t + 2) + b; + }, + easeInSine: function (x, t, b, c, d) { + return -c * Math.cos(t/d * (Math.PI/2)) + c + b; + }, + easeOutSine: function (x, t, b, c, d) { + return c * Math.sin(t/d * (Math.PI/2)) + b; + }, + easeInOutSine: function (x, t, b, c, d) { + return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; + }, + easeInExpo: function (x, t, b, c, d) { + return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; + }, + easeOutExpo: function (x, t, b, c, d) { + return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; + }, + easeInOutExpo: function (x, t, b, c, d) { + if (t==0) return b; + if (t==d) return b+c; + if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b; + return c/2 * (-Math.pow(2, -10 * --t) + 2) + b; + }, + easeInCirc: function (x, t, b, c, d) { + return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; + }, + easeOutCirc: function (x, t, b, c, d) { + return c * Math.sqrt(1 - (t=t/d-1)*t) + b; + }, + easeInOutCirc: function (x, t, b, c, d) { + if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b; + return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b; + }, + easeInElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + }, + easeOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3; + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b; + }, + easeInOutElastic: function (x, t, b, c, d) { + var s=1.70158;var p=0;var a=c; + if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5); + if (a < Math.abs(c)) { a=c; var s=p/4; } + else var s = p/(2*Math.PI) * Math.asin (c/a); + if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b; + return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b; + }, + easeInBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*(t/=d)*t*((s+1)*t - s) + b; + }, + easeOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b; + }, + easeInOutBack: function (x, t, b, c, d, s) { + if (s == undefined) s = 1.70158; + if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b; + return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b; + }, + easeInBounce: function (x, t, b, c, d) { + return c - $.easing.easeOutBounce (x, d-t, 0, c, d) + b; + }, + easeOutBounce: function (x, t, b, c, d) { + if ((t/=d) < (1/2.75)) { + return c*(7.5625*t*t) + b; + } else if (t < (2/2.75)) { + return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; + } else if (t < (2.5/2.75)) { + return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; + } else { + return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; + } + }, + easeInOutBounce: function (x, t, b, c, d) { + if (t < d/2) return $.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b; + return $.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b; + } +}); + +/* + * + * TERMS OF USE - EASING EQUATIONS + * + * Open source under the BSD License. + * + * Copyright 2001 Robert Penner + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * Neither the name of the author nor the names of contributors may be used to endorse + * or promote products derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.drop.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.drop.js new file mode 100644 index 00000000000..c61cc345b28 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.drop.js @@ -0,0 +1,50 @@ +/* + * jQuery UI Effects Drop 1.8.11 + * + * Copyright 2011, 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/Drop + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.drop = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right','opacity']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) / 2 : el.outerWidth({margin:true}) / 2); + if (mode == 'show') el.css('opacity', 0).css(ref, motion == 'pos' ? -distance : distance); // Shift + + // Animation + var animation = {opacity: mode == 'show' ? 1 : 0}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.explode.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.explode.js new file mode 100644 index 00000000000..785a6bb5bbf --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.explode.js @@ -0,0 +1,79 @@ +/* + * jQuery UI Effects Explode 1.8.11 + * + * Copyright 2011, 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/Explode + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.explode = function(o) { + + return this.queue(function() { + + var rows = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + var cells = o.options.pieces ? Math.round(Math.sqrt(o.options.pieces)) : 3; + + o.options.mode = o.options.mode == 'toggle' ? ($(this).is(':visible') ? 'hide' : 'show') : o.options.mode; + var el = $(this).show().css('visibility', 'hidden'); + var offset = el.offset(); + + //Substract the margins - not fixing the problem yet. + offset.top -= parseInt(el.css("marginTop"),10) || 0; + offset.left -= parseInt(el.css("marginLeft"),10) || 0; + + var width = el.outerWidth(true); + var height = el.outerHeight(true); + + for(var i=0;i') + .css({ + position: 'absolute', + visibility: 'visible', + left: -j*(width/cells), + top: -i*(height/rows) + }) + .parent() + .addClass('ui-effects-explode') + .css({ + position: 'absolute', + overflow: 'hidden', + width: width/cells, + height: height/rows, + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? (j-Math.floor(cells/2))*(width/cells) : 0), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? (i-Math.floor(rows/2))*(height/rows) : 0), + opacity: o.options.mode == 'show' ? 0 : 1 + }).animate({ + left: offset.left + j*(width/cells) + (o.options.mode == 'show' ? 0 : (j-Math.floor(cells/2))*(width/cells)), + top: offset.top + i*(height/rows) + (o.options.mode == 'show' ? 0 : (i-Math.floor(rows/2))*(height/rows)), + opacity: o.options.mode == 'show' ? 1 : 0 + }, o.duration || 500); + } + } + + // Set a timeout, to call the callback approx. when the other animations have finished + setTimeout(function() { + + o.options.mode == 'show' ? el.css({ visibility: 'visible' }) : el.css({ visibility: 'visible' }).hide(); + if(o.callback) o.callback.apply(el[0]); // Callback + el.dequeue(); + + $('div.ui-effects-explode').remove(); + + }, o.duration || 500); + + + }); + +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.fade.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.fade.js new file mode 100644 index 00000000000..e87365902b8 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.fade.js @@ -0,0 +1,32 @@ +/* + * jQuery UI Effects Fade 1.8.11 + * + * Copyright 2011, 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/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.fade = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'hide'); + + elem.animate({ opacity: mode }, { + queue: false, + duration: o.duration, + easing: o.options.easing, + complete: function() { + (o.callback && o.callback.apply(this, arguments)); + elem.dequeue(); + } + }); + }); +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.fold.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.fold.js new file mode 100644 index 00000000000..4858b143818 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.fold.js @@ -0,0 +1,56 @@ +/* + * jQuery UI Effects Fold 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.effects.fold = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'hide'); // Set Mode + var size = o.options.size || 15; // Default fold size + var horizFirst = !(!o.options.horizFirst); // Ensure a boolean value + var duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2; + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + var wrapper = $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var widthFirst = ((mode == 'show') != horizFirst); + var ref = widthFirst ? ['width', 'height'] : ['height', 'width']; + var distance = widthFirst ? [wrapper.width(), wrapper.height()] : [wrapper.height(), wrapper.width()]; + var percent = /([0-9]+)%/.exec(size); + if(percent) size = parseInt(percent[1],10) / 100 * distance[mode == 'hide' ? 0 : 1]; + if(mode == 'show') wrapper.css(horizFirst ? {height: 0, width: size} : {height: size, width: 0}); // Shift + + // Animation + var animation1 = {}, animation2 = {}; + animation1[ref[0]] = mode == 'show' ? distance[0] : size; + animation2[ref[1]] = mode == 'show' ? distance[1] : 0; + + // Animate + wrapper.animate(animation1, duration, o.options.easing) + .animate(animation2, duration, o.options.easing, function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(el[0], arguments); // Callback + el.dequeue(); + }); + + }); + +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.highlight.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.highlight.js new file mode 100644 index 00000000000..5552492dcdf --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.highlight.js @@ -0,0 +1,50 @@ +/* + * jQuery UI Effects Highlight 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.effects.highlight = function(o) { + return this.queue(function() { + var elem = $(this), + props = ['backgroundImage', 'backgroundColor', 'opacity'], + mode = $.effects.setMode(elem, o.options.mode || 'show'), + animation = { + backgroundColor: elem.css('backgroundColor') + }; + + if (mode == 'hide') { + animation.opacity = 0; + } + + $.effects.save(elem, props); + elem + .show() + .css({ + backgroundImage: 'none', + backgroundColor: o.options.color || '#ffff99' + }) + .animate(animation, { + queue: false, + duration: o.duration, + easing: o.options.easing, + complete: function() { + (mode == 'hide' && elem.hide()); + $.effects.restore(elem, props); + (mode == 'show' && !$.support.opacity && this.style.removeAttribute('filter')); + (o.callback && o.callback.apply(this, arguments)); + elem.dequeue(); + } + }); + }); +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.pulsate.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.pulsate.js new file mode 100644 index 00000000000..8a025e7f786 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.pulsate.js @@ -0,0 +1,51 @@ +/* + * jQuery UI Effects Pulsate 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.effects.pulsate = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'show'); + times = ((o.options.times || 5) * 2) - 1; + duration = o.duration ? o.duration / 2 : $.fx.speeds._default / 2, + isVisible = elem.is(':visible'), + animateTo = 0; + + if (!isVisible) { + elem.css('opacity', 0).show(); + animateTo = 1; + } + + if ((mode == 'hide' && isVisible) || (mode == 'show' && !isVisible)) { + times--; + } + + for (var i = 0; i < times; i++) { + elem.animate({ opacity: animateTo }, duration, o.options.easing); + animateTo = (animateTo + 1) % 2; + } + + elem.animate({ opacity: animateTo }, duration, o.options.easing, function() { + if (animateTo == 0) { + elem.hide(); + } + (o.callback && o.callback.apply(this, arguments)); + }); + + elem + .queue('fx', function() { elem.dequeue(); }) + .dequeue(); + }); +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.scale.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.scale.js new file mode 100644 index 00000000000..45023f2541f --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.scale.js @@ -0,0 +1,178 @@ +/* + * jQuery UI Effects Scale 1.8.11 + * + * Copyright 2011, 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/Scale + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.puff = function(o) { + return this.queue(function() { + var elem = $(this), + mode = $.effects.setMode(elem, o.options.mode || 'hide'), + percent = parseInt(o.options.percent, 10) || 150, + factor = percent / 100, + original = { height: elem.height(), width: elem.width() }; + + $.extend(o.options, { + fade: true, + mode: mode, + percent: mode == 'hide' ? percent : 100, + from: mode == 'hide' + ? original + : { + height: original.height * factor, + width: original.width * factor + } + }); + + elem.effect('scale', o.options, o.duration, o.callback); + elem.dequeue(); + }); +}; + +$.effects.scale = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this); + + // Set options + var options = $.extend(true, {}, o.options); + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var percent = parseInt(o.options.percent,10) || (parseInt(o.options.percent,10) == 0 ? 0 : (mode == 'hide' ? 0 : 100)); // Set default scaling percent + var direction = o.options.direction || 'both'; // Set default axis + var origin = o.options.origin; // The origin of the scaling + if (mode != 'effect') { // Set default origin and restore for show/hide + options.origin = origin || ['middle','center']; + options.restore = true; + } + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || (mode == 'show' ? {height: 0, width: 0} : original); // Default from state + + // Adjust + var factor = { // Set scaling factor + y: direction != 'horizontal' ? (percent / 100) : 1, + x: direction != 'vertical' ? (percent / 100) : 1 + }; + el.to = {height: original.height * factor.y, width: original.width * factor.x}; // Set to state + + if (o.options.fade) { // Fade option to support puff + if (mode == 'show') {el.from.opacity = 0; el.to.opacity = 1;}; + if (mode == 'hide') {el.from.opacity = 1; el.to.opacity = 0;}; + }; + + // Animation + options.from = el.from; options.to = el.to; options.mode = mode; + + // Animate + el.effect('size', options, o.duration, o.callback); + el.dequeue(); + }); + +}; + +$.effects.size = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right','width','height','overflow','opacity']; + var props1 = ['position','top','bottom','left','right','overflow','opacity']; // Always restore + var props2 = ['width','height','overflow']; // Copy for children + var cProps = ['fontSize']; + var vProps = ['borderTopWidth', 'borderBottomWidth', 'paddingTop', 'paddingBottom']; + var hProps = ['borderLeftWidth', 'borderRightWidth', 'paddingLeft', 'paddingRight']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var restore = o.options.restore || false; // Default restore + var scale = o.options.scale || 'both'; // Default scale mode + var origin = o.options.origin; // The origin of the sizing + var original = {height: el.height(), width: el.width()}; // Save original + el.from = o.options.from || original; // Default from state + el.to = o.options.to || original; // Default to state + // Adjust + if (origin) { // Calculate baseline shifts + var baseline = $.effects.getBaseline(origin, original); + el.from.top = (original.height - el.from.height) * baseline.y; + el.from.left = (original.width - el.from.width) * baseline.x; + el.to.top = (original.height - el.to.height) * baseline.y; + el.to.left = (original.width - el.to.width) * baseline.x; + }; + var factor = { // Set scaling factor + from: {y: el.from.height / original.height, x: el.from.width / original.width}, + to: {y: el.to.height / original.height, x: el.to.width / original.width} + }; + if (scale == 'box' || scale == 'both') { // Scale the css box + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(vProps); + el.from = $.effects.setTransition(el, vProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, vProps, factor.to.y, el.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + props = props.concat(hProps); + el.from = $.effects.setTransition(el, hProps, factor.from.x, el.from); + el.to = $.effects.setTransition(el, hProps, factor.to.x, el.to); + }; + }; + if (scale == 'content' || scale == 'both') { // Scale the content + if (factor.from.y != factor.to.y) { // Vertical props scaling + props = props.concat(cProps); + el.from = $.effects.setTransition(el, cProps, factor.from.y, el.from); + el.to = $.effects.setTransition(el, cProps, factor.to.y, el.to); + }; + }; + $.effects.save(el, restore ? props : props1); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + el.css('overflow','hidden').css(el.from); // Shift + + // Animate + if (scale == 'content' || scale == 'both') { // Scale the children + vProps = vProps.concat(['marginTop','marginBottom']).concat(cProps); // Add margins/font-size + hProps = hProps.concat(['marginLeft','marginRight']); // Add margins + props2 = props.concat(vProps).concat(hProps); // Concat + el.find("*[width]").each(function(){ + child = $(this); + if (restore) $.effects.save(child, props2); + var c_original = {height: child.height(), width: child.width()}; // Save original + child.from = {height: c_original.height * factor.from.y, width: c_original.width * factor.from.x}; + child.to = {height: c_original.height * factor.to.y, width: c_original.width * factor.to.x}; + if (factor.from.y != factor.to.y) { // Vertical props scaling + child.from = $.effects.setTransition(child, vProps, factor.from.y, child.from); + child.to = $.effects.setTransition(child, vProps, factor.to.y, child.to); + }; + if (factor.from.x != factor.to.x) { // Horizontal props scaling + child.from = $.effects.setTransition(child, hProps, factor.from.x, child.from); + child.to = $.effects.setTransition(child, hProps, factor.to.x, child.to); + }; + child.css(child.from); // Shift children + child.animate(child.to, o.duration, o.options.easing, function(){ + if (restore) $.effects.restore(child, props2); // Restore children + }); // Animate children + }); + }; + + // Animate + el.animate(el.to, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if (el.to.opacity === 0) { + el.css('opacity', el.from.opacity); + } + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, restore ? props : props1); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.shake.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.shake.js new file mode 100644 index 00000000000..d5599dd94e0 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.shake.js @@ -0,0 +1,57 @@ +/* + * jQuery UI Effects Shake 1.8.11 + * + * Copyright 2011, 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/Shake + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.shake = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'effect'); // Set Mode + var direction = o.options.direction || 'left'; // Default direction + var distance = o.options.distance || 20; // Default distance + var times = o.options.times || 3; // Default # of times + var speed = o.duration || o.options.duration || 140; // Default speed per shake + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + + // Animation + var animation = {}, animation1 = {}, animation2 = {}; + animation[ref] = (motion == 'pos' ? '-=' : '+=') + distance; + animation1[ref] = (motion == 'pos' ? '+=' : '-=') + distance * 2; + animation2[ref] = (motion == 'pos' ? '-=' : '+=') + distance * 2; + + // Animate + el.animate(animation, speed, o.options.easing); + for (var i = 1; i < times; i++) { // Shakes + el.animate(animation1, speed, o.options.easing).animate(animation2, speed, o.options.easing); + }; + el.animate(animation1, speed, o.options.easing). + animate(animation, speed / 2, o.options.easing, function(){ // Last shake + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + }); + el.queue('fx', function() { el.dequeue(); }); + el.dequeue(); + }); + +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.slide.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.slide.js new file mode 100644 index 00000000000..91183777feb --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.slide.js @@ -0,0 +1,50 @@ +/* + * jQuery UI Effects Slide 1.8.11 + * + * Copyright 2011, 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/Slide + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.slide = function(o) { + + return this.queue(function() { + + // Create element + var el = $(this), props = ['position','top','bottom','left','right']; + + // Set options + var mode = $.effects.setMode(el, o.options.mode || 'show'); // Set Mode + var direction = o.options.direction || 'left'; // Default Direction + + // Adjust + $.effects.save(el, props); el.show(); // Save & Show + $.effects.createWrapper(el).css({overflow:'hidden'}); // Create Wrapper + var ref = (direction == 'up' || direction == 'down') ? 'top' : 'left'; + var motion = (direction == 'up' || direction == 'left') ? 'pos' : 'neg'; + var distance = o.options.distance || (ref == 'top' ? el.outerHeight({margin:true}) : el.outerWidth({margin:true})); + if (mode == 'show') el.css(ref, motion == 'pos' ? (isNaN(distance) ? "-" + distance : -distance) : distance); // Shift + + // Animation + var animation = {}; + animation[ref] = (mode == 'show' ? (motion == 'pos' ? '+=' : '-=') : (motion == 'pos' ? '-=' : '+=')) + distance; + + // Animate + el.animate(animation, { queue: false, duration: o.duration, easing: o.options.easing, complete: function() { + if(mode == 'hide') el.hide(); // Hide + $.effects.restore(el, props); $.effects.removeWrapper(el); // Restore + if(o.callback) o.callback.apply(this, arguments); // Callback + el.dequeue(); + }}); + + }); + +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.transfer.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.transfer.js new file mode 100644 index 00000000000..4a5bdf691b2 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.effects.transfer.js @@ -0,0 +1,45 @@ +/* + * jQuery UI Effects Transfer 1.8.11 + * + * Copyright 2011, 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/Transfer + * + * Depends: + * jquery.effects.core.js + */ +(function( $, undefined ) { + +$.effects.transfer = function(o) { + return this.queue(function() { + var elem = $(this), + target = $(o.options.to), + endPosition = target.offset(), + animation = { + top: endPosition.top, + left: endPosition.left, + height: target.innerHeight(), + width: target.innerWidth() + }, + startPosition = elem.offset(), + transfer = $('
    ') + .appendTo(document.body) + .addClass(o.options.className) + .css({ + top: startPosition.top, + left: startPosition.left, + height: elem.innerHeight(), + width: elem.innerWidth(), + position: 'absolute' + }) + .animate(animation, o.duration, o.options.easing, function() { + transfer.remove(); + (o.callback && o.callback.apply(elem[0], arguments)); + elem.dequeue(); + }); + }); +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.accordion.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.accordion.js new file mode 100644 index 00000000000..898160a1ed8 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.accordion.js @@ -0,0 +1,611 @@ +/* + * jQuery UI Accordion 1.8.11 + * + * Copyright 2011, 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/Accordion + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function( $, undefined ) { + +$.widget( "ui.accordion", { + options: { + active: 0, + animated: "slide", + autoHeight: true, + clearStyle: false, + collapsible: false, + event: "click", + fillSpace: false, + header: "> 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 self = this, + options = self.options; + + self.running = 0; + + self.element + .addClass( "ui-accordion ui-widget ui-helper-reset" ) + // in lack of child-selectors in CSS + // we need to mark top-LIs in a UL-accordion for some IE-fix + .children( "li" ) + .addClass( "ui-accordion-li-fix" ); + + self.headers = self.element.find( options.header ) + .addClass( "ui-accordion-header ui-helper-reset ui-state-default ui-corner-all" ) + .bind( "mouseenter.accordion", function() { + if ( options.disabled ) { + return; + } + $( this ).addClass( "ui-state-hover" ); + }) + .bind( "mouseleave.accordion", function() { + if ( options.disabled ) { + return; + } + $( this ).removeClass( "ui-state-hover" ); + }) + .bind( "focus.accordion", function() { + if ( options.disabled ) { + return; + } + $( this ).addClass( "ui-state-focus" ); + }) + .bind( "blur.accordion", function() { + if ( options.disabled ) { + return; + } + $( this ).removeClass( "ui-state-focus" ); + }); + + self.headers.next() + .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" ); + + if ( options.navigation ) { + var current = self.element.find( "a" ).filter( options.navigationFilter ).eq( 0 ); + if ( current.length ) { + var header = current.closest( ".ui-accordion-header" ); + if ( header.length ) { + // anchor within header + self.active = header; + } else { + // anchor within content + self.active = current.closest( ".ui-accordion-content" ).prev(); + } + } + } + + self.active = self._findActive( self.active || options.active ) + .addClass( "ui-state-default ui-state-active" ) + .toggleClass( "ui-corner-all" ) + .toggleClass( "ui-corner-top" ); + self.active.next().addClass( "ui-accordion-content-active" ); + + self._createIcons(); + self.resize(); + + // ARIA + self.element.attr( "role", "tablist" ); + + self.headers + .attr( "role", "tab" ) + .bind( "keydown.accordion", function( event ) { + return self._keydown( event ); + }) + .next() + .attr( "role", "tabpanel" ); + + self.headers + .not( self.active || "" ) + .attr({ + "aria-expanded": "false", + "aria-selected": "false", + tabIndex: -1 + }) + .next() + .hide(); + + // make sure at least one header is in the tab order + if ( !self.active.length ) { + self.headers.eq( 0 ).attr( "tabIndex", 0 ); + } else { + self.active + .attr({ + "aria-expanded": "true", + "aria-selected": "true", + tabIndex: 0 + }); + } + + // only need links in tab order for Safari + if ( !$.browser.safari ) { + self.headers.find( "a" ).attr( "tabIndex", -1 ); + } + + if ( options.event ) { + self.headers.bind( options.event.split(" ").join(".accordion ") + ".accordion", function(event) { + self._clickHandler.call( self, event, this ); + event.preventDefault(); + }); + } + }, + + _createIcons: function() { + var options = this.options; + if ( options.icons ) { + $( "" ) + .addClass( "ui-icon " + options.icons.header ) + .prependTo( this.headers ); + this.active.children( ".ui-icon" ) + .toggleClass(options.icons.header) + .toggleClass(options.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 options = 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( "aria-selected" ) + .removeAttr( "tabIndex" ); + + this.headers.find( "a" ).removeAttr( "tabIndex" ); + this._destroyIcons(); + var contents = 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 ( options.autoHeight || options.fillHeight ) { + contents.css( "height", "" ); + } + + return $.Widget.prototype.destroy.call( this ); + }, + + _setOption: function( key, value ) { + $.Widget.prototype._setOption.apply( this, arguments ); + + if ( key == "active" ) { + this.activate( value ); + } + if ( key == "icons" ) { + this._destroyIcons(); + if ( value ) { + this._createIcons(); + } + } + // #5332 - opacity doesn't cascade to positioned elements in IE + // so we need to add the disabled class to the headers and panels + if ( key == "disabled" ) { + this.headers.add(this.headers.next()) + [ value ? "addClass" : "removeClass" ]( + "ui-accordion-disabled ui-state-disabled" ); + } + }, + + _keydown: function( event ) { + if ( this.options.disabled || event.altKey || event.ctrlKey ) { + return; + } + + var keyCode = $.ui.keyCode, + length = this.headers.length, + currentIndex = this.headers.index( event.target ), + toFocus = false; + + switch ( event.keyCode ) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[ ( currentIndex + 1 ) % length ]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._clickHandler( { target: event.target }, event.target ); + event.preventDefault(); + } + + if ( toFocus ) { + $( event.target ).attr( "tabIndex", -1 ); + $( toFocus ).attr( "tabIndex", 0 ); + toFocus.focus(); + return false; + } + + return true; + }, + + resize: function() { + var options = this.options, + maxHeight; + + if ( options.fillSpace ) { + if ( $.browser.msie ) { + var defOverflow = this.element.parent().css( "overflow" ); + this.element.parent().css( "overflow", "hidden"); + } + maxHeight = this.element.parent().height(); + if ($.browser.msie) { + this.element.parent().css( "overflow", defOverflow ); + } + + this.headers.each(function() { + maxHeight -= $( this ).outerHeight( true ); + }); + + this.headers.next() + .each(function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + }) + .css( "overflow", "auto" ); + } else if ( options.autoHeight ) { + maxHeight = 0; + this.headers.next() + .each(function() { + maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() ); + }) + .height( maxHeight ); + } + + return this; + }, + + activate: function( index ) { + // TODO this gets called on init, changing the option without an explicit call for that + this.options.active = index; + // call clickHandler with custom event + var active = this._findActive( index )[ 0 ]; + this._clickHandler( { target: active }, active ); + + return this; + }, + + _findActive: function( selector ) { + return selector + ? typeof selector === "number" + ? this.headers.filter( ":eq(" + selector + ")" ) + : this.headers.not( this.headers.not( selector ) ) + : selector === false + ? $( [] ) + : this.headers.filter( ":eq(0)" ); + }, + + // TODO isn't event.target enough? why the separate target argument? + _clickHandler: function( event, target ) { + var options = this.options; + if ( options.disabled ) { + return; + } + + // called only when using activate(false) to close all parts programmatically + if ( !event.target ) { + if ( !options.collapsible ) { + return; + } + this.active + .removeClass( "ui-state-active ui-corner-top" ) + .addClass( "ui-state-default ui-corner-all" ) + .children( ".ui-icon" ) + .removeClass( options.icons.headerSelected ) + .addClass( options.icons.header ); + this.active.next().addClass( "ui-accordion-content-active" ); + var toHide = this.active.next(), + data = { + options: options, + newHeader: $( [] ), + oldHeader: options.active, + newContent: $( [] ), + oldContent: toHide + }, + toShow = ( this.active = $( [] ) ); + this._toggle( toShow, toHide, data ); + return; + } + + // get the click target + var clicked = $( event.currentTarget || target ), + clickedIsActive = clicked[0] === this.active[0]; + + // TODO the option is changed, is that correct? + // TODO if it is correct, shouldn't that happen after determining that the click is valid? + options.active = options.collapsible && clickedIsActive ? + false : + this.headers.index( clicked ); + + // if animations are still active, or the active header is the target, ignore click + if ( this.running || ( !options.collapsible && clickedIsActive ) ) { + return; + } + + // find elements to show and hide + var active = this.active, + toShow = clicked.next(), + toHide = this.active.next(), + data = { + options: options, + newHeader: clickedIsActive && options.collapsible ? $([]) : clicked, + oldHeader: this.active, + newContent: clickedIsActive && options.collapsible ? $([]) : toShow, + oldContent: toHide + }, + down = this.headers.index( this.active[0] ) > this.headers.index( clicked[0] ); + + // when the call to ._toggle() comes after the class changes + // it causes a very odd bug in IE 8 (see #6720) + this.active = clickedIsActive ? $([]) : clicked; + this._toggle( toShow, toHide, data, clickedIsActive, down ); + + // switch classes + active + .removeClass( "ui-state-active ui-corner-top" ) + .addClass( "ui-state-default ui-corner-all" ) + .children( ".ui-icon" ) + .removeClass( options.icons.headerSelected ) + .addClass( options.icons.header ); + if ( !clickedIsActive ) { + clicked + .removeClass( "ui-state-default ui-corner-all" ) + .addClass( "ui-state-active ui-corner-top" ) + .children( ".ui-icon" ) + .removeClass( options.icons.header ) + .addClass( options.icons.headerSelected ); + clicked + .next() + .addClass( "ui-accordion-content-active" ); + } + + return; + }, + + _toggle: function( toShow, toHide, data, clickedIsActive, down ) { + var self = this, + options = self.options; + + self.toShow = toShow; + self.toHide = toHide; + self.data = data; + + var complete = function() { + if ( !self ) { + return; + } + return self._completed.apply( self, arguments ); + }; + + // trigger changestart event + self._trigger( "changestart", null, self.data ); + + // count elements to animate + self.running = toHide.size() === 0 ? toShow.size() : toHide.size(); + + if ( options.animated ) { + var animOptions = {}; + + if ( options.collapsible && clickedIsActive ) { + animOptions = { + toShow: $( [] ), + toHide: toHide, + complete: complete, + down: down, + autoHeight: options.autoHeight || options.fillSpace + }; + } else { + animOptions = { + toShow: toShow, + toHide: toHide, + complete: complete, + down: down, + autoHeight: options.autoHeight || options.fillSpace + }; + } + + if ( !options.proxied ) { + options.proxied = options.animated; + } + + if ( !options.proxiedDuration ) { + options.proxiedDuration = options.duration; + } + + options.animated = $.isFunction( options.proxied ) ? + options.proxied( animOptions ) : + options.proxied; + + options.duration = $.isFunction( options.proxiedDuration ) ? + options.proxiedDuration( animOptions ) : + options.proxiedDuration; + + var animations = $.ui.accordion.animations, + duration = options.duration, + easing = options.animated; + + if ( easing && !animations[ easing ] && !$.easing[ easing ] ) { + easing = "slide"; + } + if ( !animations[ easing ] ) { + animations[ easing ] = function( options ) { + this.slide( options, { + easing: easing, + duration: duration || 700 + }); + }; + } + + animations[ easing ]( animOptions ); + } else { + if ( options.collapsible && clickedIsActive ) { + toShow.toggle(); + } else { + toHide.hide(); + toShow.show(); + } + + complete( true ); + } + + // TODO assert that the blur and focus triggers are really necessary, remove otherwise + toHide.prev() + .attr({ + "aria-expanded": "false", + "aria-selected": "false", + tabIndex: -1 + }) + .blur(); + toShow.prev() + .attr({ + "aria-expanded": "true", + "aria-selected": "true", + tabIndex: 0 + }) + .focus(); + }, + + _completed: function( cancel ) { + this.running = cancel ? 0 : --this.running; + if ( this.running ) { + return; + } + + if ( this.options.clearStyle ) { + this.toShow.add( this.toHide ).css({ + height: "", + overflow: "" + }); + } + + // other classes are removed before the animation; this one needs to stay until completed + this.toHide.removeClass( "ui-accordion-content-active" ); + // Work around for rendering bug in IE (#5421) + if ( this.toHide.length ) { + this.toHide.parent()[0].className = this.toHide.parent()[0].className; + } + + this._trigger( "change", null, this.data ); + } +}); + +$.extend( $.ui.accordion, { + version: "1.8.11", + animations: { + slide: function( options, additions ) { + options = $.extend({ + easing: "swing", + duration: 300 + }, options, additions ); + if ( !options.toHide.size() ) { + options.toShow.animate({ + height: "show", + paddingTop: "show", + paddingBottom: "show" + }, options ); + return; + } + if ( !options.toShow.size() ) { + options.toHide.animate({ + height: "hide", + paddingTop: "hide", + paddingBottom: "hide" + }, options ); + return; + } + var overflow = options.toShow.css( "overflow" ), + percentDone = 0, + showProps = {}, + hideProps = {}, + fxAttrs = [ "height", "paddingTop", "paddingBottom" ], + originalWidth; + // fix width before calculating height of hidden element + var s = options.toShow; + originalWidth = s[0].style.width; + s.width( parseInt( s.parent().width(), 10 ) + - parseInt( s.css( "paddingLeft" ), 10 ) + - parseInt( s.css( "paddingRight" ), 10 ) + - ( parseInt( s.css( "borderLeftWidth" ), 10 ) || 0 ) + - ( parseInt( s.css( "borderRightWidth" ), 10) || 0 ) ); + + $.each( fxAttrs, function( i, prop ) { + hideProps[ prop ] = "hide"; + + var parts = ( "" + $.css( options.toShow[0], prop ) ).match( /^([\d+-.]+)(.*)$/ ); + showProps[ prop ] = { + value: parts[ 1 ], + unit: parts[ 2 ] || "px" + }; + }); + options.toShow.css({ height: 0, overflow: "hidden" }).show(); + options.toHide + .filter( ":hidden" ) + .each( options.complete ) + .end() + .filter( ":visible" ) + .animate( hideProps, { + step: function( now, settings ) { + // only calculate the percent when animating height + // IE gets very inconsistent results when animating elements + // with small values, which is common for padding + if ( settings.prop == "height" ) { + percentDone = ( settings.end - settings.start === 0 ) ? 0 : + ( settings.now - settings.start ) / ( settings.end - settings.start ); + } + + options.toShow[ 0 ].style[ settings.prop ] = + ( percentDone * showProps[ settings.prop ].value ) + + showProps[ settings.prop ].unit; + }, + duration: options.duration, + easing: options.easing, + complete: function() { + if ( !options.autoHeight ) { + options.toShow.css( "height", "" ); + } + options.toShow.css({ + width: originalWidth, + overflow: overflow + }); + options.complete(); + } + }); + }, + bounceslide: function( options ) { + this.slide( options, { + easing: options.down ? "easeOutBounce" : "swing", + duration: options.down ? 1000 : 200 + }); + } + } +}); + +})( jQuery ); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.autocomplete.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.autocomplete.js new file mode 100644 index 00000000000..93424831d26 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.autocomplete.js @@ -0,0 +1,612 @@ +/* + * jQuery UI Autocomplete 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +// used to prevent race conditions with remote data sources +var requestIndex = 0; + +$.widget( "ui.autocomplete", { + options: { + appendTo: "body", + autoFocus: false, + delay: 300, + minLength: 1, + position: { + my: "left top", + at: "left bottom", + collision: "none" + }, + source: null + }, + + pending: 0, + + _create: function() { + var self = this, + doc = this.element[ 0 ].ownerDocument, + suppressKeyPress; + + this.element + .addClass( "ui-autocomplete-input" ) + .attr( "autocomplete", "off" ) + // TODO verify these actually work as intended + .attr({ + role: "textbox", + "aria-autocomplete": "list", + "aria-haspopup": "true" + }) + .bind( "keydown.autocomplete", function( event ) { + if ( self.options.disabled || self.element.attr( "readonly" ) ) { + return; + } + + suppressKeyPress = false; + var keyCode = $.ui.keyCode; + switch( event.keyCode ) { + case keyCode.PAGE_UP: + self._move( "previousPage", event ); + break; + case keyCode.PAGE_DOWN: + self._move( "nextPage", event ); + break; + case keyCode.UP: + self._move( "previous", event ); + // prevent moving cursor to beginning of text field in some browsers + event.preventDefault(); + break; + case keyCode.DOWN: + self._move( "next", event ); + // prevent moving cursor to end of text field in some browsers + event.preventDefault(); + break; + case keyCode.ENTER: + case keyCode.NUMPAD_ENTER: + // when menu is open and has focus + if ( self.menu.active ) { + // #6055 - Opera still allows the keypress to occur + // which causes forms to submit + suppressKeyPress = true; + event.preventDefault(); + } + //passthrough - ENTER and TAB both select the current element + case keyCode.TAB: + if ( !self.menu.active ) { + return; + } + self.menu.select( event ); + break; + case keyCode.ESCAPE: + self.element.val( self.term ); + self.close( event ); + break; + default: + // keypress is triggered before the input value is changed + clearTimeout( self.searching ); + self.searching = setTimeout(function() { + // only search if the value has changed + if ( self.term != self.element.val() ) { + self.selectedItem = null; + self.search( null, event ); + } + }, self.options.delay ); + break; + } + }) + .bind( "keypress.autocomplete", function( event ) { + if ( suppressKeyPress ) { + suppressKeyPress = false; + event.preventDefault(); + } + }) + .bind( "focus.autocomplete", function() { + if ( self.options.disabled ) { + return; + } + + self.selectedItem = null; + self.previous = self.element.val(); + }) + .bind( "blur.autocomplete", function( event ) { + if ( self.options.disabled ) { + return; + } + + clearTimeout( self.searching ); + // clicks on the menu (or a button to trigger a search) will cause a blur event + self.closing = setTimeout(function() { + self.close( event ); + self._change( event ); + }, 150 ); + }); + this._initSource(); + this.response = function() { + return self._response.apply( self, arguments ); + }; + this.menu = $( "
      " ) + .addClass( "ui-autocomplete" ) + .appendTo( $( this.options.appendTo || "body", doc )[0] ) + // prevent the close-on-blur in case of a "slow" click on the menu (long mousedown) + .mousedown(function( event ) { + // clicking on the scrollbar causes focus to shift to the body + // but we can't detect a mouseup or a click immediately afterward + // so we have to track the next mousedown and close the menu if + // the user clicks somewhere outside of the autocomplete + var menuElement = self.menu.element[ 0 ]; + if ( !$( event.target ).closest( ".ui-menu-item" ).length ) { + setTimeout(function() { + $( document ).one( 'mousedown', function( event ) { + if ( event.target !== self.element[ 0 ] && + event.target !== menuElement && + !$.ui.contains( menuElement, event.target ) ) { + self.close(); + } + }); + }, 1 ); + } + + // use another timeout to make sure the blur-event-handler on the input was already triggered + setTimeout(function() { + clearTimeout( self.closing ); + }, 13); + }) + .menu({ + focus: function( event, ui ) { + var item = ui.item.data( "item.autocomplete" ); + if ( false !== self._trigger( "focus", event, { item: item } ) ) { + // use value to match what will end up in the input, if it was a key event + if ( /^key/.test(event.originalEvent.type) ) { + self.element.val( item.value ); + } + } + }, + selected: function( event, ui ) { + var item = ui.item.data( "item.autocomplete" ), + previous = self.previous; + + // only trigger when focus was lost (click on menu) + if ( self.element[0] !== doc.activeElement ) { + self.element.focus(); + self.previous = previous; + // #6109 - IE triggers two focus events and the second + // is asynchronous, so we need to reset the previous + // term synchronously and asynchronously :-( + setTimeout(function() { + self.previous = previous; + self.selectedItem = item; + }, 1); + } + + if ( false !== self._trigger( "select", event, { item: item } ) ) { + self.element.val( item.value ); + } + // reset the term after the select event + // this allows custom select handling to work properly + self.term = self.element.val(); + + self.close( event ); + self.selectedItem = item; + }, + blur: function( event, ui ) { + // don't set the value of the text field if it's already correct + // this prevents moving the cursor unnecessarily + if ( self.menu.element.is(":visible") && + ( self.element.val() !== self.term ) ) { + self.element.val( self.term ); + } + } + }) + .zIndex( this.element.zIndex() + 1 ) + // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781 + .css({ top: 0, left: 0 }) + .hide() + .data( "menu" ); + if ( $.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(); + $.Widget.prototype.destroy.call( this ); + }, + + _setOption: function( key, value ) { + $.Widget.prototype._setOption.apply( this, arguments ); + if ( key === "source" ) { + this._initSource(); + } + if ( key === "appendTo" ) { + this.menu.element.appendTo( $( value || "body", this.element[0].ownerDocument )[0] ) + } + if ( key === "disabled" && value && this.xhr ) { + this.xhr.abort(); + } + }, + + _initSource: function() { + var self = this, + array, + url; + if ( $.isArray(this.options.source) ) { + array = this.options.source; + this.source = function( request, response ) { + response( $.ui.autocomplete.filter(array, request.term) ); + }; + } else if ( typeof this.options.source === "string" ) { + url = this.options.source; + this.source = function( request, response ) { + if ( self.xhr ) { + self.xhr.abort(); + } + self.xhr = $.ajax({ + url: url, + data: request, + dataType: "json", + autocompleteRequest: ++requestIndex, + success: function( data, status ) { + if ( this.autocompleteRequest === requestIndex ) { + response( data ); + } + }, + error: function() { + if ( this.autocompleteRequest === requestIndex ) { + response( [] ); + } + } + }); + }; + } else { + this.source = this.options.source; + } + }, + + search: function( value, event ) { + value = value != null ? value : this.element.val(); + + // always save the actual value, not the one passed as an argument + this.term = this.element.val(); + + if ( value.length < this.options.minLength ) { + return this.close( event ); + } + + clearTimeout( this.closing ); + if ( this._trigger( "search", event ) === false ) { + return; + } + + return this._search( value ); + }, + + _search: function( value ) { + this.pending++; + this.element.addClass( "ui-autocomplete-loading" ); + + this.source( { term: value }, this.response ); + }, + + _response: function( content ) { + if ( !this.options.disabled && content && content.length ) { + content = this._normalize( content ); + this._suggest( content ); + this._trigger( "open" ); + } else { + this.close(); + } + this.pending--; + if ( !this.pending ) { + this.element.removeClass( "ui-autocomplete-loading" ); + } + }, + + close: function( event ) { + clearTimeout( this.closing ); + if ( this.menu.element.is(":visible") ) { + this.menu.element.hide(); + this.menu.deactivate(); + this._trigger( "close", event ); + } + }, + + _change: function( event ) { + if ( this.previous !== this.element.val() ) { + this._trigger( "change", event, { item: this.selectedItem } ); + } + }, + + _normalize: function( items ) { + // assume all items have the right format when the first item is complete + if ( items.length && items[0].label && items[0].value ) { + return items; + } + return $.map( items, function(item) { + if ( typeof item === "string" ) { + return { + label: item, + value: item + }; + } + return $.extend({ + label: item.label || item.value, + value: item.value || item.label + }, item ); + }); + }, + + _suggest: function( items ) { + var ul = this.menu.element + .empty() + .zIndex( this.element.zIndex() + 1 ); + this._renderMenu( ul, items ); + // TODO refresh should check if the active item is still in the dom, removing the need for a manual deactivate + this.menu.deactivate(); + this.menu.refresh(); + + // size and position menu + ul.show(); + this._resizeMenu(); + ul.position( $.extend({ + of: this.element + }, this.options.position )); + + if ( this.options.autoFocus ) { + this.menu.next( new $.Event("mouseover") ); + } + }, + + _resizeMenu: function() { + var ul = this.menu.element; + ul.outerWidth( Math.max( + ul.width( "" ).outerWidth(), + this.element.outerWidth() + ) ); + }, + + _renderMenu: function( ul, items ) { + var self = this; + $.each( items, function( index, item ) { + self._renderItem( ul, item ); + }); + }, + + _renderItem: function( ul, item) { + return $( "
    • " ) + .data( "item.autocomplete", item ) + .append( $( "" ).text( item.label ) ) + .appendTo( ul ); + }, + + _move: function( direction, event ) { + if ( !this.menu.element.is(":visible") ) { + this.search( null, event ); + return; + } + if ( this.menu.first() && /^previous/.test(direction) || + this.menu.last() && /^next/.test(direction) ) { + this.element.val( this.term ); + this.menu.deactivate(); + return; + } + this.menu[ direction ]( event ); + }, + + widget: function() { + return this.menu.element; + } +}); + +$.extend( $.ui.autocomplete, { + escapeRegex: function( value ) { + return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + }, + filter: function(array, term) { + var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" ); + return $.grep( array, function(value) { + return matcher.test( value.label || value.value || value ); + }); + } +}); + +}( jQuery )); + +/* + * jQuery UI Menu (not officially released) + * + * This widget isn't yet finished and the API is subject to change. We plan to finish + * it for the next release. You're welcome to give it a try anyway and give us feedback, + * as long as you're okay with migrating your code later on. We can help with that, too. + * + * 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/Menu + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function($) { + +$.widget("ui.menu", { + _create: function() { + var self = this; + this.element + .addClass("ui-menu ui-widget ui-widget-content ui-corner-all") + .attr({ + role: "listbox", + "aria-activedescendant": "ui-active-menuitem" + }) + .click(function( event ) { + if ( !$( event.target ).closest( ".ui-menu-item a" ).length ) { + return; + } + // temporary + event.preventDefault(); + self.select( event ); + }); + this.refresh(); + }, + + refresh: function() { + var self = this; + + // don't refresh list items that are already adapted + var items = this.element.children("li:not(.ui-menu-item):has(a)") + .addClass("ui-menu-item") + .attr("role", "menuitem"); + + items.children("a") + .addClass("ui-corner-all") + .attr("tabindex", -1) + // mouseenter doesn't work with event delegation + .mouseenter(function( event ) { + self.activate( event, $(this).parent() ); + }) + .mouseleave(function() { + self.deactivate(); + }); + }, + + activate: function( event, item ) { + this.deactivate(); + if (this.hasScroll()) { + var offset = item.offset().top - this.element.offset().top, + scroll = this.element.attr("scrollTop"), + elementHeight = this.element.height(); + if (offset < 0) { + this.element.attr("scrollTop", scroll + offset); + } else if (offset >= elementHeight) { + this.element.attr("scrollTop", scroll + offset - elementHeight + item.height()); + } + } + this.active = item.eq(0) + .children("a") + .addClass("ui-state-hover") + .attr("id", "ui-active-menuitem") + .end(); + this._trigger("focus", event, { item: item }); + }, + + deactivate: function() { + if (!this.active) { return; } + + this.active.children("a") + .removeClass("ui-state-hover") + .removeAttr("id"); + this._trigger("blur"); + this.active = null; + }, + + next: function(event) { + this.move("next", ".ui-menu-item:first", event); + }, + + previous: function(event) { + this.move("prev", ".ui-menu-item:last", event); + }, + + 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(direction, edge, event) { + if (!this.active) { + this.activate(event, this.element.children(edge)); + return; + } + var next = this.active[direction + "All"](".ui-menu-item").eq(0); + if (next.length) { + this.activate(event, next); + } else { + this.activate(event, this.element.children(edge)); + } + }, + + // TODO merge with previousPage + nextPage: function(event) { + if (this.hasScroll()) { + // TODO merge with no-scroll-else + if (!this.active || this.last()) { + this.activate(event, this.element.children(".ui-menu-item:first")); + return; + } + var base = this.active.offset().top, + height = this.element.height(), + result = this.element.children(".ui-menu-item").filter(function() { + var close = $(this).offset().top - base - height + $(this).height(); + // TODO improve approximation + return close < 10 && close > -10; + }); + + // TODO try to catch this earlier when scrollTop indicates the last page anyway + if (!result.length) { + result = this.element.children(".ui-menu-item:last"); + } + this.activate(event, result); + } else { + this.activate(event, this.element.children(".ui-menu-item") + .filter(!this.active || this.last() ? ":first" : ":last")); + } + }, + + // TODO merge with nextPage + previousPage: function(event) { + if (this.hasScroll()) { + // TODO merge with no-scroll-else + if (!this.active || this.first()) { + this.activate(event, this.element.children(".ui-menu-item:last")); + return; + } + + var base = this.active.offset().top, + height = this.element.height(); + result = this.element.children(".ui-menu-item").filter(function() { + var close = $(this).offset().top - base + height - $(this).height(); + // TODO improve approximation + return close < 10 && close > -10; + }); + + // TODO try to catch this earlier when scrollTop indicates the last page anyway + if (!result.length) { + result = this.element.children(".ui-menu-item:first"); + } + this.activate(event, result); + } else { + this.activate(event, this.element.children(".ui-menu-item") + .filter(!this.active || this.first() ? ":last" : ":first")); + } + }, + + hasScroll: function() { + return this.element.height() < this.element.attr("scrollHeight"); + }, + + select: function( event ) { + this._trigger("selected", event, { item: this.active }); + } +}); + +}(jQuery)); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.button.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.button.js new file mode 100644 index 00000000000..9a70a01df6c --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.button.js @@ -0,0 +1,387 @@ +/* + * jQuery UI Button 1.8.11 + * + * Copyright 2011, 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/Button + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function( $, undefined ) { + +var lastActive, + baseClasses = "ui-button ui-widget ui-state-default ui-corner-all", + stateClasses = "ui-state-hover ui-state-active ", + typeClasses = "ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only", + formResetHandler = function( event ) { + $( ":ui-button", event.target.form ).each(function() { + var inst = $( this ).data( "button" ); + setTimeout(function() { + inst.refresh(); + }, 1 ); + }); + }, + radioGroup = function( radio ) { + var name = radio.name, + form = radio.form, + radios = $( [] ); + if ( name ) { + if ( form ) { + radios = $( form ).find( "[name='" + name + "']" ); + } else { + radios = $( "[name='" + name + "']", radio.ownerDocument ) + .filter(function() { + return !this.form; + }); + } + } + return radios; + }; + +$.widget( "ui.button", { + options: { + disabled: null, + text: true, + label: null, + icons: { + primary: null, + secondary: null + } + }, + _create: function() { + this.element.closest( "form" ) + .unbind( "reset.button" ) + .bind( "reset.button", formResetHandler ); + + if ( typeof this.options.disabled !== "boolean" ) { + this.options.disabled = this.element.attr( "disabled" ); + } + + this._determineButtonType(); + this.hasTitle = !!this.buttonElement.attr( "title" ); + + var self = this, + options = this.options, + toggleButton = this.type === "checkbox" || this.type === "radio", + hoverClass = "ui-state-hover" + ( !toggleButton ? " ui-state-active" : "" ), + focusClass = "ui-state-focus"; + + if ( options.label === null ) { + options.label = this.buttonElement.html(); + } + + if ( this.element.is( ":disabled" ) ) { + options.disabled = true; + } + + this.buttonElement + .addClass( baseClasses ) + .attr( "role", "button" ) + .bind( "mouseenter.button", function() { + if ( options.disabled ) { + return; + } + $( this ).addClass( "ui-state-hover" ); + if ( this === lastActive ) { + $( this ).addClass( "ui-state-active" ); + } + }) + .bind( "mouseleave.button", function() { + if ( options.disabled ) { + return; + } + $( this ).removeClass( hoverClass ); + }) + .bind( "focus.button", function() { + // no need to check disabled, focus won't be triggered anyway + $( this ).addClass( focusClass ); + }) + .bind( "blur.button", function() { + $( this ).removeClass( focusClass ); + }); + + if ( toggleButton ) { + this.element.bind( "change.button", function() { + self.refresh(); + }); + } + + if ( this.type === "checkbox" ) { + this.buttonElement.bind( "click.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).toggleClass( "ui-state-active" ); + self.buttonElement.attr( "aria-pressed", self.element[0].checked ); + }); + } else if ( this.type === "radio" ) { + this.buttonElement.bind( "click.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).addClass( "ui-state-active" ); + self.buttonElement.attr( "aria-pressed", true ); + + var radio = self.element[ 0 ]; + radioGroup( radio ) + .not( radio ) + .map(function() { + return $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", false ); + }); + } else { + this.buttonElement + .bind( "mousedown.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).addClass( "ui-state-active" ); + lastActive = this; + $( document ).one( "mouseup", function() { + lastActive = null; + }); + }) + .bind( "mouseup.button", function() { + if ( options.disabled ) { + return false; + } + $( this ).removeClass( "ui-state-active" ); + }) + .bind( "keydown.button", function(event) { + if ( options.disabled ) { + return false; + } + if ( event.keyCode == $.ui.keyCode.SPACE || event.keyCode == $.ui.keyCode.ENTER ) { + $( this ).addClass( "ui-state-active" ); + } + }) + .bind( "keyup.button", function() { + $( this ).removeClass( "ui-state-active" ); + }); + + if ( this.buttonElement.is("a") ) { + this.buttonElement.keyup(function(event) { + if ( event.keyCode === $.ui.keyCode.SPACE ) { + // TODO pass through original event correctly (just as 2nd argument doesn't work) + $( this ).click(); + } + }); + } + } + + // TODO: pull out $.Widget's handling for the disabled option into + // $.Widget.prototype._setOptionDisabled so it's easy to proxy and can + // be overridden by individual plugins + this._setOption( "disabled", options.disabled ); + }, + + _determineButtonType: function() { + + if ( this.element.is(":checkbox") ) { + this.type = "checkbox"; + } else { + if ( this.element.is(":radio") ) { + this.type = "radio"; + } else { + if ( this.element.is("input") ) { + this.type = "input"; + } else { + this.type = "button"; + } + } + } + + if ( this.type === "checkbox" || this.type === "radio" ) { + // we don't search against the document in case the element + // is disconnected from the DOM + var ancestor = this.element.parents().filter(":last"), + labelSelector = "label[for=" + this.element.attr("id") + "]"; + this.buttonElement = ancestor.find( labelSelector ); + if ( !this.buttonElement.length ) { + ancestor = ancestor.length ? ancestor.siblings() : this.element.siblings(); + this.buttonElement = ancestor.filter( labelSelector ); + if ( !this.buttonElement.length ) { + this.buttonElement = ancestor.find( labelSelector ); + } + } + this.element.addClass( "ui-helper-hidden-accessible" ); + + var checked = this.element.is( ":checked" ); + if ( checked ) { + this.buttonElement.addClass( "ui-state-active" ); + } + this.buttonElement.attr( "aria-pressed", checked ); + } else { + this.buttonElement = this.element; + } + }, + + widget: function() { + return this.buttonElement; + }, + + destroy: function() { + this.element + .removeClass( "ui-helper-hidden-accessible" ); + this.buttonElement + .removeClass( baseClasses + " " + stateClasses + " " + typeClasses ) + .removeAttr( "role" ) + .removeAttr( "aria-pressed" ) + .html( this.buttonElement.find(".ui-button-text").html() ); + + if ( !this.hasTitle ) { + this.buttonElement.removeAttr( "title" ); + } + + $.Widget.prototype.destroy.call( this ); + }, + + _setOption: function( key, value ) { + $.Widget.prototype._setOption.apply( this, arguments ); + if ( key === "disabled" ) { + if ( value ) { + this.element.attr( "disabled", true ); + } else { + this.element.removeAttr( "disabled" ); + } + } + this._resetButton(); + }, + + refresh: function() { + var isDisabled = this.element.is( ":disabled" ); + if ( isDisabled !== this.options.disabled ) { + this._setOption( "disabled", isDisabled ); + } + if ( this.type === "radio" ) { + radioGroup( this.element[0] ).each(function() { + if ( $( this ).is( ":checked" ) ) { + $( this ).button( "widget" ) + .addClass( "ui-state-active" ) + .attr( "aria-pressed", true ); + } else { + $( this ).button( "widget" ) + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", false ); + } + }); + } else if ( this.type === "checkbox" ) { + if ( this.element.is( ":checked" ) ) { + this.buttonElement + .addClass( "ui-state-active" ) + .attr( "aria-pressed", true ); + } else { + this.buttonElement + .removeClass( "ui-state-active" ) + .attr( "aria-pressed", false ); + } + } + }, + + _resetButton: function() { + if ( this.type === "input" ) { + if ( this.options.label ) { + this.element.val( this.options.label ); + } + return; + } + var buttonElement = this.buttonElement.removeClass( typeClasses ), + buttonText = $( "" ) + .addClass( "ui-button-text" ) + .html( this.options.label ) + .appendTo( buttonElement.empty() ) + .text(), + icons = this.options.icons, + multipleIcons = icons.primary && icons.secondary, + buttonClasses = []; + + if ( icons.primary || icons.secondary ) { + if ( this.options.text ) { + buttonClasses.push( "ui-button-text-icon" + ( multipleIcons ? "s" : ( icons.primary ? "-primary" : "-secondary" ) ) ); + } + + if ( icons.primary ) { + buttonElement.prepend( "" ); + } + + if ( icons.secondary ) { + buttonElement.append( "" ); + } + + if ( !this.options.text ) { + buttonClasses.push( multipleIcons ? "ui-button-icons-only" : "ui-button-icon-only" ); + + if ( !this.hasTitle ) { + buttonElement.attr( "title", buttonText ); + } + } + } else { + buttonClasses.push( "ui-button-text-only" ); + } + buttonElement.addClass( buttonClasses.join( " " ) ); + } +}); + +$.widget( "ui.buttonset", { + options: { + items: ":button, :submit, :reset, :checkbox, :radio, a, :data(button)" + }, + + _create: function() { + this.element.addClass( "ui-buttonset" ); + }, + + _init: function() { + this.refresh(); + }, + + _setOption: function( key, value ) { + if ( key === "disabled" ) { + this.buttons.button( "option", key, value ); + } + + $.Widget.prototype._setOption.apply( this, arguments ); + }, + + refresh: function() { + this.buttons = this.element.find( this.options.items ) + .filter( ":ui-button" ) + .button( "refresh" ) + .end() + .not( ":ui-button" ) + .button() + .end() + .map(function() { + return $( 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 $( this ).button( "widget" )[ 0 ]; + }) + .removeClass( "ui-corner-left ui-corner-right" ) + .end() + .button( "destroy" ); + + $.Widget.prototype.destroy.call( this ); + } +}); + +}( jQuery ) ); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.core.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.core.js new file mode 100644 index 00000000000..4589a47e7d5 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.core.js @@ -0,0 +1,308 @@ +/*! + * jQuery UI 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +// prevent duplicate loading +// this is only a problem because we proxy existing functions +// and we don't want to double proxy them +$.ui = $.ui || {}; +if ( $.ui.version ) { + return; +} + +$.extend( $.ui, { + version: "1.8.11", + + keyCode: { + ALT: 18, + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + COMMAND: 91, + COMMAND_LEFT: 91, // COMMAND + COMMAND_RIGHT: 93, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + MENU: 93, // COMMAND_RIGHT + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SHIFT: 16, + SPACE: 32, + TAB: 9, + UP: 38, + WINDOWS: 91 // COMMAND + } +}); + +// plugins +$.fn.extend({ + _focus: $.fn.focus, + focus: function( delay, fn ) { + return typeof delay === "number" ? + this.each(function() { + var elem = this; + setTimeout(function() { + $( elem ).focus(); + if ( fn ) { + fn.call( elem ); + } + }, delay ); + }) : + this._focus.apply( this, arguments ); + }, + + scrollParent: function() { + var scrollParent; + if (($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) { + scrollParent = this.parents().filter(function() { + return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } else { + scrollParent = this.parents().filter(function() { + return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1)); + }).eq(0); + } + + return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent; + }, + + zIndex: function( zIndex ) { + if ( zIndex !== undefined ) { + return this.css( "zIndex", zIndex ); + } + + if ( this.length ) { + var elem = $( this[ 0 ] ), position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + //
      + value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + }, + + disableSelection: function() { + return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) + + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }, + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + } +}); + +$.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.curCSS( elem, "padding" + this, true) ) || 0; + if ( border ) { + size -= parseFloat( $.curCSS( elem, "border" + this + "Width", true) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.curCSS( elem, "margin" + this, true) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; +}); + +// selectors +function visible( element ) { + return !$( element ).parents().andSelf().filter(function() { + return $.curCSS( this, "visibility" ) === "hidden" || + $.expr.filters.hidden( this ); + }).length; +} + +$.extend( $.expr[ ":" ], { + data: function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + }, + + focusable: function( element ) { + var nodeName = element.nodeName.toLowerCase(), + tabIndex = $.attr( element, "tabindex" ); + if ( "area" === nodeName ) { + var map = element.parentNode, + mapName = map.name, + img; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap=#" + mapName + "]" )[0]; + return !!img && visible( img ); + } + return ( /input|select|textarea|button|object/.test( nodeName ) + ? !element.disabled + : "a" == nodeName + ? element.href || !isNaN( tabIndex ) + : !isNaN( tabIndex )) + // the element and all of its ancestors must be visible + && visible( element ); + }, + + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ); + return ( isNaN( tabIndex ) || tabIndex >= 0 ) && $( element ).is( ":focusable" ); + } +}); + +// support +$(function() { + var body = document.body, + div = body.appendChild( div = document.createElement( "div" ) ); + + $.extend( div.style, { + minHeight: "100px", + height: "auto", + padding: 0, + borderWidth: 0 + }); + + $.support.minHeight = div.offsetHeight === 100; + $.support.selectstart = "onselectstart" in div; + + // set display to none to avoid a layout bug in IE + // http://dev.jquery.com/ticket/4014 + body.removeChild( div ).style.display = "none"; +}); + + + + + +// deprecated +$.extend( $.ui, { + // $.ui.plugin is deprecated. Use the proxy pattern instead. + plugin: { + add: function( module, option, set ) { + var proto = $.ui[ module ].prototype; + for ( var i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args ) { + var set = instance.plugins[ name ]; + if ( !set || !instance.element[ 0 ].parentNode ) { + return; + } + + for ( var i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } + }, + + // will be deprecated when we switch to jQuery 1.4 - use jQuery.contains() + contains: function( a, b ) { + return document.compareDocumentPosition ? + a.compareDocumentPosition( b ) & 16 : + a !== b && a.contains( b ); + }, + + // only used by resizable + hasScroll: function( el, a ) { + + //If overflow is hidden, the element might have extra content, but the user wants to hide it + if ( $( el ).css( "overflow" ) === "hidden") { + return false; + } + + var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop", + has = false; + + if ( el[ scroll ] > 0 ) { + return true; + } + + // TODO: determine which cases actually cause this to happen + // if the element doesn't have the scroll set, see if it's possible to + // set the scroll + el[ scroll ] = 1; + has = ( el[ scroll ] > 0 ); + el[ scroll ] = 0; + return has; + }, + + // these are odd functions, fix the API or move into individual plugins + isOverAxis: function( x, reference, size ) { + //Determines when x coordinate is over "b" element axis + return ( x > reference ) && ( x < ( reference + size ) ); + }, + isOver: function( y, x, top, left, height, width ) { + //Determines when x, y coordinates is over "b" element + return $.ui.isOverAxis( y, top, height ) && $.ui.isOverAxis( x, left, width ); + } +}); + +})( jQuery ); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.datepicker.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.datepicker.js new file mode 100644 index 00000000000..06d481e35ed --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.datepicker.js @@ -0,0 +1,1773 @@ +/* + * jQuery UI Datepicker 1.8.11 + * + * Copyright 2011, 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/Datepicker + * + * Depends: + * jquery.ui.core.js + */ +(function( $, undefined ) { + +$.extend($.ui, { datepicker: { version: "1.8.11" } }); + +var PROP_NAME = 'datepicker'; +var dpuuid = new Date().getTime(); + +/* Date picker manager. + Use the singleton instance of this class, $.datepicker, to interact with the date picker. + Settings for (groups of) date pickers are maintained in an instance object, + allowing multiple different settings on the same page. */ + +function Datepicker() { + this.debug = false; // Change this to true to start debugging + this._curInst = null; // The current instance in use + this._keyEvent = false; // If the last event was a key event + this._disabledInputs = []; // List of date picker inputs that have been disabled + this._datepickerShowing = false; // True if the popup picker is showing , false if not + this._inDialog = false; // True if showing within a "dialog", false if not + this._mainDivId = 'ui-datepicker-div'; // The ID of the main datepicker division + this._inlineClass = 'ui-datepicker-inline'; // The name of the inline marker class + this._appendClass = 'ui-datepicker-append'; // The name of the append marker class + this._triggerClass = 'ui-datepicker-trigger'; // The name of the trigger marker class + this._dialogClass = 'ui-datepicker-dialog'; // The name of the dialog marker class + this._disableClass = 'ui-datepicker-disabled'; // The name of the disabled covering marker class + this._unselectableClass = 'ui-datepicker-unselectable'; // The name of the unselectable cell marker class + this._currentClass = 'ui-datepicker-current-day'; // The name of the current day marker class + this._dayOverClass = 'ui-datepicker-days-cell-over'; // The name of the day hover marker class + this.regional = []; // Available regional settings, indexed by language code + this.regional[''] = { // Default regional settings + closeText: 'Done', // Display text for close link + prevText: 'Prev', // Display text for previous month link + nextText: 'Next', // Display text for next month link + currentText: 'Today', // Display text for current month link + monthNames: ['January','February','March','April','May','June', + 'July','August','September','October','November','December'], // Names of months for drop-down and formatting + monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], // For formatting + dayNames: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], // For formatting + dayNamesShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], // For formatting + dayNamesMin: ['Su','Mo','Tu','We','Th','Fr','Sa'], // Column headings for days starting at Sunday + weekHeader: 'Wk', // Column header for week of the year + dateFormat: 'mm/dd/yy', // See format options on parseDate + firstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ... + isRTL: false, // True if right-to-left language, false if left-to-right + showMonthAfterYear: false, // True if the year select precedes month, false for month then year + yearSuffix: '' // Additional text to append to the year in the month headers + }; + this._defaults = { // Global defaults for all the date picker instances + showOn: 'focus', // 'focus' for popup on focus, + // 'button' for trigger button, or 'both' for either + showAnim: 'fadeIn', // Name of jQuery animation for popup + showOptions: {}, // Options for enhanced animations + defaultDate: null, // Used when field is blank: actual date, + // +/-number for offset from today, null for today + appendText: '', // Display text following the input box, e.g. showing the format + buttonText: '...', // Text for trigger button + buttonImage: '', // URL for trigger button image + buttonImageOnly: false, // True if the image appears alone, false if it appears on a button + hideIfNoPrevNext: false, // True to hide next/previous month links + // if not applicable, false to just disable them + navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links + gotoCurrent: false, // True if today link goes back to current selection instead + changeMonth: false, // True if month can be selected directly, false if only prev/next + changeYear: false, // True if year can be selected directly, false if only prev/next + yearRange: 'c-10:c+10', // Range of years to display in drop-down, + // either relative to today's year (-nn:+nn), relative to currently displayed year + // (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n) + showOtherMonths: false, // True to show dates in other months, false to leave blank + selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable + showWeek: false, // True to show week of the year, false to not show it + calculateWeek: this.iso8601Week, // How to calculate the week of the year, + // takes a Date and returns the number of the week for it + shortYearCutoff: '+10', // Short year values < this are in the current century, + // > this are in the previous century, + // string value starting with '+' for current year + value + minDate: null, // The earliest selectable date, or null for no limit + maxDate: null, // The latest selectable date, or null for no limit + duration: 'fast', // Duration of display/closure + beforeShowDay: null, // Function that takes a date and returns an array with + // [0] = true if selectable, false if not, [1] = custom CSS class name(s) or '', + // [2] = cell title (optional), e.g. $.datepicker.noWeekends + beforeShow: null, // Function that takes an input field and + // returns a set of custom settings for the date picker + onSelect: null, // Define a callback function when a date is selected + onChangeMonthYear: null, // Define a callback function when the month or year is changed + onClose: null, // Define a callback function when the datepicker is closed + numberOfMonths: 1, // Number of months to show at a time + showCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0) + stepMonths: 1, // Number of months to step back/forward + stepBigMonths: 12, // Number of months to step back/forward for the big links + altField: '', // Selector for an alternate field to store selected dates into + altFormat: '', // The date format to use for the alternate field + constrainInput: true, // The input is constrained by the current date format + showButtonPanel: false, // True to show button panel, false to not show it + autoSize: false // True to size the input for the date format, false to leave as is + }; + $.extend(this._defaults, this.regional['']); + this.dpDiv = $('
      '); +} + +$.extend(Datepicker.prototype, { + /* Class name added to elements to indicate already configured with a date picker. */ + markerClassName: 'hasDatepicker', + + /* Debug logging (if enabled). */ + log: function () { + if (this.debug) + console.log.apply('', arguments); + }, + + // TODO rename to "widget" when switching to widget factory + _widgetDatepicker: function() { + return this.dpDiv; + }, + + /* Override the default settings for all instances of the date picker. + @param settings object - the new settings to use as defaults (anonymous object) + @return the manager object */ + setDefaults: function(settings) { + extendRemove(this._defaults, settings || {}); + return this; + }, + + /* Attach the date picker to a jQuery selection. + @param target element - the target input field or division or span + @param settings object - the new settings to use for this date picker instance (anonymous) */ + _attachDatepicker: function(target, settings) { + // check for settings on the control itself - in namespace 'date:' + var inlineSettings = null; + for (var attrName in this._defaults) { + var attrValue = target.getAttribute('date:' + attrName); + if (attrValue) { + inlineSettings = inlineSettings || {}; + try { + inlineSettings[attrName] = eval(attrValue); + } catch (err) { + inlineSettings[attrName] = attrValue; + } + } + } + var nodeName = target.nodeName.toLowerCase(); + var inline = (nodeName == 'div' || nodeName == 'span'); + if (!target.id) { + this.uuid += 1; + target.id = 'dp' + this.uuid; + } + var inst = this._newInst($(target), inline); + inst.settings = $.extend({}, settings || {}, inlineSettings || {}); + if (nodeName == 'input') { + this._connectDatepicker(target, inst); + } else if (inline) { + this._inlineDatepicker(target, inst); + } + }, + + /* Create a new instance object. */ + _newInst: function(target, inline) { + var id = target[0].id.replace(/([^A-Za-z0-9_-])/g, '\\\\$1'); // escape jQuery meta chars + return {id: id, input: target, // associated target + selectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection + drawMonth: 0, drawYear: 0, // month being drawn + inline: inline, // is datepicker inline or not + dpDiv: (!inline ? this.dpDiv : // presentation div + $('
      '))}; + }, + + /* Attach the date picker to an input field. */ + _connectDatepicker: function(target, inst) { + var input = $(target); + inst.append = $([]); + inst.trigger = $([]); + if (input.hasClass(this.markerClassName)) + return; + this._attachments(input, inst); + input.addClass(this.markerClassName).keydown(this._doKeyDown). + keypress(this._doKeyPress).keyup(this._doKeyUp). + bind("setData.datepicker", function(event, key, value) { + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key) { + return this._get(inst, key); + }); + this._autoSize(inst); + $.data(target, PROP_NAME, inst); + }, + + /* Make attachments based on settings. */ + _attachments: function(input, inst) { + var appendText = this._get(inst, 'appendText'); + var isRTL = this._get(inst, 'isRTL'); + if (inst.append) + inst.append.remove(); + if (appendText) { + inst.append = $('' + appendText + ''); + input[isRTL ? 'before' : 'after'](inst.append); + } + input.unbind('focus', this._showDatepicker); + if (inst.trigger) + inst.trigger.remove(); + var showOn = this._get(inst, 'showOn'); + if (showOn == 'focus' || showOn == 'both') // pop-up date picker when in the marked field + input.focus(this._showDatepicker); + if (showOn == 'button' || showOn == 'both') { // pop-up date picker when button clicked + var buttonText = this._get(inst, 'buttonText'); + var buttonImage = this._get(inst, 'buttonImage'); + inst.trigger = $(this._get(inst, 'buttonImageOnly') ? + $('').addClass(this._triggerClass). + attr({ src: buttonImage, alt: buttonText, title: buttonText }) : + $('').addClass(this._triggerClass). + html(buttonImage == '' ? buttonText : $('').attr( + { src:buttonImage, alt:buttonText, title:buttonText }))); + input[isRTL ? 'before' : 'after'](inst.trigger); + inst.trigger.click(function() { + if ($.datepicker._datepickerShowing && $.datepicker._lastInput == input[0]) + $.datepicker._hideDatepicker(); + else + $.datepicker._showDatepicker(input[0]); + return false; + }); + } + }, + + /* Apply the maximum length for the date format. */ + _autoSize: function(inst) { + if (this._get(inst, 'autoSize') && !inst.inline) { + var date = new Date(2009, 12 - 1, 20); // Ensure double digits + var dateFormat = this._get(inst, 'dateFormat'); + if (dateFormat.match(/[DM]/)) { + var findMax = function(names) { + var max = 0; + var maxI = 0; + for (var i = 0; i < names.length; i++) { + if (names[i].length > max) { + max = names[i].length; + maxI = i; + } + } + return maxI; + }; + date.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ? + 'monthNames' : 'monthNamesShort')))); + date.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ? + 'dayNames' : 'dayNamesShort'))) + 20 - date.getDay()); + } + inst.input.attr('size', this._formatDate(inst, date).length); + } + }, + + /* Attach an inline date picker to a div. */ + _inlineDatepicker: function(target, inst) { + var divSpan = $(target); + if (divSpan.hasClass(this.markerClassName)) + return; + divSpan.addClass(this.markerClassName).append(inst.dpDiv). + bind("setData.datepicker", function(event, key, value){ + inst.settings[key] = value; + }).bind("getData.datepicker", function(event, key){ + return this._get(inst, key); + }); + $.data(target, PROP_NAME, inst); + this._setDate(inst, this._getDefaultDate(inst), true); + this._updateDatepicker(inst); + this._updateAlternate(inst); + inst.dpDiv.show(); + }, + + /* Pop-up the date picker in a "dialog" box. + @param input element - ignored + @param date string or Date - the initial date to display + @param onSelect function - the function to call when a date is selected + @param settings object - update the dialog date picker instance's settings (anonymous object) + @param pos int[2] - coordinates for the dialog's position within the screen or + event - with x/y coordinates or + leave empty for default (screen centre) + @return the manager object */ + _dialogDatepicker: function(input, date, onSelect, settings, pos) { + var inst = this._dialogInst; // internal instance + if (!inst) { + this.uuid += 1; + var id = 'dp' + this.uuid; + this._dialogInput = $(''); + this._dialogInput.keydown(this._doKeyDown); + $('body').append(this._dialogInput); + inst = this._dialogInst = this._newInst(this._dialogInput, false); + inst.settings = {}; + $.data(this._dialogInput[0], PROP_NAME, inst); + } + extendRemove(inst.settings, settings || {}); + date = (date && date.constructor == Date ? this._formatDate(inst, date) : date); + this._dialogInput.val(date); + + this._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null); + if (!this._pos) { + var browserWidth = document.documentElement.clientWidth; + var browserHeight = document.documentElement.clientHeight; + var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft; + var scrollY = document.documentElement.scrollTop || document.body.scrollTop; + this._pos = // should use actual width/height below + [(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY]; + } + + // move input on screen for focus, but hidden behind dialog + this._dialogInput.css('left', (this._pos[0] + 20) + 'px').css('top', this._pos[1] + 'px'); + inst.settings.onSelect = onSelect; + this._inDialog = true; + this.dpDiv.addClass(this._dialogClass); + this._showDatepicker(this._dialogInput[0]); + if ($.blockUI) + $.blockUI(this.dpDiv); + $.data(this._dialogInput[0], PROP_NAME, inst); + return this; + }, + + /* Detach a datepicker from its control. + @param target element - the target input field or division or span */ + _destroyDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + $.removeData(target, PROP_NAME); + if (nodeName == 'input') { + inst.append.remove(); + inst.trigger.remove(); + $target.removeClass(this.markerClassName). + unbind('focus', this._showDatepicker). + unbind('keydown', this._doKeyDown). + unbind('keypress', this._doKeyPress). + unbind('keyup', this._doKeyUp); + } else if (nodeName == 'div' || nodeName == 'span') + $target.removeClass(this.markerClassName).empty(); + }, + + /* Enable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _enableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = false; + inst.trigger.filter('button'). + each(function() { this.disabled = false; }).end(). + filter('img').css({opacity: '1.0', cursor: ''}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().removeClass('ui-state-disabled'); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + }, + + /* Disable the date picker to a jQuery selection. + @param target element - the target input field or division or span */ + _disableDatepicker: function(target) { + var $target = $(target); + var inst = $.data(target, PROP_NAME); + if (!$target.hasClass(this.markerClassName)) { + return; + } + var nodeName = target.nodeName.toLowerCase(); + if (nodeName == 'input') { + target.disabled = true; + inst.trigger.filter('button'). + each(function() { this.disabled = true; }).end(). + filter('img').css({opacity: '0.5', cursor: 'default'}); + } + else if (nodeName == 'div' || nodeName == 'span') { + var inline = $target.children('.' + this._inlineClass); + inline.children().addClass('ui-state-disabled'); + } + this._disabledInputs = $.map(this._disabledInputs, + function(value) { return (value == target ? null : value); }); // delete entry + this._disabledInputs[this._disabledInputs.length] = target; + }, + + /* Is the first field in a jQuery collection disabled as a datepicker? + @param target element - the target input field or division or span + @return boolean - true if disabled, false if enabled */ + _isDisabledDatepicker: function(target) { + if (!target) { + return false; + } + for (var i = 0; i < this._disabledInputs.length; i++) { + if (this._disabledInputs[i] == target) + return true; + } + return false; + }, + + /* Retrieve the instance data for the target control. + @param target element - the target input field or division or span + @return object - the associated instance data + @throws error if a jQuery problem getting data */ + _getInst: function(target) { + try { + return $.data(target, PROP_NAME); + } + catch (err) { + throw 'Missing instance data for this datepicker'; + } + }, + + /* Update or retrieve the settings for a date picker attached to an input field or division. + @param target element - the target input field or division or span + @param name object - the new settings to update or + string - the name of the setting to change or retrieve, + when retrieving also 'all' for all instance settings or + 'defaults' for all global defaults + @param value any - the new value for the setting + (omit if above is an object or to retrieve a value) */ + _optionDatepicker: function(target, name, value) { + var inst = this._getInst(target); + if (arguments.length == 2 && typeof name == 'string') { + return (name == 'defaults' ? $.extend({}, $.datepicker._defaults) : + (inst ? (name == 'all' ? $.extend({}, inst.settings) : + this._get(inst, name)) : null)); + } + var settings = name || {}; + if (typeof name == 'string') { + settings = {}; + settings[name] = value; + } + if (inst) { + if (this._curInst == inst) { + this._hideDatepicker(); + } + var date = this._getDateDatepicker(target, true); + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + extendRemove(inst.settings, settings); + // reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided + if (minDate !== null && settings['dateFormat'] !== undefined && settings['minDate'] === undefined) + inst.settings.minDate = this._formatDate(inst, minDate); + if (maxDate !== null && settings['dateFormat'] !== undefined && settings['maxDate'] === undefined) + inst.settings.maxDate = this._formatDate(inst, maxDate); + this._attachments($(target), inst); + this._autoSize(inst); + this._setDateDatepicker(target, date); + this._updateDatepicker(inst); + } + }, + + // change method deprecated + _changeDatepicker: function(target, name, value) { + this._optionDatepicker(target, name, value); + }, + + /* Redraw the date picker attached to an input field or division. + @param target element - the target input field or division or span */ + _refreshDatepicker: function(target) { + var inst = this._getInst(target); + if (inst) { + this._updateDatepicker(inst); + } + }, + + /* Set the dates for a jQuery selection. + @param target element - the target input field or division or span + @param date Date - the new date */ + _setDateDatepicker: function(target, date) { + var inst = this._getInst(target); + if (inst) { + this._setDate(inst, date); + this._updateDatepicker(inst); + this._updateAlternate(inst); + } + }, + + /* Get the date(s) for the first entry in a jQuery selection. + @param target element - the target input field or division or span + @param noDefault boolean - true if no default date is to be used + @return Date - the current date */ + _getDateDatepicker: function(target, noDefault) { + var inst = this._getInst(target); + if (inst && !inst.inline) + this._setDateFromField(inst, noDefault); + return (inst ? this._getDate(inst) : null); + }, + + /* Handle keystrokes. */ + _doKeyDown: function(event) { + var inst = $.datepicker._getInst(event.target); + var handled = true; + var isRTL = inst.dpDiv.is('.ui-datepicker-rtl'); + inst._keyEvent = true; + if ($.datepicker._datepickerShowing) + switch (event.keyCode) { + case 9: $.datepicker._hideDatepicker(); + handled = false; + break; // hide on tab out + case 13: var sel = $('td.' + $.datepicker._dayOverClass + ':not(.' + + $.datepicker._currentClass + ')', inst.dpDiv); + if (sel[0]) + $.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]); + else + $.datepicker._hideDatepicker(); + return false; // don't submit the form + break; // select the value on enter + case 27: $.datepicker._hideDatepicker(); + break; // hide on escape + case 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // previous month/year on page up/+ ctrl + case 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + break; // next month/year on page down/+ ctrl + case 35: if (event.ctrlKey || event.metaKey) $.datepicker._clearDate(event.target); + handled = event.ctrlKey || event.metaKey; + break; // clear on ctrl or command +end + case 36: if (event.ctrlKey || event.metaKey) $.datepicker._gotoToday(event.target); + handled = event.ctrlKey || event.metaKey; + break; // current on ctrl or command +home + case 37: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), 'D'); + handled = event.ctrlKey || event.metaKey; + // -1 day on ctrl or command +left + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + -$.datepicker._get(inst, 'stepBigMonths') : + -$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +left on Mac + break; + case 38: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, -7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // -1 week on ctrl or command +up + case 39: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), 'D'); + handled = event.ctrlKey || event.metaKey; + // +1 day on ctrl or command +right + if (event.originalEvent.altKey) $.datepicker._adjustDate(event.target, (event.ctrlKey ? + +$.datepicker._get(inst, 'stepBigMonths') : + +$.datepicker._get(inst, 'stepMonths')), 'M'); + // next month/year on alt +right + break; + case 40: if (event.ctrlKey || event.metaKey) $.datepicker._adjustDate(event.target, +7, 'D'); + handled = event.ctrlKey || event.metaKey; + break; // +1 week on ctrl or command +down + default: handled = false; + } + else if (event.keyCode == 36 && event.ctrlKey) // display the date picker on ctrl+home + $.datepicker._showDatepicker(this); + else { + handled = false; + } + if (handled) { + event.preventDefault(); + event.stopPropagation(); + } + }, + + /* Filter entered characters - based on date format. */ + _doKeyPress: function(event) { + var inst = $.datepicker._getInst(event.target); + if ($.datepicker._get(inst, 'constrainInput')) { + var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')); + var chr = String.fromCharCode(event.charCode == undefined ? event.keyCode : event.charCode); + return event.ctrlKey || event.metaKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1); + } + }, + + /* Synchronise manual entry and field/alternate field. */ + _doKeyUp: function(event) { + var inst = $.datepicker._getInst(event.target); + if (inst.input.val() != inst.lastVal) { + try { + var date = $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + (inst.input ? inst.input.val() : null), + $.datepicker._getFormatConfig(inst)); + if (date) { // only if valid + $.datepicker._setDateFromField(inst); + $.datepicker._updateAlternate(inst); + $.datepicker._updateDatepicker(inst); + } + } + catch (event) { + $.datepicker.log(event); + } + } + return true; + }, + + /* Pop-up the date picker for a given input field. + @param input element - the input field attached to the date picker or + event - if triggered by focus */ + _showDatepicker: function(input) { + input = input.target || input; + if (input.nodeName.toLowerCase() != 'input') // find from button/image trigger + input = $('input', input.parentNode)[0]; + if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input) // already here + return; + var inst = $.datepicker._getInst(input); + if ($.datepicker._curInst && $.datepicker._curInst != inst) { + $.datepicker._curInst.dpDiv.stop(true, true); + } + var beforeShow = $.datepicker._get(inst, 'beforeShow'); + extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input, inst]) : {})); + inst.lastVal = null; + $.datepicker._lastInput = input; + $.datepicker._setDateFromField(inst); + if ($.datepicker._inDialog) // hide cursor + input.value = ''; + if (!$.datepicker._pos) { // position below input + $.datepicker._pos = $.datepicker._findPos(input); + $.datepicker._pos[1] += input.offsetHeight; // add the height + } + var isFixed = false; + $(input).parents().each(function() { + isFixed |= $(this).css('position') == 'fixed'; + return !isFixed; + }); + if (isFixed && $.browser.opera) { // correction for Opera when fixed and scrolled + $.datepicker._pos[0] -= document.documentElement.scrollLeft; + $.datepicker._pos[1] -= document.documentElement.scrollTop; + } + var offset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]}; + $.datepicker._pos = null; + //to avoid flashes on Firefox + inst.dpDiv.empty(); + // determine sizing offscreen + inst.dpDiv.css({position: 'absolute', display: 'block', top: '-1000px'}); + $.datepicker._updateDatepicker(inst); + // fix width for dynamic number of date pickers + // and adjust position before showing + offset = $.datepicker._checkOffset(inst, offset, isFixed); + inst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ? + 'static' : (isFixed ? 'fixed' : 'absolute')), display: 'none', + left: offset.left + 'px', top: offset.top + 'px'}); + if (!inst.inline) { + var showAnim = $.datepicker._get(inst, 'showAnim'); + var duration = $.datepicker._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._datepickerShowing = true; + var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only + if( !! cover.length ){ + var borders = $.datepicker._getBorders(inst.dpDiv); + cover.css({left: -borders[0], top: -borders[1], + width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}); + } + }; + inst.dpDiv.zIndex($(input).zIndex()+1); + if ($.effects && $.effects[showAnim]) + inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[showAnim || 'show']((showAnim ? duration : null), postProcess); + if (!showAnim || !duration) + postProcess(); + if (inst.input.is(':visible') && !inst.input.is(':disabled')) + inst.input.focus(); + $.datepicker._curInst = inst; + } + }, + + /* Generate the date picker content. */ + _updateDatepicker: function(inst) { + var self = this; + var borders = $.datepicker._getBorders(inst.dpDiv); + inst.dpDiv.empty().append(this._generateHTML(inst)); + var cover = inst.dpDiv.find('iframe.ui-datepicker-cover'); // IE6- only + if( !!cover.length ){ //avoid call to outerXXXX() when not in IE6 + cover.css({left: -borders[0], top: -borders[1], width: inst.dpDiv.outerWidth(), height: inst.dpDiv.outerHeight()}) + } + inst.dpDiv.find('button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a') + .bind('mouseout', function(){ + $(this).removeClass('ui-state-hover'); + if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).removeClass('ui-datepicker-prev-hover'); + if(this.className.indexOf('ui-datepicker-next') != -1) $(this).removeClass('ui-datepicker-next-hover'); + }) + .bind('mouseover', function(){ + if (!self._isDisabledDatepicker( inst.inline ? inst.dpDiv.parent()[0] : inst.input[0])) { + $(this).parents('.ui-datepicker-calendar').find('a').removeClass('ui-state-hover'); + $(this).addClass('ui-state-hover'); + if(this.className.indexOf('ui-datepicker-prev') != -1) $(this).addClass('ui-datepicker-prev-hover'); + if(this.className.indexOf('ui-datepicker-next') != -1) $(this).addClass('ui-datepicker-next-hover'); + } + }) + .end() + .find('.' + this._dayOverClass + ' a') + .trigger('mouseover') + .end(); + var numMonths = this._getNumberOfMonths(inst); + var cols = numMonths[1]; + var width = 17; + if (cols > 1) + inst.dpDiv.addClass('ui-datepicker-multi-' + cols).css('width', (width * cols) + 'em'); + else + inst.dpDiv.removeClass('ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4').width(''); + inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') + + 'Class']('ui-datepicker-multi'); + inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + + 'Class']('ui-datepicker-rtl'); + if (inst == $.datepicker._curInst && $.datepicker._datepickerShowing && inst.input && + // #6694 - don't focus the input if it's already focused + // this breaks the change event in IE + inst.input.is(':visible') && !inst.input.is(':disabled') && inst.input[0] != document.activeElement) + inst.input.focus(); + // deffered render of the years select (to avoid flashes on Firefox) + if( inst.yearshtml ){ + var origyearshtml = inst.yearshtml; + setTimeout(function(){ + //assure that inst.yearshtml didn't change. + if( origyearshtml === inst.yearshtml ){ + inst.dpDiv.find('select.ui-datepicker-year:first').replaceWith(inst.yearshtml); + } + origyearshtml = inst.yearshtml = null; + }, 0); + } + }, + + /* Retrieve the size of left and top borders for an element. + @param elem (jQuery object) the element of interest + @return (number[2]) the left and top borders */ + _getBorders: function(elem) { + var convert = function(value) { + return {thin: 1, medium: 2, thick: 3}[value] || value; + }; + return [parseFloat(convert(elem.css('border-left-width'))), + parseFloat(convert(elem.css('border-top-width')))]; + }, + + /* Check positioning to remain on screen. */ + _checkOffset: function(inst, offset, isFixed) { + var dpWidth = inst.dpDiv.outerWidth(); + var dpHeight = inst.dpDiv.outerHeight(); + var inputWidth = inst.input ? inst.input.outerWidth() : 0; + var inputHeight = inst.input ? inst.input.outerHeight() : 0; + var viewWidth = document.documentElement.clientWidth + $(document).scrollLeft(); + var viewHeight = document.documentElement.clientHeight + $(document).scrollTop(); + + offset.left -= (this._get(inst, 'isRTL') ? (dpWidth - inputWidth) : 0); + offset.left -= (isFixed && offset.left == inst.input.offset().left) ? $(document).scrollLeft() : 0; + offset.top -= (isFixed && offset.top == (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0; + + // now check if datepicker is showing outside window viewport - move to a better place if so. + offset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ? + Math.abs(offset.left + dpWidth - viewWidth) : 0); + offset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ? + Math.abs(dpHeight + inputHeight) : 0); + + return offset; + }, + + /* Find an object's position on the screen. */ + _findPos: function(obj) { + var inst = this._getInst(obj); + var isRTL = this._get(inst, 'isRTL'); + while (obj && (obj.type == 'hidden' || obj.nodeType != 1 || $.expr.filters.hidden(obj))) { + obj = obj[isRTL ? 'previousSibling' : 'nextSibling']; + } + var position = $(obj).offset(); + return [position.left, position.top]; + }, + + /* Hide the date picker from view. + @param input element - the input field attached to the date picker */ + _hideDatepicker: function(input) { + var inst = this._curInst; + if (!inst || (input && inst != $.data(input, PROP_NAME))) + return; + if (this._datepickerShowing) { + var showAnim = this._get(inst, 'showAnim'); + var duration = this._get(inst, 'duration'); + var postProcess = function() { + $.datepicker._tidyDialog(inst); + this._curInst = null; + }; + if ($.effects && $.effects[showAnim]) + inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); + else + inst.dpDiv[(showAnim == 'slideDown' ? 'slideUp' : + (showAnim == 'fadeIn' ? 'fadeOut' : 'hide'))]((showAnim ? duration : null), postProcess); + if (!showAnim) + postProcess(); + var onClose = this._get(inst, 'onClose'); + if (onClose) + onClose.apply((inst.input ? inst.input[0] : null), + [(inst.input ? inst.input.val() : ''), inst]); // trigger custom callback + this._datepickerShowing = false; + this._lastInput = null; + if (this._inDialog) { + this._dialogInput.css({ position: 'absolute', left: '0', top: '-100px' }); + if ($.blockUI) { + $.unblockUI(); + $('body').append(this.dpDiv); + } + } + this._inDialog = false; + } + }, + + /* Tidy up after a dialog display. */ + _tidyDialog: function(inst) { + inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker-calendar'); + }, + + /* Close date picker if clicked elsewhere. */ + _checkExternalClick: function(event) { + if (!$.datepicker._curInst) + return; + var $target = $(event.target); + if ($target[0].id != $.datepicker._mainDivId && + $target.parents('#' + $.datepicker._mainDivId).length == 0 && + !$target.hasClass($.datepicker.markerClassName) && + !$target.hasClass($.datepicker._triggerClass) && + $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI)) + $.datepicker._hideDatepicker(); + }, + + /* Adjust one of the date sub-fields. */ + _adjustDate: function(id, offset, period) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._isDisabledDatepicker(target[0])) { + return; + } + this._adjustInstDate(inst, offset + + (period == 'M' ? this._get(inst, 'showCurrentAtPos') : 0), // undo positioning + period); + this._updateDatepicker(inst); + }, + + /* Action for current link. */ + _gotoToday: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (this._get(inst, 'gotoCurrent') && inst.currentDay) { + inst.selectedDay = inst.currentDay; + inst.drawMonth = inst.selectedMonth = inst.currentMonth; + inst.drawYear = inst.selectedYear = inst.currentYear; + } + else { + var date = new Date(); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + } + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Action for selecting a new month/year. */ + _selectMonthYear: function(id, select, period) { + var target = $(id); + var inst = this._getInst(target[0]); + inst._selectingMonthYear = false; + inst['selected' + (period == 'M' ? 'Month' : 'Year')] = + inst['draw' + (period == 'M' ? 'Month' : 'Year')] = + parseInt(select.options[select.selectedIndex].value,10); + this._notifyChange(inst); + this._adjustDate(target); + }, + + /* Restore input focus after not changing month/year. */ + _clickMonthYear: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + if (inst.input && inst._selectingMonthYear) { + setTimeout(function() { + inst.input.focus(); + }, 0); + } + inst._selectingMonthYear = !inst._selectingMonthYear; + }, + + /* Action for selecting a day. */ + _selectDay: function(id, month, year, td) { + var target = $(id); + if ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) { + return; + } + var inst = this._getInst(target[0]); + inst.selectedDay = inst.currentDay = $('a', td).html(); + inst.selectedMonth = inst.currentMonth = month; + inst.selectedYear = inst.currentYear = year; + this._selectDate(id, this._formatDate(inst, + inst.currentDay, inst.currentMonth, inst.currentYear)); + }, + + /* Erase the input field and hide the date picker. */ + _clearDate: function(id) { + var target = $(id); + var inst = this._getInst(target[0]); + this._selectDate(target, ''); + }, + + /* Update the input field with the selected date. */ + _selectDate: function(id, dateStr) { + var target = $(id); + var inst = this._getInst(target[0]); + dateStr = (dateStr != null ? dateStr : this._formatDate(inst)); + if (inst.input) + inst.input.val(dateStr); + this._updateAlternate(inst); + var onSelect = this._get(inst, 'onSelect'); + if (onSelect) + onSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback + else if (inst.input) + inst.input.trigger('change'); // fire the change event + if (inst.inline) + this._updateDatepicker(inst); + else { + this._hideDatepicker(); + this._lastInput = inst.input[0]; + if (typeof(inst.input[0]) != 'object') + inst.input.focus(); // restore focus + this._lastInput = null; + } + }, + + /* Update any alternate field to synchronise with the main field. */ + _updateAlternate: function(inst) { + var altField = this._get(inst, 'altField'); + if (altField) { // update alternate field too + var altFormat = this._get(inst, 'altFormat') || this._get(inst, 'dateFormat'); + var date = this._getDate(inst); + var dateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst)); + $(altField).each(function() { $(this).val(dateStr); }); + } + }, + + /* Set as beforeShowDay function to prevent selection of weekends. + @param date Date - the date to customise + @return [boolean, string] - is this date selectable?, what is its CSS class? */ + noWeekends: function(date) { + var day = date.getDay(); + return [(day > 0 && day < 6), '']; + }, + + /* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition. + @param date Date - the date to get the week for + @return number - the number of the week within the year that contains this date */ + iso8601Week: function(date) { + var checkDate = new Date(date.getTime()); + // Find Thursday of this week starting on Monday + checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7)); + var time = checkDate.getTime(); + checkDate.setMonth(0); // Compare with Jan 1 + checkDate.setDate(1); + return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1; + }, + + /* Parse a string value into a date object. + See formatDate below for the possible formats. + + @param format string - the expected format of the date + @param value string - the date in the above format + @param settings Object - attributes include: + shortYearCutoff number - the cutoff year for determining the century (optional) + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return Date - the extracted date value or null if value is blank */ + parseDate: function (format, value, settings) { + if (format == null || value == null) + throw 'Invalid arguments'; + value = (typeof value == 'object' ? value.toString() : value + ''); + if (value == '') + return null; + var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff; + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + var year = -1; + var month = -1; + var day = -1; + var doy = -1; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Extract a number from the string value + var getNumber = function(match) { + var isDoubled = lookAhead(match); + var size = (match == '@' ? 14 : (match == '!' ? 20 : + (match == 'y' && isDoubled ? 4 : (match == 'o' ? 3 : 2)))); + var digits = new RegExp('^\\d{1,' + size + '}'); + var num = value.substring(iValue).match(digits); + if (!num) + throw 'Missing number at position ' + iValue; + iValue += num[0].length; + return parseInt(num[0], 10); + }; + // Extract a name from the string value and convert to an index + var getName = function(match, shortNames, longNames) { + var names = (lookAhead(match) ? longNames : shortNames); + for (var i = 0; i < names.length; i++) { + if (value.substr(iValue, names[i].length).toLowerCase() == names[i].toLowerCase()) { + iValue += names[i].length; + return i + 1; + } + } + throw 'Unknown name at position ' + iValue; + }; + // Confirm that a literal character matches the string value + var checkLiteral = function() { + if (value.charAt(iValue) != format.charAt(iFormat)) + throw 'Unexpected literal at position ' + iValue; + iValue++; + }; + var iValue = 0; + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + checkLiteral(); + else + switch (format.charAt(iFormat)) { + case 'd': + day = getNumber('d'); + break; + case 'D': + getName('D', dayNamesShort, dayNames); + break; + case 'o': + doy = getNumber('o'); + break; + case 'm': + month = getNumber('m'); + break; + case 'M': + month = getName('M', monthNamesShort, monthNames); + break; + case 'y': + year = getNumber('y'); + break; + case '@': + var date = new Date(getNumber('@')); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case '!': + var date = new Date((getNumber('!') - this._ticksTo1970) / 10000); + year = date.getFullYear(); + month = date.getMonth() + 1; + day = date.getDate(); + break; + case "'": + if (lookAhead("'")) + checkLiteral(); + else + literal = true; + break; + default: + checkLiteral(); + } + } + if (year == -1) + year = new Date().getFullYear(); + else if (year < 100) + year += new Date().getFullYear() - new Date().getFullYear() % 100 + + (year <= shortYearCutoff ? 0 : -100); + if (doy > -1) { + month = 1; + day = doy; + do { + var dim = this._getDaysInMonth(year, month - 1); + if (day <= dim) + break; + month++; + day -= dim; + } while (true); + } + var date = this._daylightSavingAdjust(new Date(year, month - 1, day)); + if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day) + throw 'Invalid date'; // E.g. 31/02/* + return date; + }, + + /* Standard date formats. */ + ATOM: 'yy-mm-dd', // RFC 3339 (ISO 8601) + 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', // RFC 822 + TICKS: '!', + TIMESTAMP: '@', + W3C: 'yy-mm-dd', // ISO 8601 + + _ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) + + Math.floor(1970 / 400)) * 24 * 60 * 60 * 10000000), + + /* Format a date object into a string value. + The format can be combinations of the following: + d - day of month (no leading zero) + dd - day of month (two digit) + o - day of year (no leading zeros) + oo - day of year (three digit) + D - day name short + DD - day name long + m - month of year (no leading zero) + mm - month of year (two digit) + M - month name short + MM - month name long + y - year (two digit) + yy - year (four digit) + @ - Unix timestamp (ms since 01/01/1970) + ! - Windows ticks (100ns since 01/01/0001) + '...' - literal text + '' - single quote + + @param format string - the desired format of the date + @param date Date - the date value to format + @param settings Object - attributes include: + dayNamesShort string[7] - abbreviated names of the days from Sunday (optional) + dayNames string[7] - names of the days from Sunday (optional) + monthNamesShort string[12] - abbreviated names of the months (optional) + monthNames string[12] - names of the months (optional) + @return string - the date in the above format */ + formatDate: function (format, date, settings) { + if (!date) + return ''; + var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort; + var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames; + var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort; + var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + // Format a number, with leading zero if necessary + var formatNumber = function(match, value, len) { + var num = '' + value; + if (lookAhead(match)) + while (num.length < len) + num = '0' + num; + return num; + }; + // Format a name, short or long as requested + var formatName = function(match, value, shortNames, longNames) { + return (lookAhead(match) ? longNames[value] : shortNames[value]); + }; + var output = ''; + var literal = false; + if (date) + for (var iFormat = 0; iFormat < format.length; iFormat++) { + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + output += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': + output += formatNumber('d', date.getDate(), 2); + break; + case 'D': + output += formatName('D', date.getDay(), dayNamesShort, dayNames); + break; + case 'o': + output += formatNumber('o', + (date.getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000, 3); + break; + case 'm': + output += formatNumber('m', date.getMonth() + 1, 2); + break; + case 'M': + output += formatName('M', date.getMonth(), monthNamesShort, monthNames); + break; + case 'y': + output += (lookAhead('y') ? date.getFullYear() : + (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100); + break; + case '@': + output += date.getTime(); + break; + case '!': + output += date.getTime() * 10000 + this._ticksTo1970; + break; + case "'": + if (lookAhead("'")) + output += "'"; + else + literal = true; + break; + default: + output += format.charAt(iFormat); + } + } + return output; + }, + + /* Extract all possible characters from the date format. */ + _possibleChars: function (format) { + var chars = ''; + var literal = false; + // Check whether a format character is doubled + var lookAhead = function(match) { + var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match); + if (matches) + iFormat++; + return matches; + }; + for (var iFormat = 0; iFormat < format.length; iFormat++) + if (literal) + if (format.charAt(iFormat) == "'" && !lookAhead("'")) + literal = false; + else + chars += format.charAt(iFormat); + else + switch (format.charAt(iFormat)) { + case 'd': case 'm': case 'y': case '@': + chars += '0123456789'; + break; + case 'D': case 'M': + return null; // Accept anything + case "'": + if (lookAhead("'")) + chars += "'"; + else + literal = true; + break; + default: + chars += format.charAt(iFormat); + } + return chars; + }, + + /* Get a setting value, defaulting if necessary. */ + _get: function(inst, name) { + return inst.settings[name] !== undefined ? + inst.settings[name] : this._defaults[name]; + }, + + /* Parse existing date and initialise date picker. */ + _setDateFromField: function(inst, noDefault) { + if (inst.input.val() == inst.lastVal) { + return; + } + var dateFormat = this._get(inst, 'dateFormat'); + var dates = inst.lastVal = inst.input ? inst.input.val() : null; + var date, defaultDate; + date = defaultDate = this._getDefaultDate(inst); + var settings = this._getFormatConfig(inst); + try { + date = this.parseDate(dateFormat, dates, settings) || defaultDate; + } catch (event) { + this.log(event); + dates = (noDefault ? '' : dates); + } + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + inst.currentDay = (dates ? date.getDate() : 0); + inst.currentMonth = (dates ? date.getMonth() : 0); + inst.currentYear = (dates ? date.getFullYear() : 0); + this._adjustInstDate(inst); + }, + + /* Retrieve the default date shown on opening. */ + _getDefaultDate: function(inst) { + return this._restrictMinMax(inst, + this._determineDate(inst, this._get(inst, 'defaultDate'), new Date())); + }, + + /* A date may be specified as an exact value or a relative one. */ + _determineDate: function(inst, date, defaultDate) { + var offsetNumeric = function(offset) { + var date = new Date(); + date.setDate(date.getDate() + offset); + return date; + }; + var offsetString = function(offset) { + try { + return $.datepicker.parseDate($.datepicker._get(inst, 'dateFormat'), + offset, $.datepicker._getFormatConfig(inst)); + } + catch (e) { + // Ignore + } + var date = (offset.toLowerCase().match(/^c/) ? + $.datepicker._getDate(inst) : null) || new Date(); + var year = date.getFullYear(); + var month = date.getMonth(); + var day = date.getDate(); + var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g; + var matches = pattern.exec(offset); + while (matches) { + switch (matches[2] || 'd') { + case 'd' : case 'D' : + day += parseInt(matches[1],10); break; + case 'w' : case 'W' : + day += parseInt(matches[1],10) * 7; break; + case 'm' : case 'M' : + month += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + case 'y': case 'Y' : + year += parseInt(matches[1],10); + day = Math.min(day, $.datepicker._getDaysInMonth(year, month)); + break; + } + matches = pattern.exec(offset); + } + return new Date(year, month, day); + }; + var newDate = (date == null || date === '' ? defaultDate : (typeof date == 'string' ? offsetString(date) : + (typeof date == 'number' ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime())))); + newDate = (newDate && newDate.toString() == 'Invalid Date' ? defaultDate : newDate); + if (newDate) { + newDate.setHours(0); + newDate.setMinutes(0); + newDate.setSeconds(0); + newDate.setMilliseconds(0); + } + return this._daylightSavingAdjust(newDate); + }, + + /* Handle switch to/from daylight saving. + Hours may be non-zero on daylight saving cut-over: + > 12 when midnight changeover, but then cannot generate + midnight datetime, so jump to 1AM, otherwise reset. + @param date (Date) the date to check + @return (Date) the corrected date */ + _daylightSavingAdjust: function(date) { + if (!date) return null; + date.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0); + return date; + }, + + /* Set the date(s) directly. */ + _setDate: function(inst, date, noChange) { + var clear = !date; + var origMonth = inst.selectedMonth; + var origYear = inst.selectedYear; + var newDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date())); + inst.selectedDay = inst.currentDay = newDate.getDate(); + inst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth(); + inst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear(); + if ((origMonth != inst.selectedMonth || origYear != inst.selectedYear) && !noChange) + this._notifyChange(inst); + this._adjustInstDate(inst); + if (inst.input) { + inst.input.val(clear ? '' : this._formatDate(inst)); + } + }, + + /* Retrieve the date(s) directly. */ + _getDate: function(inst) { + var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null : + this._daylightSavingAdjust(new Date( + inst.currentYear, inst.currentMonth, inst.currentDay))); + return startDate; + }, + + /* Generate the HTML for the current state of the date picker. */ + _generateHTML: function(inst) { + var today = new Date(); + today = this._daylightSavingAdjust( + new Date(today.getFullYear(), today.getMonth(), today.getDate())); // clear time + var isRTL = this._get(inst, 'isRTL'); + var showButtonPanel = this._get(inst, 'showButtonPanel'); + var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext'); + var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat'); + var numMonths = this._getNumberOfMonths(inst); + var showCurrentAtPos = this._get(inst, 'showCurrentAtPos'); + var stepMonths = this._get(inst, 'stepMonths'); + var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1); + var currentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) : + new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + var drawMonth = inst.drawMonth - showCurrentAtPos; + var drawYear = inst.drawYear; + if (drawMonth < 0) { + drawMonth += 12; + drawYear--; + } + if (maxDate) { + var maxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(), + maxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate())); + maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw); + while (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) { + drawMonth--; + if (drawMonth < 0) { + drawMonth = 11; + drawYear--; + } + } + } + inst.drawMonth = drawMonth; + inst.drawYear = drawYear; + var prevText = this._get(inst, 'prevText'); + prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)), + this._getFormatConfig(inst))); + var prev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? + '' + prevText + '' : + (hideIfNoPrevNext ? '' : '' + prevText + '')); + var nextText = this._get(inst, 'nextText'); + nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, + this._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)), + this._getFormatConfig(inst))); + var next = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? + '' + nextText + '' : + (hideIfNoPrevNext ? '' : '' + nextText + '')); + var currentText = this._get(inst, 'currentText'); + var gotoDate = (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today); + currentText = (!navigationAsDateFormat ? currentText : + this.formatDate(currentText, gotoDate, this._getFormatConfig(inst))); + var controls = (!inst.inline ? '' : ''); + var buttonPanel = (showButtonPanel) ? '
      ' + (isRTL ? controls : '') + + (this._isInRange(inst, gotoDate) ? '' : '') + (isRTL ? '' : controls) + '
      ' : ''; + var firstDay = parseInt(this._get(inst, 'firstDay'),10); + firstDay = (isNaN(firstDay) ? 0 : firstDay); + var showWeek = this._get(inst, 'showWeek'); + var dayNames = this._get(inst, 'dayNames'); + var dayNamesShort = this._get(inst, 'dayNamesShort'); + var dayNamesMin = this._get(inst, 'dayNamesMin'); + var monthNames = this._get(inst, 'monthNames'); + var monthNamesShort = this._get(inst, 'monthNamesShort'); + var beforeShowDay = this._get(inst, 'beforeShowDay'); + var showOtherMonths = this._get(inst, 'showOtherMonths'); + var selectOtherMonths = this._get(inst, 'selectOtherMonths'); + var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week; + var defaultDate = this._getDefaultDate(inst); + var html = ''; + for (var row = 0; row < numMonths[0]; row++) { + var group = ''; + for (var col = 0; col < numMonths[1]; col++) { + var selectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay)); + var cornerClass = ' ui-corner-all'; + var calender = ''; + if (isMultiMonth) { + calender += '
      '; + } + calender += '
      ' + + (/all|left/.test(cornerClass) && row == 0 ? (isRTL ? next : prev) : '') + + (/all|right/.test(cornerClass) && row == 0 ? (isRTL ? prev : next) : '') + + this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, + row > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers + '
      ' + + ''; + var thead = (showWeek ? '' : ''); + for (var dow = 0; dow < 7; dow++) { // days of the week + var day = (dow + firstDay) % 7; + thead += '= 5 ? ' class="ui-datepicker-week-end"' : '') + '>' + + '' + dayNamesMin[day] + ''; + } + calender += thead + ''; + var daysInMonth = this._getDaysInMonth(drawYear, drawMonth); + if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth) + inst.selectedDay = Math.min(inst.selectedDay, daysInMonth); + var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7; + var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7)); // calculate the number of rows to generate + var printDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays)); + for (var dRow = 0; dRow < numRows; dRow++) { // create date picker rows + calender += ''; + var tbody = (!showWeek ? '' : ''); + for (var dow = 0; dow < 7; dow++) { // create date picker days + var daySettings = (beforeShowDay ? + beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, '']); + var otherMonth = (printDate.getMonth() != drawMonth); + var unselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] || + (minDate && printDate < minDate) || (maxDate && printDate > maxDate); + tbody += ''; // display selectable date + printDate.setDate(printDate.getDate() + 1); + printDate = this._daylightSavingAdjust(printDate); + } + calender += tbody + ''; + } + drawMonth++; + if (drawMonth > 11) { + drawMonth = 0; + drawYear++; + } + calender += '
      ' + this._get(inst, 'weekHeader') + '
      ' + + this._get(inst, 'calculateWeek')(printDate) + '' + // actions + (otherMonth && !showOtherMonths ? ' ' : // display for other months + (unselectable ? '' + printDate.getDate() + '' : '' + printDate.getDate() + '')) + '
      ' + (isMultiMonth ? '
      ' + + ((numMonths[0] > 0 && col == numMonths[1]-1) ? '
      ' : '') : ''); + group += calender; + } + html += group; + } + html += buttonPanel + ($.browser.msie && parseInt($.browser.version,10) < 7 && !inst.inline ? + '' : ''); + inst._keyEvent = false; + return html; + }, + + /* Generate the month and year header. */ + _generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate, + secondary, monthNames, monthNamesShort) { + var changeMonth = this._get(inst, 'changeMonth'); + var changeYear = this._get(inst, 'changeYear'); + var showMonthAfterYear = this._get(inst, 'showMonthAfterYear'); + var html = '
      '; + var monthHtml = ''; + // month selection + if (secondary || !changeMonth) + monthHtml += '' + monthNames[drawMonth] + ''; + else { + var inMinYear = (minDate && minDate.getFullYear() == drawYear); + var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear); + monthHtml += ''; + } + if (!showMonthAfterYear) + html += monthHtml + (secondary || !(changeMonth && changeYear) ? ' ' : ''); + // year selection + inst.yearshtml = ''; + if (secondary || !changeYear) + html += '' + drawYear + ''; + else { + // determine range of years to display + var years = this._get(inst, 'yearRange').split(':'); + var thisYear = new Date().getFullYear(); + var determineYear = function(value) { + var year = (value.match(/c[+-].*/) ? drawYear + parseInt(value.substring(1), 10) : + (value.match(/[+-].*/) ? thisYear + parseInt(value, 10) : + parseInt(value, 10))); + return (isNaN(year) ? thisYear : year); + }; + var year = determineYear(years[0]); + var endYear = Math.max(year, determineYear(years[1] || '')); + year = (minDate ? Math.max(year, minDate.getFullYear()) : year); + endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear); + inst.yearshtml += ''; + //when showing there is no need for later update + if( ! $.browser.mozilla ){ + html += inst.yearshtml; + inst.yearshtml = null; + } else { + // will be replaced later with inst.yearshtml + html += ''; + } + } + html += this._get(inst, 'yearSuffix'); + if (showMonthAfterYear) + html += (secondary || !(changeMonth && changeYear) ? ' ' : '') + monthHtml; + html += '
      '; // Close datepicker_header + return html; + }, + + /* Adjust one of the date sub-fields. */ + _adjustInstDate: function(inst, offset, period) { + var year = inst.drawYear + (period == 'Y' ? offset : 0); + var month = inst.drawMonth + (period == 'M' ? offset : 0); + var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + + (period == 'D' ? offset : 0); + var date = this._restrictMinMax(inst, + this._daylightSavingAdjust(new Date(year, month, day))); + inst.selectedDay = date.getDate(); + inst.drawMonth = inst.selectedMonth = date.getMonth(); + inst.drawYear = inst.selectedYear = date.getFullYear(); + if (period == 'M' || period == 'Y') + this._notifyChange(inst); + }, + + /* Ensure a date is within any min/max bounds. */ + _restrictMinMax: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + var newDate = (minDate && date < minDate ? minDate : date); + newDate = (maxDate && newDate > maxDate ? maxDate : newDate); + return newDate; + }, + + /* Notify change of month/year. */ + _notifyChange: function(inst) { + var onChange = this._get(inst, 'onChangeMonthYear'); + if (onChange) + onChange.apply((inst.input ? inst.input[0] : null), + [inst.selectedYear, inst.selectedMonth + 1, inst]); + }, + + /* Determine the number of months to show. */ + _getNumberOfMonths: function(inst) { + var numMonths = this._get(inst, 'numberOfMonths'); + return (numMonths == null ? [1, 1] : (typeof numMonths == 'number' ? [1, numMonths] : numMonths)); + }, + + /* Determine the current maximum date - ensure no time components are set. */ + _getMinMaxDate: function(inst, minMax) { + return this._determineDate(inst, this._get(inst, minMax + 'Date'), null); + }, + + /* Find the number of days in a given month. */ + _getDaysInMonth: function(year, month) { + return 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate(); + }, + + /* Find the day of the week of the first of a month. */ + _getFirstDayOfMonth: function(year, month) { + return new Date(year, month, 1).getDay(); + }, + + /* Determines if we should allow a "next/prev" month display change. */ + _canAdjustMonth: function(inst, offset, curYear, curMonth) { + var numMonths = this._getNumberOfMonths(inst); + var date = this._daylightSavingAdjust(new Date(curYear, + curMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1)); + if (offset < 0) + date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth())); + return this._isInRange(inst, date); + }, + + /* Is the given date in the accepted range? */ + _isInRange: function(inst, date) { + var minDate = this._getMinMaxDate(inst, 'min'); + var maxDate = this._getMinMaxDate(inst, 'max'); + return ((!minDate || date.getTime() >= minDate.getTime()) && + (!maxDate || date.getTime() <= maxDate.getTime())); + }, + + /* Provide the configuration settings for formatting/parsing. */ + _getFormatConfig: function(inst) { + var shortYearCutoff = this._get(inst, 'shortYearCutoff'); + shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : + new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10)); + return {shortYearCutoff: shortYearCutoff, + dayNamesShort: this._get(inst, 'dayNamesShort'), dayNames: this._get(inst, 'dayNames'), + monthNamesShort: this._get(inst, 'monthNamesShort'), monthNames: this._get(inst, 'monthNames')}; + }, + + /* Format the given date for display. */ + _formatDate: function(inst, day, month, year) { + if (!day) { + inst.currentDay = inst.selectedDay; + inst.currentMonth = inst.selectedMonth; + inst.currentYear = inst.selectedYear; + } + var date = (day ? (typeof day == 'object' ? day : + this._daylightSavingAdjust(new Date(year, month, day))) : + this._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay))); + return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst)); + } +}); + +/* jQuery extend now ignores nulls! */ +function extendRemove(target, props) { + $.extend(target, props); + for (var name in props) + if (props[name] == null || props[name] == undefined) + target[name] = props[name]; + return target; +}; + +/* Determine whether an object is an array. */ +function isArray(a) { + return (a && (($.browser.safari && typeof a == 'object' && a.length) || + (a.constructor && a.constructor.toString().match(/\Array\(\)/)))); +}; + +/* Invoke the datepicker functionality. + @param options string - a command, optionally followed by additional parameters or + Object - settings for attaching new datepicker functionality + @return jQuery object */ +$.fn.datepicker = function(options){ + + /* Verify an empty collection wasn't passed - Fixes #6976 */ + if ( !this.length ) { + return this; + } + + /* Initialise the date picker. */ + if (!$.datepicker.initialized) { + $(document).mousedown($.datepicker._checkExternalClick). + find('body').append($.datepicker.dpDiv); + $.datepicker.initialized = true; + } + + var otherArgs = Array.prototype.slice.call(arguments, 1); + if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate' || options == 'widget')) + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + if (options == 'option' && arguments.length == 2 && typeof arguments[1] == 'string') + return $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this[0]].concat(otherArgs)); + return this.each(function() { + typeof options == 'string' ? + $.datepicker['_' + options + 'Datepicker']. + apply($.datepicker, [this].concat(otherArgs)) : + $.datepicker._attachDatepicker(this, options); + }); +}; + +$.datepicker = new Datepicker(); // singleton instance +$.datepicker.initialized = false; +$.datepicker.uuid = new Date().getTime(); +$.datepicker.version = "1.8.11"; + +// Workaround for #4055 +// Add another global to avoid noConflict issues with inline event handlers +window['DP_jQuery_' + dpuuid] = $; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.dialog.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.dialog.js new file mode 100644 index 00000000000..f0656a2f531 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.dialog.js @@ -0,0 +1,857 @@ +/* + * jQuery UI Dialog 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +var uiDialogClasses = + 'ui-dialog ' + + 'ui-widget ' + + 'ui-widget-content ' + + 'ui-corner-all ', + sizeRelatedOptions = { + buttons: true, + height: true, + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true, + width: true + }, + resizableRelatedOptions = { + maxHeight: true, + maxWidth: true, + minHeight: true, + minWidth: true + }; + +$.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', + collision: 'fit', + // ensure that the titlebar is never outside the document + using: function(pos) { + var topOffset = $(this).css(pos).offset().top; + if (topOffset < 0) { + $(this).css('top', pos.top - topOffset); + } + } + }, + resizable: true, + show: null, + stack: true, + title: '', + width: 300, + zIndex: 1000 + }, + + _create: function() { + this.originalTitle = this.element.attr('title'); + // #5742 - .attr() might return a DOMElement + if ( typeof this.originalTitle !== "string" ) { + this.originalTitle = ""; + } + + this.options.title = this.options.title || this.originalTitle; + var self = this, + options = self.options, + + title = options.title || ' ', + titleId = $.ui.dialog.getTitleId(self.element), + + uiDialog = (self.uiDialog = $('
      ')) + .appendTo(document.body) + .hide() + .addClass(uiDialogClasses + options.dialogClass) + .css({ + zIndex: options.zIndex + }) + // setting tabIndex makes the div focusable + // setting outline to 0 prevents a border on focus in Mozilla + .attr('tabIndex', -1).css('outline', 0).keydown(function(event) { + if (options.closeOnEscape && event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE) { + + self.close(event); + event.preventDefault(); + } + }) + .attr({ + role: 'dialog', + 'aria-labelledby': titleId + }) + .mousedown(function(event) { + self.moveToTop(false, event); + }), + + uiDialogContent = self.element + .show() + .removeAttr('title') + .addClass( + 'ui-dialog-content ' + + 'ui-widget-content') + .appendTo(uiDialog), + + uiDialogTitlebar = (self.uiDialogTitlebar = $('
      ')) + .addClass( + 'ui-dialog-titlebar ' + + 'ui-widget-header ' + + 'ui-corner-all ' + + 'ui-helper-clearfix' + ) + .prependTo(uiDialog), + + uiDialogTitlebarClose = $('') + .addClass( + 'ui-dialog-titlebar-close ' + + 'ui-corner-all' + ) + .attr('role', 'button') + .hover( + function() { + uiDialogTitlebarClose.addClass('ui-state-hover'); + }, + function() { + uiDialogTitlebarClose.removeClass('ui-state-hover'); + } + ) + .focus(function() { + uiDialogTitlebarClose.addClass('ui-state-focus'); + }) + .blur(function() { + uiDialogTitlebarClose.removeClass('ui-state-focus'); + }) + .click(function(event) { + self.close(event); + return false; + }) + .appendTo(uiDialogTitlebar), + + uiDialogTitlebarCloseText = (self.uiDialogTitlebarCloseText = $('')) + .addClass( + 'ui-icon ' + + 'ui-icon-closethick' + ) + .text(options.closeText) + .appendTo(uiDialogTitlebarClose), + + uiDialogTitle = $('') + .addClass('ui-dialog-title') + .attr('id', titleId) + .html(title) + .prependTo(uiDialogTitlebar); + + //handling of deprecated beforeclose (vs beforeClose) option + //Ticket #4669 http://dev.jqueryui.com/ticket/4669 + //TODO: remove in 1.9pre + if ($.isFunction(options.beforeclose) && !$.isFunction(options.beforeClose)) { + options.beforeClose = options.beforeclose; + } + + uiDialogTitlebar.find("*").add(uiDialogTitlebar).disableSelection(); + + if (options.draggable && $.fn.draggable) { + self._makeDraggable(); + } + if (options.resizable && $.fn.resizable) { + self._makeResizable(); + } + + self._createButtons(options.buttons); + self._isOpen = false; + + if ($.fn.bgiframe) { + uiDialog.bgiframe(); + } + }, + + _init: function() { + if ( this.options.autoOpen ) { + this.open(); + } + }, + + destroy: function() { + var self = this; + + if (self.overlay) { + self.overlay.destroy(); + } + self.uiDialog.hide(); + self.element + .unbind('.dialog') + .removeData('dialog') + .removeClass('ui-dialog-content ui-widget-content') + .hide().appendTo('body'); + self.uiDialog.remove(); + + if (self.originalTitle) { + self.element.attr('title', self.originalTitle); + } + + return self; + }, + + widget: function() { + return this.uiDialog; + }, + + close: function(event) { + var self = this, + maxZ, thisZ; + + if (false === self._trigger('beforeClose', event)) { + return; + } + + if (self.overlay) { + self.overlay.destroy(); + } + self.uiDialog.unbind('keypress.ui-dialog'); + + self._isOpen = false; + + if (self.options.hide) { + self.uiDialog.hide(self.options.hide, function() { + self._trigger('close', event); + }); + } else { + self.uiDialog.hide(); + self._trigger('close', event); + } + + $.ui.dialog.overlay.resize(); + + // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) + if (self.options.modal) { + maxZ = 0; + $('.ui-dialog').each(function() { + if (this !== self.uiDialog[0]) { + thisZ = $(this).css('z-index'); + if(!isNaN(thisZ)) { + maxZ = Math.max(maxZ, thisZ); + } + } + }); + $.ui.dialog.maxZ = maxZ; + } + + return self; + }, + + isOpen: function() { + return this._isOpen; + }, + + // the force parameter allows us to move modal dialogs to their correct + // position on open + moveToTop: function(force, event) { + var self = this, + options = self.options, + saveScroll; + + if ((options.modal && !force) || + (!options.stack && !options.modal)) { + return self._trigger('focus', event); + } + + if (options.zIndex > $.ui.dialog.maxZ) { + $.ui.dialog.maxZ = options.zIndex; + } + if (self.overlay) { + $.ui.dialog.maxZ += 1; + self.overlay.$el.css('z-index', $.ui.dialog.overlay.maxZ = $.ui.dialog.maxZ); + } + + //Save and then restore scroll since Opera 9.5+ resets when parent z-Index is changed. + // http://ui.jquery.com/bugs/ticket/3193 + saveScroll = { scrollTop: self.element.attr('scrollTop'), scrollLeft: self.element.attr('scrollLeft') }; + $.ui.dialog.maxZ += 1; + self.uiDialog.css('z-index', $.ui.dialog.maxZ); + self.element.attr(saveScroll); + self._trigger('focus', event); + + return self; + }, + + open: function() { + if (this._isOpen) { return; } + + var self = this, + options = self.options, + uiDialog = self.uiDialog; + + self.overlay = options.modal ? new $.ui.dialog.overlay(self) : null; + self._size(); + self._position(options.position); + uiDialog.show(options.show); + self.moveToTop(true); + + // prevent tabbing out of modal dialogs + if (options.modal) { + uiDialog.bind('keypress.ui-dialog', function(event) { + if (event.keyCode !== $.ui.keyCode.TAB) { + return; + } + + var tabbables = $(':tabbable', this), + first = tabbables.filter(':first'), + last = tabbables.filter(':last'); + + if (event.target === last[0] && !event.shiftKey) { + first.focus(1); + return false; + } else if (event.target === first[0] && event.shiftKey) { + last.focus(1); + return false; + } + }); + } + + // set focus to the first tabbable element in the content area or the first button + // if there are no tabbable elements, set focus on the dialog itself + $(self.element.find(':tabbable').get().concat( + uiDialog.find('.ui-dialog-buttonpane :tabbable').get().concat( + uiDialog.get()))).eq(0).focus(); + + self._isOpen = true; + self._trigger('open'); + + return self; + }, + + _createButtons: function(buttons) { + var self = this, + hasButtons = false, + uiDialogButtonPane = $('
      ') + .addClass( + 'ui-dialog-buttonpane ' + + 'ui-widget-content ' + + 'ui-helper-clearfix' + ), + uiButtonSet = $( "
      " ) + .addClass( "ui-dialog-buttonset" ) + .appendTo( uiDialogButtonPane ); + + // if we already have a button pane, remove it + self.uiDialog.find('.ui-dialog-buttonpane').remove(); + + if (typeof buttons === 'object' && buttons !== null) { + $.each(buttons, function() { + return !(hasButtons = true); + }); + } + if (hasButtons) { + $.each(buttons, function(name, props) { + props = $.isFunction( props ) ? + { click: props, text: name } : + props; + var button = $('') + .attr( props, true ) + .unbind('click') + .click(function() { + props.click.apply(self.element[0], arguments); + }) + .appendTo(uiButtonSet); + if ($.fn.button) { + button.button(); + } + }); + uiDialogButtonPane.appendTo(self.uiDialog); + } + }, + + _makeDraggable: function() { + var self = this, + options = self.options, + doc = $(document), + heightBeforeDrag; + + function filteredUi(ui) { + return { + position: ui.position, + offset: ui.offset + }; + } + + self.uiDialog.draggable({ + cancel: '.ui-dialog-content, .ui-dialog-titlebar-close', + handle: '.ui-dialog-titlebar', + containment: 'document', + start: function(event, ui) { + heightBeforeDrag = options.height === "auto" ? "auto" : $(this).height(); + $(this).height($(this).height()).addClass("ui-dialog-dragging"); + self._trigger('dragStart', event, filteredUi(ui)); + }, + drag: function(event, ui) { + self._trigger('drag', event, filteredUi(ui)); + }, + stop: function(event, ui) { + options.position = [ui.position.left - doc.scrollLeft(), + ui.position.top - doc.scrollTop()]; + $(this).removeClass("ui-dialog-dragging").height(heightBeforeDrag); + self._trigger('dragStop', event, filteredUi(ui)); + $.ui.dialog.overlay.resize(); + } + }); + }, + + _makeResizable: function(handles) { + handles = (handles === undefined ? this.options.resizable : handles); + var self = this, + options = self.options, + // .ui-resizable has position: relative defined in the stylesheet + // but dialogs have to use absolute or fixed positioning + position = self.uiDialog.css('position'), + resizeHandles = (typeof handles === 'string' ? + handles : + 'n,e,s,w,se,sw,ne,nw' + ); + + function filteredUi(ui) { + return { + originalPosition: ui.originalPosition, + originalSize: ui.originalSize, + position: ui.position, + size: ui.size + }; + } + + self.uiDialog.resizable({ + cancel: '.ui-dialog-content', + containment: 'document', + alsoResize: self.element, + maxWidth: options.maxWidth, + maxHeight: options.maxHeight, + minWidth: options.minWidth, + minHeight: self._minHeight(), + handles: resizeHandles, + start: function(event, ui) { + $(this).addClass("ui-dialog-resizing"); + self._trigger('resizeStart', event, filteredUi(ui)); + }, + resize: function(event, ui) { + self._trigger('resize', event, filteredUi(ui)); + }, + stop: function(event, ui) { + $(this).removeClass("ui-dialog-resizing"); + options.height = $(this).height(); + options.width = $(this).width(); + self._trigger('resizeStop', event, filteredUi(ui)); + $.ui.dialog.overlay.resize(); + } + }) + .css('position', position) + .find('.ui-resizable-se').addClass('ui-icon ui-icon-grip-diagonal-se'); + }, + + _minHeight: function() { + var options = this.options; + + if (options.height === 'auto') { + return options.minHeight; + } else { + return Math.min(options.minHeight, options.height); + } + }, + + _position: function(position) { + var myAt = [], + offset = [0, 0], + isVisible; + + if (position) { + // deep extending converts arrays to objects in jQuery <= 1.3.2 :-( + // if (typeof position == 'string' || $.isArray(position)) { + // myAt = $.isArray(position) ? position : position.split(' '); + + if (typeof position === 'string' || (typeof position === 'object' && '0' in position)) { + myAt = position.split ? position.split(' ') : [position[0], position[1]]; + if (myAt.length === 1) { + myAt[1] = myAt[0]; + } + + $.each(['left', 'top'], function(i, offsetPosition) { + if (+myAt[i] === myAt[i]) { + offset[i] = myAt[i]; + myAt[i] = offsetPosition; + } + }); + + position = { + my: myAt.join(" "), + at: myAt.join(" "), + offset: offset.join(" ") + }; + } + + position = $.extend({}, $.ui.dialog.prototype.options.position, position); + } else { + position = $.ui.dialog.prototype.options.position; + } + + // need to show the dialog to get the actual offset in the position plugin + isVisible = this.uiDialog.is(':visible'); + if (!isVisible) { + this.uiDialog.show(); + } + this.uiDialog + // workaround for jQuery bug #5781 http://dev.jquery.com/ticket/5781 + .css({ top: 0, left: 0 }) + .position($.extend({ of: window }, position)); + if (!isVisible) { + this.uiDialog.hide(); + } + }, + + _setOptions: function( options ) { + var self = this, + resizableOptions = {}, + resize = false; + + $.each( options, function( key, value ) { + self._setOption( key, value ); + + if ( key in sizeRelatedOptions ) { + resize = true; + } + if ( key in resizableRelatedOptions ) { + resizableOptions[ key ] = value; + } + }); + + if ( resize ) { + this._size(); + } + if ( this.uiDialog.is( ":data(resizable)" ) ) { + this.uiDialog.resizable( "option", resizableOptions ); + } + }, + + _setOption: function(key, value){ + var self = this, + uiDialog = self.uiDialog; + + switch (key) { + //handling of deprecated beforeclose (vs beforeClose) option + //Ticket #4669 http://dev.jqueryui.com/ticket/4669 + //TODO: remove in 1.9pre + case "beforeclose": + key = "beforeClose"; + break; + case "buttons": + self._createButtons(value); + break; + case "closeText": + // ensure that we always pass a string + self.uiDialogTitlebarCloseText.text("" + value); + break; + case "dialogClass": + uiDialog + .removeClass(self.options.dialogClass) + .addClass(uiDialogClasses + value); + break; + case "disabled": + if (value) { + uiDialog.addClass('ui-dialog-disabled'); + } else { + uiDialog.removeClass('ui-dialog-disabled'); + } + break; + case "draggable": + var isDraggable = uiDialog.is( ":data(draggable)" ); + if ( isDraggable && !value ) { + uiDialog.draggable( "destroy" ); + } + + if ( !isDraggable && value ) { + self._makeDraggable(); + } + break; + case "position": + self._position(value); + break; + case "resizable": + // currently resizable, becoming non-resizable + var isResizable = uiDialog.is( ":data(resizable)" ); + if (isResizable && !value) { + uiDialog.resizable('destroy'); + } + + // currently resizable, changing handles + if (isResizable && typeof value === 'string') { + uiDialog.resizable('option', 'handles', value); + } + + // currently non-resizable, becoming resizable + if (!isResizable && value !== false) { + self._makeResizable(value); + } + break; + case "title": + // convert whatever was passed in o a string, for html() to not throw up + $(".ui-dialog-title", self.uiDialogTitlebar).html("" + (value || ' ')); + break; + } + + $.Widget.prototype._setOption.apply(self, arguments); + }, + + _size: function() { + /* If the user has resized the dialog, the .ui-dialog and .ui-dialog-content + * divs will both have width and height set, so we need to reset them + */ + var options = this.options, + nonContentHeight, + minContentHeight, + isVisible = this.uiDialog.is( ":visible" ); + + // reset content sizing + this.element.show().css({ + width: 'auto', + minHeight: 0, + height: 0 + }); + + if (options.minWidth > options.width) { + options.width = options.minWidth; + } + + // reset wrapper sizing + // determine the height of all the non-content elements + nonContentHeight = this.uiDialog.css({ + height: 'auto', + width: options.width + }) + .height(); + minContentHeight = Math.max( 0, options.minHeight - nonContentHeight ); + + if ( options.height === "auto" ) { + // only needed for IE6 support + if ( $.support.minHeight ) { + this.element.css({ + minHeight: minContentHeight, + height: "auto" + }); + } else { + this.uiDialog.show(); + var autoHeight = this.element.css( "height", "auto" ).height(); + if ( !isVisible ) { + this.uiDialog.hide(); + } + this.element.height( Math.max( autoHeight, minContentHeight ) ); + } + } else { + this.element.height( Math.max( options.height - nonContentHeight, 0 ) ); + } + + if (this.uiDialog.is(':data(resizable)')) { + this.uiDialog.resizable('option', 'minHeight', this._minHeight()); + } + } +}); + +$.extend($.ui.dialog, { + version: "1.8.11", + + uuid: 0, + maxZ: 0, + + getTitleId: function($el) { + var id = $el.attr('id'); + if (!id) { + this.uuid += 1; + id = this.uuid; + } + return 'ui-dialog-title-' + id; + }, + + overlay: function(dialog) { + this.$el = $.ui.dialog.overlay.create(dialog); + } +}); + +$.extend($.ui.dialog.overlay, { + instances: [], + // reuse old instances due to IE memory leak with alpha transparency (see #5185) + oldInstances: [], + maxZ: 0, + events: $.map('focus,mousedown,mouseup,keydown,keypress,click'.split(','), + function(event) { return event + '.dialog-overlay'; }).join(' '), + create: function(dialog) { + if (this.instances.length === 0) { + // prevent use of anchors and inputs + // we use a setTimeout in case the overlay is created from an + // event that we're going to be cancelling (see #2804) + setTimeout(function() { + // handle $(el).dialog().dialog('close') (see #4065) + if ($.ui.dialog.overlay.instances.length) { + $(document).bind($.ui.dialog.overlay.events, function(event) { + // stop events if the z-index of the target is < the z-index of the overlay + // we cannot return true when we don't want to cancel the event (#3523) + if ($(event.target).zIndex() < $.ui.dialog.overlay.maxZ) { + return false; + } + }); + } + }, 1); + + // allow closing by pressing the escape key + $(document).bind('keydown.dialog-overlay', function(event) { + if (dialog.options.closeOnEscape && event.keyCode && + event.keyCode === $.ui.keyCode.ESCAPE) { + + dialog.close(event); + event.preventDefault(); + } + }); + + // handle window resize + $(window).bind('resize.dialog-overlay', $.ui.dialog.overlay.resize); + } + + var $el = (this.oldInstances.pop() || $('
      ').addClass('ui-widget-overlay')) + .appendTo(document.body) + .css({ + width: this.width(), + height: this.height() + }); + + if ($.fn.bgiframe) { + $el.bgiframe(); + } + + this.instances.push($el); + return $el; + }, + + destroy: function($el) { + var indexOf = $.inArray($el, this.instances); + if (indexOf != -1){ + this.oldInstances.push(this.instances.splice(indexOf, 1)[0]); + } + + if (this.instances.length === 0) { + $([document, window]).unbind('.dialog-overlay'); + } + + $el.remove(); + + // adjust the maxZ to allow other modal dialogs to continue to work (see #4309) + var maxZ = 0; + $.each(this.instances, function() { + maxZ = Math.max(maxZ, this.css('z-index')); + }); + this.maxZ = maxZ; + }, + + height: function() { + var scrollHeight, + offsetHeight; + // handle IE 6 + if ($.browser.msie && $.browser.version < 7) { + scrollHeight = Math.max( + document.documentElement.scrollHeight, + document.body.scrollHeight + ); + offsetHeight = Math.max( + document.documentElement.offsetHeight, + document.body.offsetHeight + ); + + if (scrollHeight < offsetHeight) { + return $(window).height() + 'px'; + } else { + return scrollHeight + 'px'; + } + // handle "good" browsers + } else { + return $(document).height() + 'px'; + } + }, + + width: function() { + var scrollWidth, + offsetWidth; + // handle IE 6 + if ($.browser.msie && $.browser.version < 7) { + scrollWidth = Math.max( + document.documentElement.scrollWidth, + document.body.scrollWidth + ); + offsetWidth = Math.max( + document.documentElement.offsetWidth, + document.body.offsetWidth + ); + + if (scrollWidth < offsetWidth) { + return $(window).width() + 'px'; + } else { + return scrollWidth + 'px'; + } + // handle "good" browsers + } else { + return $(document).width() + 'px'; + } + }, + + resize: function() { + /* If the dialog is draggable and the user drags it past the + * right edge of the window, the document becomes wider so we + * need to stretch the overlay. If the user then drags the + * dialog back to the left, the document will become narrower, + * so we need to shrink the overlay to the appropriate size. + * This is handled by shrinking the overlay before setting it + * to the full document size. + */ + var $overlays = $([]); + $.each($.ui.dialog.overlay.instances, function() { + $overlays = $overlays.add(this); + }); + + $overlays.css({ + width: 0, + height: 0 + }).css({ + width: $.ui.dialog.overlay.width(), + height: $.ui.dialog.overlay.height() + }); + } +}); + +$.extend($.ui.dialog.overlay.prototype, { + destroy: function() { + $.ui.dialog.overlay.destroy(this.$el); + } +}); + +}(jQuery)); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.draggable.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.draggable.js new file mode 100644 index 00000000000..5f367616071 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.draggable.js @@ -0,0 +1,799 @@ +/* + * jQuery UI Draggable 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.widget("ui.draggable", $.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')) return; + this.element + .removeData("draggable") + .unbind(".draggable") + .removeClass("ui-draggable" + + " ui-draggable-dragging" + + " ui-draggable-disabled"); + this._mouseDestroy(); + + return this; + }, + + _mouseCapture: function(event) { + + var o = this.options; + + // among others, prevent a drag on a resizable-handle + if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle')) + return false; + + //Quit if we're not on a valid handle + this.handle = this._getHandle(event); + if (!this.handle) + return false; + + return true; + + }, + + _mouseStart: function(event) { + + var o = this.options; + + //Create and append the visible helper + this.helper = this._createHelper(event); + + //Cache the helper size + this._cacheHelperProportions(); + + //If ddmanager is used for droppables, set the global draggable + if($.ui.ddmanager) + $.ui.ddmanager.current = this; + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Store the helper's css position + this.cssPosition = this.helper.css("position"); + this.scrollParent = this.helper.scrollParent(); + + //The element's absolute position on the page minus margins + this.offset = this.positionAbs = this.element.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + //Generate the original position + this.originalPosition = this.position = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Set a containment if given in the options + if(o.containment) + this._setContainment(); + + //Trigger event + callbacks + if(this._trigger("start", event) === false) { + this._clear(); + return false; + } + + //Recache the helper size + this._cacheHelperProportions(); + + //Prepare the droppable offsets + if ($.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + + this.helper.addClass("ui-draggable-dragging"); + this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + }, + + _mouseDrag: function(event, noPropagation) { + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + //Call plugins and callbacks and use the resulting position if something is returned + if (!noPropagation) { + var ui = this._uiHash(); + if(this._trigger('drag', event, ui) === false) { + this._mouseUp({}); + return false; + } + this.position = ui.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'; + if($.ui.ddmanager) $.ui.ddmanager.drag(this, event); + + return false; + }, + + _mouseStop: function(event) { + + //If we are using droppables, inform the manager about the drop + var dropped = false; + if ($.ui.ddmanager && !this.options.dropBehaviour) + dropped = $.ui.ddmanager.drop(this, event); + + //if a drop comes from outside (a sortable) + if(this.dropped) { + dropped = this.dropped; + this.dropped = false; + } + + //if the original element is removed, don't bother to continue if helper is set to "original" + if((!this.element[0] || !this.element[0].parentNode) && this.options.helper == "original") + return false; + + if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) { + var self = this; + $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() { + if(self._trigger("stop", event) !== false) { + self._clear(); + } + }); + } else { + if(this._trigger("stop", event) !== false) { + this._clear(); + } + } + + return false; + }, + + cancel: function() { + + if(this.helper.is(".ui-draggable-dragging")) { + this._mouseUp({}); + } else { + this._clear(); + } + + return this; + + }, + + _getHandle: function(event) { + + var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false; + $(this.options.handle, this.element) + .find("*") + .andSelf() + .each(function() { + if(this == event.target) handle = true; + }); + + return handle; + + }, + + _createHelper: function(event) { + + var o = this.options; + var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element); + + if(!helper.parents('body').length) + helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo)); + + if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position"))) + helper.css("position", "absolute"); + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj == 'string') { + obj = obj.split(' '); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ('left' in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ('right' in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ('top' in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ('bottom' in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent(); + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information + || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix + po = { top: 0, left: 0 }; + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition == "relative") { + var p = this.element.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.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), + right: (parseInt(this.element.css("marginRight"),10) || 0), + bottom: (parseInt(this.element.css("marginBottom"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var o = this.options; + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + (o.containment == 'document' ? 0 : $(window).scrollLeft()) - this.offset.relative.left - this.offset.parent.left, + (o.containment == 'document' ? 0 : $(window).scrollTop()) - this.offset.relative.top - this.offset.parent.top, + (o.containment == 'document' ? 0 : $(window).scrollLeft()) + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left, + (o.containment == 'document' ? 0 : $(window).scrollTop()) + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top + ]; + + if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) { + var ce = $(o.containment)[0]; if(!ce) return; + var co = $(o.containment).offset(); + var over = ($(ce).css("overflow") != 'hidden'); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0), + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0), + co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left - this.margins.right, + co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top - this.margins.bottom + ]; + } else if(o.containment.constructor == Array) { + this.containment = o.containment; + } + + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + return { + top: ( + pos.top // The absolute mouse position + + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod) + ), + left: ( + pos.left // The absolute mouse position + + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod) + ) + }; + + }, + + _generatePosition: function(event) { + + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + var pageX = event.pageX; + var pageY = event.pageY; + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if(this.originalPosition) { //If we are not dragging yet, we won't check for options + + if(this.containment) { + if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left; + if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top; + if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left; + if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top; + } + + if(o.grid) { + var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; + pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; + pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) )) + ), + left: ( + pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && $.browser.version < 526 && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() )) + ) + }; + + }, + + _clear: function() { + this.helper.removeClass("ui-draggable-dragging"); + if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove(); + //if($.ui.ddmanager) $.ui.ddmanager.current = null; + this.helper = null; + this.cancelHelperRemoval = false; + }, + + // From now on bulk stuff - mainly helpers + + _trigger: function(type, event, ui) { + ui = ui || this._uiHash(); + $.ui.plugin.call(this, type, [event, ui]); + if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins + return $.Widget.prototype._trigger.call(this, type, event, ui); + }, + + plugins: {}, + + _uiHash: function(event) { + return { + helper: this.helper, + position: this.position, + originalPosition: this.originalPosition, + offset: this.positionAbs + }; + } + +}); + +$.extend($.ui.draggable, { + version: "1.8.11" +}); + +$.ui.plugin.add("draggable", "connectToSortable", { + start: function(event, ui) { + + var inst = $(this).data("draggable"), o = inst.options, + uiSortable = $.extend({}, ui, { item: inst.element }); + inst.sortables = []; + $(o.connectToSortable).each(function() { + var sortable = $.data(this, 'sortable'); + if (sortable && !sortable.options.disabled) { + inst.sortables.push({ + instance: sortable, + shouldRevert: sortable.options.revert + }); + sortable.refreshPositions(); // Call the sortable's refreshPositions at drag start to refresh the containerCache since the sortable container cache is used in drag and needs to be up to date (this will ensure it's initialised as well as being kept in step with any changes that might have happened on the page). + sortable._trigger("activate", event, uiSortable); + } + }); + + }, + stop: function(event, ui) { + + //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper + var inst = $(this).data("draggable"), + uiSortable = $.extend({}, ui, { item: inst.element }); + + $.each(inst.sortables, function() { + if(this.instance.isOver) { + + this.instance.isOver = 0; + + inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance + this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work) + + //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid' + if(this.shouldRevert) this.instance.options.revert = true; + + //Trigger the stop of the sortable + this.instance._mouseStop(event); + + this.instance.options.helper = this.instance.options._helper; + + //If the helper has been the original item, restore properties in the sortable + if(inst.options.helper == 'original') + this.instance.currentItem.css({ top: 'auto', left: 'auto' }); + + } else { + this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance + this.instance._trigger("deactivate", event, uiSortable); + } + + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("draggable"), self = this; + + var checkPos = function(o) { + var dyClick = this.offset.click.top, dxClick = this.offset.click.left; + var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left; + var itemHeight = o.height, itemWidth = o.width; + var itemTop = o.top, itemLeft = o.left; + + return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth); + }; + + $.each(inst.sortables, function(i) { + + //Copy over some variables to allow calling the sortable's native _intersectsWith + this.instance.positionAbs = inst.positionAbs; + this.instance.helperProportions = inst.helperProportions; + this.instance.offset.click = inst.offset.click; + + if(this.instance._intersectsWith(this.instance.containerCache)) { + + //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once + if(!this.instance.isOver) { + + this.instance.isOver = 1; + //Now we fake the start of dragging for the sortable instance, + //by cloning the list group item, appending it to the sortable and using it as inst.currentItem + //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one) + this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true); + this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it + this.instance.options.helper = function() { return ui.helper[0]; }; + + event.target = this.instance.currentItem[0]; + this.instance._mouseCapture(event, true); + this.instance._mouseStart(event, true, true); + + //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes + this.instance.offset.click.top = inst.offset.click.top; + this.instance.offset.click.left = inst.offset.click.left; + this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left; + this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top; + + inst._trigger("toSortable", event); + inst.dropped = this.instance.element; //draggable revert needs that + //hack so receive/update callbacks work (mostly) + inst.currentItem = inst.element; + this.instance.fromOutside = inst; + + } + + //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable + if(this.instance.currentItem) this.instance._mouseDrag(event); + + } else { + + //If it doesn't intersect with the sortable, and it intersected before, + //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval + if(this.instance.isOver) { + + this.instance.isOver = 0; + this.instance.cancelHelperRemoval = true; + + //Prevent reverting on this forced stop + this.instance.options.revert = false; + + // The out event needs to be triggered independently + this.instance._trigger('out', event, this.instance._uiHash(this.instance)); + + this.instance._mouseStop(event, true); + this.instance.options.helper = this.instance.options._helper; + + //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size + this.instance.currentItem.remove(); + if(this.instance.placeholder) this.instance.placeholder.remove(); + + inst._trigger("fromSortable", event); + inst.dropped = false; //draggable revert needs that + } + + }; + + }); + + } +}); + +$.ui.plugin.add("draggable", "cursor", { + start: function(event, ui) { + var t = $('body'), o = $(this).data('draggable').options; + if (t.css("cursor")) o._cursor = t.css("cursor"); + t.css("cursor", o.cursor); + }, + stop: function(event, ui) { + var o = $(this).data('draggable').options; + if (o._cursor) $('body').css("cursor", o._cursor); + } +}); + +$.ui.plugin.add("draggable", "iframeFix", { + start: function(event, ui) { + var o = $(this).data('draggable').options; + $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() { + $('
      ') + .css({ + width: this.offsetWidth+"px", height: this.offsetHeight+"px", + position: "absolute", opacity: "0.001", zIndex: 1000 + }) + .css($(this).offset()) + .appendTo("body"); + }); + }, + stop: function(event, ui) { + $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers + } +}); + +$.ui.plugin.add("draggable", "opacity", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data('draggable').options; + if(t.css("opacity")) o._opacity = t.css("opacity"); + t.css('opacity', o.opacity); + }, + stop: function(event, ui) { + var o = $(this).data('draggable').options; + if(o._opacity) $(ui.helper).css('opacity', o._opacity); + } +}); + +$.ui.plugin.add("draggable", "scroll", { + start: function(event, ui) { + var i = $(this).data("draggable"); + if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset(); + }, + drag: function(event, ui) { + + var i = $(this).data("draggable"), o = i.options, scrolled = false; + + if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') { + + if(!o.axis || o.axis != 'x') { + if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed; + else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity) + i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed; + } + + if(!o.axis || o.axis != 'y') { + if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed; + else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity) + i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed; + } + + } else { + + if(!o.axis || o.axis != 'x') { + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + } + + if(!o.axis || o.axis != 'y') { + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + } + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(i, event); + + } +}); + +$.ui.plugin.add("draggable", "snap", { + start: function(event, ui) { + + var i = $(this).data("draggable"), o = i.options; + i.snapElements = []; + + $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() { + var $t = $(this); var $o = $t.offset(); + if(this != i.element[0]) i.snapElements.push({ + item: this, + width: $t.outerWidth(), height: $t.outerHeight(), + top: $o.top, left: $o.left + }); + }); + + }, + drag: function(event, ui) { + + var inst = $(this).data("draggable"), o = inst.options; + var d = o.snapTolerance; + + var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width, + y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height; + + for (var i = inst.snapElements.length - 1; i >= 0; i--){ + + var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width, + t = inst.snapElements[i].top, b = t + inst.snapElements[i].height; + + //Yes, I know, this is insane ;) + if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) { + if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + inst.snapElements[i].snapping = false; + continue; + } + + if(o.snapMode != 'inner') { + var ts = Math.abs(t - y2) <= d; + var bs = Math.abs(b - y1) <= d; + var ls = Math.abs(l - x2) <= d; + var rs = Math.abs(r - x1) <= d; + if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top; + if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left; + if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left; + } + + var first = (ts || bs || ls || rs); + + if(o.snapMode != 'outer') { + var ts = Math.abs(t - y1) <= d; + var bs = Math.abs(b - y2) <= d; + var ls = Math.abs(l - x1) <= d; + var rs = Math.abs(r - x2) <= d; + if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top; + if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top; + if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left; + if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left; + } + + if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) + (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item }))); + inst.snapElements[i].snapping = (ts || bs || ls || rs || first); + + }; + + } +}); + +$.ui.plugin.add("draggable", "stack", { + start: function(event, ui) { + + var o = $(this).data("draggable").options; + + var group = $.makeArray($(o.stack)).sort(function(a,b) { + return (parseInt($(a).css("zIndex"),10) || 0) - (parseInt($(b).css("zIndex"),10) || 0); + }); + if (!group.length) { return; } + + var min = parseInt(group[0].style.zIndex) || 0; + $(group).each(function(i) { + this.style.zIndex = min + i; + }); + + this[0].style.zIndex = min + group.length; + + } +}); + +$.ui.plugin.add("draggable", "zIndex", { + start: function(event, ui) { + var t = $(ui.helper), o = $(this).data("draggable").options; + if(t.css("zIndex")) o._zIndex = t.css("zIndex"); + t.css('zIndex', o.zIndex); + }, + stop: function(event, ui) { + var o = $(this).data("draggable").options; + if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex); + } +}); + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.droppable.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.droppable.js new file mode 100644 index 00000000000..7d6b8975898 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.droppable.js @@ -0,0 +1,285 @@ +/* + * jQuery UI Droppable 1.8.11 + * + * Copyright 2011, 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/Droppables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + * jquery.ui.mouse.js + * jquery.ui.draggable.js + */ +(function( $, undefined ) { + +$.widget("ui.droppable", { + widgetEventPrefix: "drop", + options: { + accept: '*', + activeClass: false, + addClasses: true, + greedy: false, + hoverClass: false, + scope: 'default', + tolerance: 'intersect' + }, + _create: function() { + + var o = this.options, accept = o.accept; + this.isover = 0; this.isout = 1; + + this.accept = $.isFunction(accept) ? accept : function(d) { + return d.is(accept); + }; + + //Store the droppable's proportions + this.proportions = { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }; + + // Add the reference and positions to the manager + $.ui.ddmanager.droppables[o.scope] = $.ui.ddmanager.droppables[o.scope] || []; + $.ui.ddmanager.droppables[o.scope].push(this); + + (o.addClasses && this.element.addClass("ui-droppable")); + + }, + + destroy: function() { + var drop = $.ui.ddmanager.droppables[this.options.scope]; + for ( var i = 0; i < drop.length; i++ ) + if ( drop[i] == this ) + drop.splice(i, 1); + + this.element + .removeClass("ui-droppable ui-droppable-disabled") + .removeData("droppable") + .unbind(".droppable"); + + return this; + }, + + _setOption: function(key, value) { + + if(key == 'accept') { + this.accept = $.isFunction(value) ? value : function(d) { + return d.is(value); + }; + } + $.Widget.prototype._setOption.apply(this, arguments); + }, + + _activate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) this.element.addClass(this.options.activeClass); + (draggable && this._trigger('activate', event, this.ui(draggable))); + }, + + _deactivate: function(event) { + var draggable = $.ui.ddmanager.current; + if(this.options.activeClass) this.element.removeClass(this.options.activeClass); + (draggable && this._trigger('deactivate', event, this.ui(draggable))); + }, + + _over: function(event) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) this.element.addClass(this.options.hoverClass); + this._trigger('over', event, this.ui(draggable)); + } + + }, + + _out: function(event) { + + var draggable = $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return; // Bail if draggable and droppable are same element + + if (this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass); + this._trigger('out', event, this.ui(draggable)); + } + + }, + + _drop: function(event,custom) { + + var draggable = custom || $.ui.ddmanager.current; + if (!draggable || (draggable.currentItem || draggable.element)[0] == this.element[0]) return false; // Bail if draggable and droppable are same element + + var childrenIntersection = false; + this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function() { + var inst = $.data(this, 'droppable'); + if( + inst.options.greedy + && !inst.options.disabled + && inst.options.scope == draggable.options.scope + && inst.accept.call(inst.element[0], (draggable.currentItem || draggable.element)) + && $.ui.intersect(draggable, $.extend(inst, { offset: inst.element.offset() }), inst.options.tolerance) + ) { childrenIntersection = true; return false; } + }); + if(childrenIntersection) return false; + + if(this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + if(this.options.activeClass) this.element.removeClass(this.options.activeClass); + if(this.options.hoverClass) this.element.removeClass(this.options.hoverClass); + this._trigger('drop', event, this.ui(draggable)); + return this.element; + } + + return false; + + }, + + ui: function(c) { + return { + draggable: (c.currentItem || c.element), + helper: c.helper, + position: c.position, + offset: c.positionAbs + }; + } + +}); + +$.extend($.ui.droppable, { + version: "1.8.11" +}); + +$.ui.intersect = function(draggable, droppable, toleranceMode) { + + if (!droppable.offset) return false; + + var x1 = (draggable.positionAbs || draggable.position.absolute).left, x2 = x1 + draggable.helperProportions.width, + y1 = (draggable.positionAbs || draggable.position.absolute).top, y2 = y1 + draggable.helperProportions.height; + var l = droppable.offset.left, r = l + droppable.proportions.width, + t = droppable.offset.top, b = t + droppable.proportions.height; + + switch (toleranceMode) { + case 'fit': + return (l <= x1 && x2 <= r + && t <= y1 && y2 <= b); + break; + case 'intersect': + return (l < x1 + (draggable.helperProportions.width / 2) // Right Half + && x2 - (draggable.helperProportions.width / 2) < r // Left Half + && t < y1 + (draggable.helperProportions.height / 2) // Bottom Half + && y2 - (draggable.helperProportions.height / 2) < b ); // Top Half + break; + case 'pointer': + var draggableLeft = ((draggable.positionAbs || draggable.position.absolute).left + (draggable.clickOffset || draggable.offset.click).left), + draggableTop = ((draggable.positionAbs || draggable.position.absolute).top + (draggable.clickOffset || draggable.offset.click).top), + isOver = $.ui.isOver(draggableTop, draggableLeft, t, l, droppable.proportions.height, droppable.proportions.width); + return isOver; + break; + case 'touch': + return ( + (y1 >= t && y1 <= b) || // Top edge touching + (y2 >= t && y2 <= b) || // Bottom edge touching + (y1 < t && y2 > b) // Surrounded vertically + ) && ( + (x1 >= l && x1 <= r) || // Left edge touching + (x2 >= l && x2 <= r) || // Right edge touching + (x1 < l && x2 > r) // Surrounded horizontally + ); + break; + default: + return false; + break; + } + +}; + +/* + This manager tracks offsets of draggables and droppables +*/ +$.ui.ddmanager = { + current: null, + droppables: { 'default': [] }, + prepareOffsets: function(t, event) { + + var m = $.ui.ddmanager.droppables[t.options.scope] || []; + var type = event ? event.type : null; // workaround for #2317 + var list = (t.currentItem || t.element).find(":data(droppable)").andSelf(); + + droppablesLoop: for (var i = 0; i < m.length; i++) { + + if(m[i].options.disabled || (t && !m[i].accept.call(m[i].element[0],(t.currentItem || t.element)))) continue; //No disabled and non-accepted + for (var j=0; j < list.length; j++) { if(list[j] == m[i].element[0]) { m[i].proportions.height = 0; continue droppablesLoop; } }; //Filter out elements in the current dragged item + m[i].visible = m[i].element.css("display") != "none"; if(!m[i].visible) continue; //If the element is not visible, continue + + if(type == "mousedown") m[i]._activate.call(m[i], event); //Activate the droppable if used directly from draggables + + m[i].offset = m[i].element.offset(); + m[i].proportions = { width: m[i].element[0].offsetWidth, height: m[i].element[0].offsetHeight }; + + } + + }, + drop: function(draggable, event) { + + var dropped = false; + $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { + + if(!this.options) return; + if (!this.options.disabled && this.visible && $.ui.intersect(draggable, this, this.options.tolerance)) + dropped = dropped || this._drop.call(this, event); + + if (!this.options.disabled && this.visible && this.accept.call(this.element[0],(draggable.currentItem || draggable.element))) { + this.isout = 1; this.isover = 0; + this._deactivate.call(this, event); + } + + }); + return dropped; + + }, + drag: function(draggable, event) { + + //If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse. + if(draggable.options.refreshPositions) $.ui.ddmanager.prepareOffsets(draggable, event); + + //Run through all droppables and check their positions based on specific tolerance options + $.each($.ui.ddmanager.droppables[draggable.options.scope] || [], function() { + + if(this.options.disabled || this.greedyChild || !this.visible) return; + var intersects = $.ui.intersect(draggable, this, this.options.tolerance); + + var c = !intersects && this.isover == 1 ? 'isout' : (intersects && this.isover == 0 ? 'isover' : null); + if(!c) return; + + var parentInstance; + if (this.options.greedy) { + var parent = this.element.parents(':data(droppable):eq(0)'); + if (parent.length) { + parentInstance = $.data(parent[0], 'droppable'); + parentInstance.greedyChild = (c == 'isover' ? 1 : 0); + } + } + + // we just moved into a greedy child + if (parentInstance && c == 'isover') { + parentInstance['isover'] = 0; + parentInstance['isout'] = 1; + parentInstance._out.call(parentInstance, event); + } + + this[c] = 1; this[c == 'isout' ? 'isover' : 'isout'] = 0; + this[c == "isover" ? "_over" : "_out"].call(this, event); + + // we just moved out of a greedy child + if (parentInstance && c == 'isout') { + parentInstance['isout'] = 0; + parentInstance['isover'] = 1; + parentInstance._over.call(parentInstance, event); + } + }); + + } +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.mouse.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.mouse.js new file mode 100644 index 00000000000..b8db85ceb0b --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.mouse.js @@ -0,0 +1,156 @@ +/*! + * jQuery UI Mouse 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.widget("ui.mouse", { + options: { + cancel: ':input,option', + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var self = this; + + this.element + .bind('mousedown.'+this.widgetName, function(event) { + return self._mouseDown(event); + }) + .bind('click.'+this.widgetName, function(event) { + if (true === $.data(event.target, self.widgetName + '.preventClickEvent')) { + $.removeData(event.target, self.widgetName + '.preventClickEvent'); + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind('.'+this.widgetName); + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + // TODO: figure out why we have to use originalEvent + event.originalEvent = event.originalEvent || {}; + if (event.originalEvent.mouseHandled) { return; } + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var self = this, + btnIsLeft = (event.which == 1), + elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + self.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if (true === $.data(event.target, this.widgetName + '.preventClickEvent')) { + $.removeData(event.target, this.widgetName + '.preventClickEvent'); + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return self._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return self._mouseUp(event); + }; + $(document) + .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .bind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + event.preventDefault(); + event.originalEvent.mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.browser.msie && !(document.documentMode >= 9) && !event.button) { + return this._mouseUp(event); + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + $(document) + .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate) + .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate); + + if (this._mouseStarted) { + this._mouseStarted = false; + + if (event.target == this._mouseDownEvent.target) { + $.data(event.target, this.widgetName + '.preventClickEvent', true); + } + + this._mouseStop(event); + } + + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(event) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(event) {}, + _mouseDrag: function(event) {}, + _mouseStop: function(event) {}, + _mouseCapture: function(event) { return true; } +}); + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.position.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.position.js new file mode 100644 index 00000000000..b66e59ef8d2 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.position.js @@ -0,0 +1,252 @@ +/* + * jQuery UI Position 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.ui = $.ui || {}; + +var horizontalPositions = /left|center|right/, + verticalPositions = /top|center|bottom/, + center = "center", + _position = $.fn.position, + _offset = $.fn.offset; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var target = $( options.of ), + targetElem = target[0], + collision = ( options.collision || "flip" ).split( " " ), + offset = options.offset ? options.offset.split( " " ) : [ 0, 0 ], + targetWidth, + targetHeight, + basePosition; + + if ( targetElem.nodeType === 9 ) { + targetWidth = target.width(); + targetHeight = target.height(); + basePosition = { top: 0, left: 0 }; + // TODO: use $.isWindow() in 1.9 + } else if ( targetElem.setTimeout ) { + targetWidth = target.width(); + targetHeight = target.height(); + basePosition = { top: target.scrollTop(), left: target.scrollLeft() }; + } else if ( targetElem.preventDefault ) { + // force left top to allow flipping + options.at = "left top"; + targetWidth = targetHeight = 0; + basePosition = { top: options.of.pageY, left: options.of.pageX }; + } else { + targetWidth = target.outerWidth(); + targetHeight = target.outerHeight(); + basePosition = target.offset(); + } + + // force my and at to have valid horizontal and veritcal positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[this] || "" ).split( " " ); + if ( pos.length === 1) { + pos = horizontalPositions.test( pos[0] ) ? + pos.concat( [center] ) : + verticalPositions.test( pos[0] ) ? + [ center ].concat( pos ) : + [ center, center ]; + } + pos[ 0 ] = horizontalPositions.test( pos[0] ) ? pos[ 0 ] : center; + pos[ 1 ] = verticalPositions.test( pos[1] ) ? pos[ 1 ] : center; + options[ this ] = pos; + }); + + // normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + // normalize offset option + offset[ 0 ] = parseInt( offset[0], 10 ) || 0; + if ( offset.length === 1 ) { + offset[ 1 ] = offset[ 0 ]; + } + offset[ 1 ] = parseInt( offset[1], 10 ) || 0; + + if ( options.at[0] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[0] === center ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[1] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[1] === center ) { + basePosition.top += targetHeight / 2; + } + + basePosition.left += offset[ 0 ]; + basePosition.top += offset[ 1 ]; + + return this.each(function() { + var elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseInt( $.curCSS( this, "marginLeft", true ) ) || 0, + marginTop = parseInt( $.curCSS( this, "marginTop", true ) ) || 0, + collisionWidth = elemWidth + marginLeft + + ( parseInt( $.curCSS( this, "marginRight", true ) ) || 0 ), + collisionHeight = elemHeight + marginTop + + ( parseInt( $.curCSS( this, "marginBottom", true ) ) || 0 ), + position = $.extend( {}, basePosition ), + collisionPosition; + + if ( options.my[0] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[0] === center ) { + position.left -= elemWidth / 2; + } + + if ( options.my[1] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[1] === center ) { + position.top -= elemHeight / 2; + } + + // prevent fractions (see #5280) + position.left = Math.round( position.left ); + position.top = Math.round( position.top ); + + collisionPosition = { + left: position.left - marginLeft, + top: position.top - marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[i] ] ) { + $.ui.position[ collision[i] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: offset, + my: options.my, + at: options.at + }); + } + }); + + if ( $.fn.bgiframe ) { + elem.bgiframe(); + } + elem.offset( $.extend( position, { using: options.using } ) ); + }); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var win = $( window ), + over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(); + position.left = over > 0 ? position.left - over : Math.max( position.left - data.collisionPosition.left, position.left ); + }, + top: function( position, data ) { + var win = $( window ), + over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(); + position.top = over > 0 ? position.top - over : Math.max( position.top - data.collisionPosition.top, position.top ); + } + }, + + flip: { + left: function( position, data ) { + if ( data.at[0] === center ) { + return; + } + var win = $( window ), + over = data.collisionPosition.left + data.collisionWidth - win.width() - win.scrollLeft(), + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + -data.targetWidth, + offset = -2 * data.offset[ 0 ]; + position.left += data.collisionPosition.left < 0 ? + myOffset + atOffset + offset : + over > 0 ? + myOffset + atOffset + offset : + 0; + }, + top: function( position, data ) { + if ( data.at[1] === center ) { + return; + } + var win = $( window ), + over = data.collisionPosition.top + data.collisionHeight - win.height() - win.scrollTop(), + myOffset = data.my[ 1 ] === "top" ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + -data.targetHeight, + offset = -2 * data.offset[ 1 ]; + position.top += data.collisionPosition.top < 0 ? + myOffset + atOffset + offset : + over > 0 ? + myOffset + atOffset + offset : + 0; + } + } +}; + +// offset setter from jQuery 1.4 +if ( !$.offset.setOffset ) { + $.offset.setOffset = function( elem, options ) { + // set position first, in-case top/left are set even on static elem + if ( /static/.test( $.curCSS( elem, "position" ) ) ) { + elem.style.position = "relative"; + } + var curElem = $( elem ), + curOffset = curElem.offset(), + curTop = parseInt( $.curCSS( elem, "top", true ), 10 ) || 0, + curLeft = parseInt( $.curCSS( elem, "left", true ), 10) || 0, + props = { + top: (options.top - curOffset.top) + curTop, + left: (options.left - curOffset.left) + curLeft + }; + + if ( 'using' in options ) { + options.using.call( elem, props ); + } else { + curElem.css( props ); + } + }; + + $.fn.offset = function( options ) { + var elem = this[ 0 ]; + if ( !elem || !elem.ownerDocument ) { return null; } + if ( options ) { + return this.each(function() { + $.offset.setOffset( this, options ); + }); + } + return _offset.call( this ); + }; +} + +}( jQuery )); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.progressbar.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.progressbar.js new file mode 100644 index 00000000000..c432132a5ff --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.progressbar.js @@ -0,0 +1,108 @@ +/* + * jQuery UI Progressbar 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.widget( "ui.progressbar", { + options: { + value: 0, + max: 100 + }, + + min: 0, + + _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.options.max, + "aria-valuenow": this._value() + }); + + this.valueDiv = $( "
      " ) + .appendTo( this.element ); + + this.oldValue = this._value(); + 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(); + + $.Widget.prototype.destroy.apply( this, arguments ); + }, + + value: function( newValue ) { + if ( newValue === undefined ) { + return this._value(); + } + + this._setOption( "value", newValue ); + return this; + }, + + _setOption: function( key, value ) { + if ( key === "value" ) { + this.options.value = value; + this._refreshValue(); + if ( this._value() === this.options.max ) { + this._trigger( "complete" ); + } + } + + $.Widget.prototype._setOption.apply( this, arguments ); + }, + + _value: function() { + var val = this.options.value; + // normalize invalid value + if ( typeof val !== "number" ) { + val = 0; + } + return Math.min( this.options.max, Math.max( this.min, val ) ); + }, + + _percentage: function() { + return 100 * this._value() / this.options.max; + }, + + _refreshValue: function() { + var value = this.value(); + var percentage = this._percentage(); + + if ( this.oldValue !== value ) { + this.oldValue = value; + this._trigger( "change" ); + } + + this.valueDiv + .toggleClass( "ui-corner-right", value === this.options.max ) + .width( percentage.toFixed(0) + "%" ); + this.element.attr( "aria-valuenow", value ); + } +}); + +$.extend( $.ui.progressbar, { + version: "1.8.11" +}); + +})( jQuery ); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.resizable.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.resizable.js new file mode 100644 index 00000000000..1d1c906e8b2 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.resizable.js @@ -0,0 +1,812 @@ +/* + * jQuery UI Resizable 1.8.11 + * + * Copyright 2011, 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/Resizables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function( $, undefined ) { + +$.widget("ui.resizable", $.ui.mouse, { + widgetEventPrefix: "resize", + options: { + alsoResize: false, + animate: false, + animateDuration: "slow", + animateEasing: "swing", + aspectRatio: false, + autoHide: false, + containment: false, + ghost: false, + grid: false, + handles: "e,s,se", + helper: false, + maxHeight: null, + maxWidth: null, + minHeight: 10, + minWidth: 10, + zIndex: 1000 + }, + _create: function() { + + var self = this, o = this.options; + this.element.addClass("ui-resizable"); + + $.extend(this, { + _aspectRatio: !!(o.aspectRatio), + aspectRatio: o.aspectRatio, + originalElement: this.element, + _proportionallyResizeElements: [], + _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null + }); + + //Wrap the element if it cannot hold child nodes + if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) { + + //Opera fix for relative positioning + if (/relative/.test(this.element.css('position')) && $.browser.opera) + this.element.css({ position: 'relative', top: 'auto', left: 'auto' }); + + //Create a wrapper element and set the wrapper to the new current internal element + this.element.wrap( + $('
      ').css({ + position: this.element.css('position'), + width: this.element.outerWidth(), + height: this.element.outerHeight(), + top: this.element.css('top'), + left: this.element.css('left') + }) + ); + + //Overwrite the original this.element + this.element = this.element.parent().data( + "resizable", this.element.data('resizable') + ); + + this.elementIsWrapper = true; + + //Move margins to the wrapper + 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}); + + //Prevent Safari textarea resize + this.originalResizeStyle = this.originalElement.css('resize'); + this.originalElement.css('resize', 'none'); + + //Push the actual element to our proportionallyResize internal array + this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' })); + + // avoid IE jump (hard set the margin) + this.originalElement.css({ margin: this.originalElement.css('margin') }); + + // fix handlers offset + this._proportionallyResize(); + + } + + this.handles = o.handles || (!$('.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 n = this.handles.split(","); this.handles = {}; + + for(var i = 0; i < n.length; i++) { + + var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle; + var axis = $('
      '); + + // increase zIndex of sw, se, ne, nw axis + //TODO : this modifies original option + if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex }); + + //TODO : What's going on here? + if ('se' == handle) { + axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se'); + }; + + //Insert into internal handles object and append to element + this.handles[handle] = '.ui-resizable-'+handle; + this.element.append(axis); + } + + } + + this._renderAxis = function(target) { + + target = target || this.element; + + for(var i in this.handles) { + + if(this.handles[i].constructor == String) + this.handles[i] = $(this.handles[i], this.element).show(); + + //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls) + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) { + + var axis = $(this.handles[i], this.element), padWrapper = 0; + + //Checking the correct pad and border + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth(); + + //The padding type i have to apply... + var padPos = [ 'padding', + /ne|nw|n/.test(i) ? 'Top' : + /se|sw|s/.test(i) ? 'Bottom' : + /^e$/.test(i) ? 'Right' : 'Left' ].join(""); + + target.css(padPos, padWrapper); + + this._proportionallyResize(); + + } + + //TODO: What's that good for? There's not anything to be executed left + if(!$(this.handles[i]).length) + continue; + + } + }; + + //TODO: make renderAxis a prototype function + this._renderAxis(this.element); + + this._handles = $('.ui-resizable-handle', this.element) + .disableSelection(); + + //Matching axis name + this._handles.mouseover(function() { + if (!self.resizing) { + if (this.className) + var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i); + //Axis, default = se + self.axis = axis && axis[1] ? axis[1] : 'se'; + } + }); + + //If we want to auto hide the elements + if (o.autoHide) { + this._handles.hide(); + $(this.element) + .addClass("ui-resizable-autohide") + .hover(function() { + $(this).removeClass("ui-resizable-autohide"); + self._handles.show(); + }, + function(){ + if (!self.resizing) { + $(this).addClass("ui-resizable-autohide"); + self._handles.hide(); + } + }); + } + + //Initialize the mouse interaction + this._mouseInit(); + + }, + + destroy: function() { + + this._mouseDestroy(); + + var _destroy = function(exp) { + $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing") + .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove(); + }; + + //TODO: Unwrap at same DOM position + if (this.elementIsWrapper) { + _destroy(this.element); + var wrapper = this.element; + wrapper.after( + this.originalElement.css({ + position: wrapper.css('position'), + width: wrapper.outerWidth(), + height: wrapper.outerHeight(), + top: wrapper.css('top'), + left: wrapper.css('left') + }) + ).remove(); + } + + this.originalElement.css('resize', this.originalResizeStyle); + _destroy(this.originalElement); + + return this; + }, + + _mouseCapture: function(event) { + var handle = false; + for (var i in this.handles) { + if ($(this.handles[i])[0] == event.target) { + handle = true; + } + } + + return !this.options.disabled && handle; + }, + + _mouseStart: function(event) { + + var o = this.options, iniPos = this.element.position(), el = this.element; + + this.resizing = true; + this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() }; + + // bugfix for http://dev.jquery.com/ticket/1749 + if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) { + el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left }); + } + + //Opera fixing relative position + if ($.browser.opera && (/relative/).test(el.css('position'))) + el.css({ position: 'relative', top: 'auto', left: 'auto' }); + + this._renderProxy(); + + var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top')); + + if (o.containment) { + curleft += $(o.containment).scrollLeft() || 0; + curtop += $(o.containment).scrollTop() || 0; + } + + //Store needed variables + this.offset = this.helper.offset(); + this.position = { left: curleft, top: curtop }; + this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() }; + this.originalPosition = { left: curleft, top: curtop }; + this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() }; + this.originalMousePosition = { left: event.pageX, top: event.pageY }; + + //Aspect Ratio + this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1); + + var cursor = $('.ui-resizable-' + this.axis).css('cursor'); + $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor); + + el.addClass("ui-resizable-resizing"); + this._propagate("start", event); + return true; + }, + + _mouseDrag: function(event) { + + //Increase performance, avoid regex + var el = this.helper, o = this.options, props = {}, + self = this, smp = this.originalMousePosition, a = this.axis; + + var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0; + var trigger = this._change[a]; + if (!trigger) return false; + + // Calculate the attrs that will be change + var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff; + + if (this._aspectRatio || event.shiftKey) + data = this._updateRatio(data, event); + + data = this._respectSize(data, event); + + // plugins callbacks need to be called first + this._propagate("resize", event); + + el.css({ + top: this.position.top + "px", left: this.position.left + "px", + width: this.size.width + "px", height: this.size.height + "px" + }); + + if (!this._helper && this._proportionallyResizeElements.length) + this._proportionallyResize(); + + this._updateCache(data); + + // calling the user callback at the end + this._trigger('resize', event, this.ui()); + + return false; + }, + + _mouseStop: function(event) { + + this.resizing = false; + var o = this.options, self = this; + + if(this._helper) { + var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var s = { width: (self.helper.width() - soffsetw), height: (self.helper.height() - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + if (!o.animate) + this.element.css($.extend(s, { top: top, left: left })); + + self.helper.height(self.size.height); + self.helper.width(self.size.width); + + if (this._helper && !o.animate) this._proportionallyResize(); + } + + $('body').css('cursor', 'auto'); + + this.element.removeClass("ui-resizable-resizing"); + + this._propagate("stop", event); + + if (this._helper) this.helper.remove(); + return false; + + }, + + _updateCache: function(data) { + var o = this.options; + this.offset = this.helper.offset(); + if (isNumber(data.left)) this.position.left = data.left; + if (isNumber(data.top)) this.position.top = data.top; + if (isNumber(data.height)) this.size.height = data.height; + if (isNumber(data.width)) this.size.width = data.width; + }, + + _updateRatio: function(data, event) { + + var o = this.options, cpos = this.position, csize = this.size, a = this.axis; + + if (data.height) data.width = (csize.height * this.aspectRatio); + else if (data.width) data.height = (csize.width / this.aspectRatio); + + if (a == 'sw') { + data.left = cpos.left + (csize.width - data.width); + data.top = null; + } + if (a == 'nw') { + data.top = cpos.top + (csize.height - data.height); + data.left = cpos.left + (csize.width - data.width); + } + + return data; + }, + + _respectSize: function(data, event) { + + var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis, + ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height), + isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height); + + if (isminw) data.width = o.minWidth; + if (isminh) data.height = o.minHeight; + if (ismaxw) data.width = o.maxWidth; + if (ismaxh) data.height = o.maxHeight; + + var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height; + var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a); + + if (isminw && cw) data.left = dw - o.minWidth; + if (ismaxw && cw) data.left = dw - o.maxWidth; + if (isminh && ch) data.top = dh - o.minHeight; + if (ismaxh && ch) data.top = dh - o.maxHeight; + + // fixing jump error on top/left - bug #2330 + var isNotwh = !data.width && !data.height; + if (isNotwh && !data.left && data.top) data.top = null; + else if (isNotwh && !data.top && data.left) data.left = null; + + return data; + }, + + _proportionallyResize: function() { + + var o = this.options; + if (!this._proportionallyResizeElements.length) return; + var element = this.helper || this.element; + + for (var i=0; i < this._proportionallyResizeElements.length; i++) { + + var prel = this._proportionallyResizeElements[i]; + + if (!this.borderDif) { + var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')], + p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')]; + + this.borderDif = $.map(b, function(v, i) { + var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0; + return border + padding; + }); + } + + if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length))) + continue; + + prel.css({ + height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0, + width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0 + }); + + }; + + }, + + _renderProxy: function() { + + var el = this.element, o = this.options; + this.elementOffset = el.offset(); + + if(this._helper) { + + this.helper = this.helper || $('
      '); + + // fix ie6 offset TODO: This seems broken + var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0), + pxyoffset = ( ie6 ? 2 : -1 ); + + this.helper.addClass(this._helper).css({ + width: this.element.outerWidth() + pxyoffset, + height: this.element.outerHeight() + pxyoffset, + position: 'absolute', + left: this.elementOffset.left - ie6offset +'px', + top: this.elementOffset.top - ie6offset +'px', + zIndex: ++o.zIndex //TODO: Don't modify option + }); + + this.helper + .appendTo("body") + .disableSelection(); + + } else { + this.helper = this.element; + } + + }, + + _change: { + e: function(event, dx, dy) { + return { width: this.originalSize.width + dx }; + }, + w: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { left: sp.left + dx, width: cs.width - dx }; + }, + n: function(event, dx, dy) { + var o = this.options, cs = this.originalSize, sp = this.originalPosition; + return { top: sp.top + dy, height: cs.height - dy }; + }, + s: function(event, dx, dy) { + return { height: this.originalSize.height + dy }; + }, + se: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + sw: function(event, dx, dy) { + return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + }, + ne: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy])); + }, + nw: function(event, dx, dy) { + return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy])); + } + }, + + _propagate: function(n, event) { + $.ui.plugin.call(this, n, [event, this.ui()]); + (n != "resize" && this._trigger(n, event, 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 + }; + } + +}); + +$.extend($.ui.resizable, { + version: "1.8.11" +}); + +/* + * Resizable Extensions + */ + +$.ui.plugin.add("resizable", "alsoResize", { + + start: function (event, ui) { + var self = $(this).data("resizable"), o = self.options; + + var _store = function (exp) { + $(exp).each(function() { + var el = $(this); + el.data("resizable-alsoresize", { + width: parseInt(el.width(), 10), height: parseInt(el.height(), 10), + left: parseInt(el.css('left'), 10), top: parseInt(el.css('top'), 10), + position: el.css('position') // to reset Opera on stop() + }); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) { + if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); } + else { $.each(o.alsoResize, function (exp) { _store(exp); }); } + }else{ + _store(o.alsoResize); + } + }, + + resize: function (event, ui) { + var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition; + + var delta = { + height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0, + top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0 + }, + + _alsoResize = function (exp, c) { + $(exp).each(function() { + var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, + css = c && c.length ? c : el.parents(ui.originalElement[0]).length ? ['width', 'height'] : ['width', 'height', 'top', 'left']; + + $.each(css, function (i, prop) { + var sum = (start[prop]||0) + (delta[prop]||0); + if (sum && sum >= 0) + style[prop] = sum || null; + }); + + // Opera fixing relative position + if ($.browser.opera && /relative/.test(el.css('position'))) { + self._revertToRelativePosition = true; + el.css({ position: 'absolute', top: 'auto', left: 'auto' }); + } + + el.css(style); + }); + }; + + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) { + $.each(o.alsoResize, function (exp, c) { _alsoResize(exp, c); }); + }else{ + _alsoResize(o.alsoResize); + } + }, + + stop: function (event, ui) { + var self = $(this).data("resizable"), o = self.options; + + var _reset = function (exp) { + $(exp).each(function() { + var el = $(this); + // reset position for Opera - no need to verify it was changed + el.css({ position: el.data("resizable-alsoresize").position }); + }); + }; + + if (self._revertToRelativePosition) { + self._revertToRelativePosition = false; + if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) { + $.each(o.alsoResize, function (exp) { _reset(exp); }); + }else{ + _reset(o.alsoResize); + } + } + + $(this).removeData("resizable-alsoresize"); + } +}); + +$.ui.plugin.add("resizable", "animate", { + + stop: function(event, ui) { + var self = $(this).data("resizable"), o = self.options; + + var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName), + soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height, + soffsetw = ista ? 0 : self.sizeDiff.width; + + var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) }, + left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null, + top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null; + + self.element.animate( + $.extend(style, top && left ? { top: top, left: left } : {}), { + duration: o.animateDuration, + easing: o.animateEasing, + step: function() { + + var data = { + width: parseInt(self.element.css('width'), 10), + height: parseInt(self.element.css('height'), 10), + top: parseInt(self.element.css('top'), 10), + left: parseInt(self.element.css('left'), 10) + }; + + if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height }); + + // propagating resize, and updating values for each animation step + self._updateCache(data); + self._propagate("resize", event); + + } + } + ); + } + +}); + +$.ui.plugin.add("resizable", "containment", { + + start: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, el = self.element; + var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc; + if (!ce) return; + + self.containerElement = $(ce); + + if (/document/.test(oc) || oc == document) { + self.containerOffset = { left: 0, top: 0 }; + self.containerPosition = { left: 0, top: 0 }; + + self.parentData = { + element: $(document), left: 0, top: 0, + width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight + }; + } + + // i'm a node, so compute top, left, right, bottom + else { + var element = $(ce), p = []; + $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); }); + + self.containerOffset = element.offset(); + self.containerPosition = element.position(); + self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) }; + + var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width, + width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch); + + self.parentData = { + element: ce, left: co.left, top: co.top, width: width, height: height + }; + } + }, + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, + ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position, + pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement; + + if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co; + + if (cp.left < (self._helper ? co.left : 0)) { + self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left)); + if (pRatio) self.size.height = self.size.width / o.aspectRatio; + self.position.left = o.helper ? co.left : 0; + } + + if (cp.top < (self._helper ? co.top : 0)) { + self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top); + if (pRatio) self.size.width = self.size.height * o.aspectRatio; + self.position.top = self._helper ? co.top : 0; + } + + self.offset.left = self.parentData.left+self.position.left; + self.offset.top = self.parentData.top+self.position.top; + + var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ), + hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height ); + + var isParent = self.containerElement.get(0) == self.element.parent().get(0), + isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position')); + + if(isParent && isOffsetRelative) woset -= self.parentData.left; + + if (woset + self.size.width >= self.parentData.width) { + self.size.width = self.parentData.width - woset; + if (pRatio) self.size.height = self.size.width / self.aspectRatio; + } + + if (hoset + self.size.height >= self.parentData.height) { + self.size.height = self.parentData.height - hoset; + if (pRatio) self.size.width = self.size.height * self.aspectRatio; + } + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options, cp = self.position, + co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement; + + var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height; + + if (self._helper && !o.animate && (/relative/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + if (self._helper && !o.animate && (/static/).test(ce.css('position'))) + $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h }); + + } +}); + +$.ui.plugin.add("resizable", "ghost", { + + start: function(event, ui) { + + var self = $(this).data("resizable"), o = self.options, cs = self.size; + + self.ghost = self.originalElement.clone(); + self.ghost + .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 }) + .addClass('ui-resizable-ghost') + .addClass(typeof o.ghost == 'string' ? o.ghost : ''); + + self.ghost.appendTo(self.helper); + + }, + + resize: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width }); + }, + + stop: function(event, ui){ + var self = $(this).data("resizable"), o = self.options; + if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0)); + } + +}); + +$.ui.plugin.add("resizable", "grid", { + + resize: function(event, ui) { + var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey; + o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid; + var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1); + + if (/^(se|s|e)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + } + else if (/^(ne)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + } + else if (/^(sw)$/.test(a)) { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.left = op.left - ox; + } + else { + self.size.width = os.width + ox; + self.size.height = os.height + oy; + self.position.top = op.top - oy; + self.position.left = op.left - ox; + } + } + +}); + +var num = function(v) { + return parseInt(v, 10) || 0; +}; + +var isNumber = function(value) { + return !isNaN(parseInt(value, 10)); +}; + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.selectable.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.selectable.js new file mode 100644 index 00000000000..e3b91328f51 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.selectable.js @@ -0,0 +1,266 @@ +/* + * jQuery UI Selectable 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +$.widget("ui.selectable", $.ui.mouse, { + options: { + appendTo: 'body', + autoRefresh: true, + distance: 0, + filter: '*', + tolerance: 'touch' + }, + _create: function() { + var self = this; + + this.element.addClass("ui-selectable"); + + this.dragged = false; + + // cache selectee children based on filter + var selectees; + this.refresh = function() { + selectees = $(self.options.filter, self.element[0]); + selectees.each(function() { + var $this = $(this); + var pos = $this.offset(); + $.data(this, "selectable-item", { + element: this, + $element: $this, + left: pos.left, + top: pos.top, + right: pos.left + $this.outerWidth(), + bottom: pos.top + $this.outerHeight(), + startselected: false, + selected: $this.hasClass('ui-selected'), + selecting: $this.hasClass('ui-selecting'), + unselecting: $this.hasClass('ui-unselecting') + }); + }); + }; + this.refresh(); + + this.selectees = selectees.addClass("ui-selectee"); + + this._mouseInit(); + + this.helper = $("
      "); + }, + + 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(event) { + var self = this; + + this.opos = [event.pageX, event.pageY]; + + if (this.options.disabled) + return; + + var options = this.options; + + this.selectees = $(options.filter, this.element[0]); + + this._trigger("start", event); + + $(options.appendTo).append(this.helper); + // position helper (lasso) + this.helper.css({ + "left": event.clientX, + "top": event.clientY, + "width": 0, + "height": 0 + }); + + if (options.autoRefresh) { + this.refresh(); + } + + this.selectees.filter('.ui-selected').each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.startselected = true; + if (!event.metaKey) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + }); + + $(event.target).parents().andSelf().each(function() { + var selectee = $.data(this, "selectable-item"); + if (selectee) { + var doSelect = !event.metaKey || !selectee.$element.hasClass('ui-selected'); + selectee.$element + .removeClass(doSelect ? "ui-unselecting" : "ui-selected") + .addClass(doSelect ? "ui-selecting" : "ui-unselecting"); + selectee.unselecting = !doSelect; + selectee.selecting = doSelect; + selectee.selected = doSelect; + // selectable (UN)SELECTING callback + if (doSelect) { + self._trigger("selecting", event, { + selecting: selectee.element + }); + } else { + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + return false; + } + }); + + }, + + _mouseDrag: function(event) { + var self = this; + this.dragged = true; + + if (this.options.disabled) + return; + + var options = this.options; + + var x1 = this.opos[0], y1 = this.opos[1], x2 = event.pageX, y2 = event.pageY; + if (x1 > x2) { var tmp = x2; x2 = x1; x1 = tmp; } + if (y1 > y2) { var tmp = y2; y2 = y1; y1 = tmp; } + this.helper.css({left: x1, top: y1, width: x2-x1, height: y2-y1}); + + this.selectees.each(function() { + var selectee = $.data(this, "selectable-item"); + //prevent helper from being selected if appendTo: selectable + if (!selectee || selectee.element == self.element[0]) + return; + var hit = false; + if (options.tolerance == 'touch') { + hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); + } else if (options.tolerance == 'fit') { + hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); + } + + if (hit) { + // SELECT + if (selectee.selected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + } + if (selectee.unselecting) { + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + } + if (!selectee.selecting) { + selectee.$element.addClass('ui-selecting'); + selectee.selecting = true; + // selectable SELECTING callback + self._trigger("selecting", event, { + selecting: selectee.element + }); + } + } else { + // UNSELECT + if (selectee.selecting) { + if (event.metaKey && selectee.startselected) { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + selectee.$element.addClass('ui-selected'); + selectee.selected = true; + } else { + selectee.$element.removeClass('ui-selecting'); + selectee.selecting = false; + if (selectee.startselected) { + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + } + // selectable UNSELECTING callback + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + if (selectee.selected) { + if (!event.metaKey && !selectee.startselected) { + selectee.$element.removeClass('ui-selected'); + selectee.selected = false; + + selectee.$element.addClass('ui-unselecting'); + selectee.unselecting = true; + // selectable UNSELECTING callback + self._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + } + }); + + return false; + }, + + _mouseStop: function(event) { + var self = this; + + this.dragged = false; + + var options = this.options; + + $('.ui-unselecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-unselecting'); + selectee.unselecting = false; + selectee.startselected = false; + self._trigger("unselected", event, { + unselected: selectee.element + }); + }); + $('.ui-selecting', this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass('ui-selecting').addClass('ui-selected'); + selectee.selecting = false; + selectee.selected = true; + selectee.startselected = true; + self._trigger("selected", event, { + selected: selectee.element + }); + }); + this._trigger("stop", event); + + this.helper.remove(); + + return false; + } + +}); + +$.extend($.ui.selectable, { + version: "1.8.11" +}); + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.slider.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.slider.js new file mode 100644 index 00000000000..f02a922f032 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.slider.js @@ -0,0 +1,682 @@ +/* + * jQuery UI Slider 1.8.11 + * + * Copyright 2011, 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/Slider + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function( $, undefined ) { + +// number of pages in a slider +// (how many times can you page up/down to go through the whole range) +var numPages = 5; + +$.widget( "ui.slider", $.ui.mouse, { + + widgetEventPrefix: "slide", + + options: { + animate: false, + distance: 0, + max: 100, + min: 0, + orientation: "horizontal", + range: false, + step: 1, + value: 0, + values: null + }, + + _create: function() { + var self = this, + o = this.options; + + this._keySliding = false; + this._mouseSliding = false; + this._animateOff = true; + this._handleIndex = null; + this._detectOrientation(); + this._mouseInit(); + + this.element + .addClass( "ui-slider" + + " ui-slider-" + this.orientation + + " ui-widget" + + " ui-widget-content" + + " ui-corner-all" ); + + if ( o.disabled ) { + this.element.addClass( "ui-slider-disabled ui-disabled" ); + } + + this.range = $([]); + + if ( o.range ) { + if ( o.range === true ) { + this.range = $( "
      " ); + if ( !o.values ) { + o.values = [ this._valueMin(), this._valueMin() ]; + } + if ( o.values.length && o.values.length !== 2 ) { + o.values = [ o.values[0], o.values[0] ]; + } + } else { + this.range = $( "
      " ); + } + + this.range + .appendTo( this.element ) + .addClass( "ui-slider-range" ); + + if ( o.range === "min" || o.range === "max" ) { + this.range.addClass( "ui-slider-range-" + o.range ); + } + + // note: this isn't the most fittingly semantic framework class for this element, + // but worked best visually with a variety of themes + this.range.addClass( "ui-widget-header" ); + } + + if ( $( ".ui-slider-handle", this.element ).length === 0 ) { + $( "" ) + .appendTo( this.element ) + .addClass( "ui-slider-handle" ); + } + + if ( o.values && o.values.length ) { + while ( $(".ui-slider-handle", this.element).length < o.values.length ) { + $( "" ) + .appendTo( this.element ) + .addClass( "ui-slider-handle" ); + } + } + + this.handles = $( ".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( event ) { + event.preventDefault(); + }) + .hover(function() { + if ( !o.disabled ) { + $( this ).addClass( "ui-state-hover" ); + } + }, function() { + $( this ).removeClass( "ui-state-hover" ); + }) + .focus(function() { + if ( !o.disabled ) { + $( ".ui-slider .ui-state-focus" ).removeClass( "ui-state-focus" ); + $( this ).addClass( "ui-state-focus" ); + } else { + $( this ).blur(); + } + }) + .blur(function() { + $( this ).removeClass( "ui-state-focus" ); + }); + + this.handles.each(function( i ) { + $( this ).data( "index.ui-slider-handle", i ); + }); + + this.handles + .keydown(function( event ) { + var ret = true, + index = $( this ).data( "index.ui-slider-handle" ), + allowed, + curVal, + newVal, + step; + + if ( self.options.disabled ) { + return; + } + + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + case $.ui.keyCode.END: + case $.ui.keyCode.PAGE_UP: + case $.ui.keyCode.PAGE_DOWN: + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + ret = false; + if ( !self._keySliding ) { + self._keySliding = true; + $( this ).addClass( "ui-state-active" ); + allowed = self._start( event, index ); + if ( allowed === false ) { + return; + } + } + break; + } + + step = self.options.step; + if ( self.options.values && self.options.values.length ) { + curVal = newVal = self.values( index ); + } else { + curVal = newVal = self.value(); + } + + switch ( event.keyCode ) { + case $.ui.keyCode.HOME: + newVal = self._valueMin(); + break; + case $.ui.keyCode.END: + newVal = self._valueMax(); + break; + case $.ui.keyCode.PAGE_UP: + newVal = self._trimAlignValue( curVal + ( (self._valueMax() - self._valueMin()) / numPages ) ); + break; + case $.ui.keyCode.PAGE_DOWN: + newVal = self._trimAlignValue( curVal - ( (self._valueMax() - self._valueMin()) / numPages ) ); + break; + case $.ui.keyCode.UP: + case $.ui.keyCode.RIGHT: + if ( curVal === self._valueMax() ) { + return; + } + newVal = self._trimAlignValue( curVal + step ); + break; + case $.ui.keyCode.DOWN: + case $.ui.keyCode.LEFT: + if ( curVal === self._valueMin() ) { + return; + } + newVal = self._trimAlignValue( curVal - step ); + break; + } + + self._slide( event, index, newVal ); + + return ret; + + }) + .keyup(function( event ) { + var index = $( this ).data( "index.ui-slider-handle" ); + + if ( self._keySliding ) { + self._keySliding = false; + self._stop( event, index ); + self._change( event, index ); + $( 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( event ) { + var o = this.options, + position, + normValue, + distance, + closestHandle, + self, + index, + allowed, + offset, + mouseOverHandle; + + if ( o.disabled ) { + return false; + } + + this.elementSize = { + width: this.element.outerWidth(), + height: this.element.outerHeight() + }; + this.elementOffset = this.element.offset(); + + position = { x: event.pageX, y: event.pageY }; + normValue = this._normValueFromMouse( position ); + distance = this._valueMax() - this._valueMin() + 1; + self = this; + this.handles.each(function( i ) { + var thisDistance = Math.abs( normValue - self.values(i) ); + if ( distance > thisDistance ) { + distance = thisDistance; + closestHandle = $( this ); + index = i; + } + }); + + // workaround for bug #3736 (if both handles of a range are at 0, + // the first is always used as the one with least distance, + // and moving it is obviously prevented by preventing negative ranges) + if( o.range === true && this.values(1) === o.min ) { + index += 1; + closestHandle = $( this.handles[index] ); + } + + allowed = this._start( event, index ); + if ( allowed === false ) { + return false; + } + this._mouseSliding = true; + + self._handleIndex = index; + + closestHandle + .addClass( "ui-state-active" ) + .focus(); + + offset = closestHandle.offset(); + mouseOverHandle = !$( event.target ).parents().andSelf().is( ".ui-slider-handle" ); + this._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : { + left: event.pageX - offset.left - ( closestHandle.width() / 2 ), + top: event.pageY - offset.top - + ( closestHandle.height() / 2 ) - + ( parseInt( closestHandle.css("borderTopWidth"), 10 ) || 0 ) - + ( parseInt( closestHandle.css("borderBottomWidth"), 10 ) || 0) + + ( parseInt( closestHandle.css("marginTop"), 10 ) || 0) + }; + + if ( !this.handles.hasClass( "ui-state-hover" ) ) { + this._slide( event, index, normValue ); + } + this._animateOff = true; + return true; + }, + + _mouseStart: function( event ) { + return true; + }, + + _mouseDrag: function( event ) { + var position = { x: event.pageX, y: event.pageY }, + normValue = this._normValueFromMouse( position ); + + this._slide( event, this._handleIndex, normValue ); + + return false; + }, + + _mouseStop: function( event ) { + this.handles.removeClass( "ui-state-active" ); + this._mouseSliding = false; + + this._stop( event, this._handleIndex ); + this._change( event, this._handleIndex ); + + this._handleIndex = null; + this._clickOffset = null; + this._animateOff = false; + + return false; + }, + + _detectOrientation: function() { + this.orientation = ( this.options.orientation === "vertical" ) ? "vertical" : "horizontal"; + }, + + _normValueFromMouse: function( position ) { + var pixelTotal, + pixelMouse, + percentMouse, + valueTotal, + valueMouse; + + if ( this.orientation === "horizontal" ) { + pixelTotal = this.elementSize.width; + pixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 ); + } else { + pixelTotal = this.elementSize.height; + pixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 ); + } + + percentMouse = ( pixelMouse / pixelTotal ); + if ( percentMouse > 1 ) { + percentMouse = 1; + } + if ( percentMouse < 0 ) { + percentMouse = 0; + } + if ( this.orientation === "vertical" ) { + percentMouse = 1 - percentMouse; + } + + valueTotal = this._valueMax() - this._valueMin(); + valueMouse = this._valueMin() + percentMouse * valueTotal; + + return this._trimAlignValue( valueMouse ); + }, + + _start: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + return this._trigger( "start", event, uiHash ); + }, + + _slide: function( event, index, newVal ) { + var otherVal, + newValues, + allowed; + + if ( this.options.values && this.options.values.length ) { + otherVal = this.values( index ? 0 : 1 ); + + if ( ( this.options.values.length === 2 && this.options.range === true ) && + ( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) ) + ) { + newVal = otherVal; + } + + if ( newVal !== this.values( index ) ) { + newValues = this.values(); + newValues[ index ] = newVal; + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal, + values: newValues + } ); + otherVal = this.values( index ? 0 : 1 ); + if ( allowed !== false ) { + this.values( index, newVal, true ); + } + } + } else { + if ( newVal !== this.value() ) { + // A slide can be canceled by returning false from the slide callback + allowed = this._trigger( "slide", event, { + handle: this.handles[ index ], + value: newVal + } ); + if ( allowed !== false ) { + this.value( newVal ); + } + } + } + }, + + _stop: function( event, index ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + this._trigger( "stop", event, uiHash ); + }, + + _change: function( event, index ) { + if ( !this._keySliding && !this._mouseSliding ) { + var uiHash = { + handle: this.handles[ index ], + value: this.value() + }; + if ( this.options.values && this.options.values.length ) { + uiHash.value = this.values( index ); + uiHash.values = this.values(); + } + + this._trigger( "change", event, uiHash ); + } + }, + + value: function( newValue ) { + if ( arguments.length ) { + this.options.value = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, 0 ); + } + + return this._value(); + }, + + values: function( index, newValue ) { + var vals, + newValues, + i; + + if ( arguments.length > 1 ) { + this.options.values[ index ] = this._trimAlignValue( newValue ); + this._refreshValue(); + this._change( null, index ); + } + + if ( arguments.length ) { + if ( $.isArray( arguments[ 0 ] ) ) { + vals = this.options.values; + newValues = arguments[ 0 ]; + for ( i = 0; i < vals.length; i += 1 ) { + vals[ i ] = this._trimAlignValue( newValues[ i ] ); + this._change( null, i ); + } + this._refreshValue(); + } else { + if ( this.options.values && this.options.values.length ) { + return this._values( index ); + } else { + return this.value(); + } + } + } else { + return this._values(); + } + }, + + _setOption: function( key, value ) { + var i, + valsLength = 0; + + if ( $.isArray( this.options.values ) ) { + valsLength = this.options.values.length; + } + + $.Widget.prototype._setOption.apply( this, arguments ); + + switch ( key ) { + case "disabled": + if ( value ) { + this.handles.filter( ".ui-state-focus" ).blur(); + this.handles.removeClass( "ui-state-hover" ); + this.handles.attr( "disabled", "disabled" ); + this.element.addClass( "ui-disabled" ); + } else { + this.handles.removeAttr( "disabled" ); + this.element.removeClass( "ui-disabled" ); + } + break; + case "orientation": + this._detectOrientation(); + this.element + .removeClass( "ui-slider-horizontal ui-slider-vertical" ) + .addClass( "ui-slider-" + this.orientation ); + this._refreshValue(); + break; + case "value": + this._animateOff = true; + this._refreshValue(); + this._change( null, 0 ); + this._animateOff = false; + break; + case "values": + this._animateOff = true; + this._refreshValue(); + for ( i = 0; i < valsLength; i += 1 ) { + this._change( null, i ); + } + this._animateOff = false; + break; + } + }, + + //internal value getter + // _value() returns value trimmed by min and max, aligned by step + _value: function() { + var val = this.options.value; + val = this._trimAlignValue( val ); + + return val; + }, + + //internal values getter + // _values() returns array of values trimmed by min and max, aligned by step + // _values( index ) returns single value trimmed by min and max, aligned by step + _values: function( index ) { + var val, + vals, + i; + + if ( arguments.length ) { + val = this.options.values[ index ]; + val = this._trimAlignValue( val ); + + return val; + } else { + // .slice() creates a copy of the array + // this copy gets trimmed by min and max and then returned + vals = this.options.values.slice(); + for ( i = 0; i < vals.length; i+= 1) { + vals[ i ] = this._trimAlignValue( vals[ i ] ); + } + + return vals; + } + }, + + // returns the step-aligned value that val is closest to, between (inclusive) min and max + _trimAlignValue: function( val ) { + if ( val <= this._valueMin() ) { + return this._valueMin(); + } + if ( val >= this._valueMax() ) { + return this._valueMax(); + } + var step = ( this.options.step > 0 ) ? this.options.step : 1, + valModStep = (val - this._valueMin()) % step; + alignValue = val - valModStep; + + if ( Math.abs(valModStep) * 2 >= step ) { + alignValue += ( valModStep > 0 ) ? step : ( -step ); + } + + // Since JavaScript has problems with large floats, round + // the final value to 5 digits after the decimal point (see #4124) + return parseFloat( alignValue.toFixed(5) ); + }, + + _valueMin: function() { + return this.options.min; + }, + + _valueMax: function() { + return this.options.max; + }, + + _refreshValue: function() { + var oRange = this.options.range, + o = this.options, + self = this, + animate = ( !this._animateOff ) ? o.animate : false, + valPercent, + _set = {}, + lastValPercent, + value, + valueMin, + valueMax; + + if ( this.options.values && this.options.values.length ) { + this.handles.each(function( i, j ) { + valPercent = ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100; + _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + if ( self.options.range === true ) { + if ( self.orientation === "horizontal" ) { + if ( i === 0 ) { + self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate ); + } + if ( i === 1 ) { + self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } else { + if ( i === 0 ) { + self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate ); + } + if ( i === 1 ) { + self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } + } + lastValPercent = valPercent; + }); + } else { + value = this.value(); + valueMin = this._valueMin(); + valueMax = this._valueMax(); + valPercent = ( valueMax !== valueMin ) ? + ( value - valueMin ) / ( valueMax - valueMin ) * 100 : + 0; + _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%"; + this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate ); + + if ( oRange === "min" && this.orientation === "horizontal" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate ); + } + if ( oRange === "max" && this.orientation === "horizontal" ) { + this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + if ( oRange === "min" && this.orientation === "vertical" ) { + this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate ); + } + if ( oRange === "max" && this.orientation === "vertical" ) { + this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } ); + } + } + } + +}); + +$.extend( $.ui.slider, { + version: "1.8.11" +}); + +}(jQuery)); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.sortable.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.sortable.js new file mode 100644 index 00000000000..1a06dcae0f6 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.sortable.js @@ -0,0 +1,1073 @@ +/* + * jQuery UI Sortable 1.8.11 + * + * Copyright 2011, 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/Sortables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function( $, undefined ) { + +$.widget("ui.sortable", $.ui.mouse, { + widgetEventPrefix: "sort", + options: { + appendTo: "parent", + axis: false, + connectWith: false, + containment: false, + cursor: 'auto', + cursorAt: false, + dropOnEmpty: true, + forcePlaceholderSize: false, + forceHelperSize: false, + grid: false, + handle: false, + helper: "original", + items: '> *', + opacity: false, + placeholder: false, + revert: false, + scroll: true, + scrollSensitivity: 20, + scrollSpeed: 20, + scope: "default", + tolerance: "intersect", + zIndex: 1000 + }, + _create: function() { + + var o = this.options; + this.containerCache = {}; + this.element.addClass("ui-sortable"); + + //Get the items + this.refresh(); + + //Let's determine if the items are being displayed horizontally + this.floating = this.items.length ? (/left|right/).test(this.items[0].item.css('float')) || (/inline|table-cell/).test(this.items[0].item.css('display')) : false; + + //Let's determine the parent's offset + this.offset = this.element.offset(); + + //Initialize mouse events for interaction + this._mouseInit(); + + }, + + destroy: function() { + this.element + .removeClass("ui-sortable ui-sortable-disabled") + .removeData("sortable") + .unbind(".sortable"); + this._mouseDestroy(); + + for ( var i = this.items.length - 1; i >= 0; i-- ) + this.items[i].item.removeData("sortable-item"); + + return this; + }, + + _setOption: function(key, value){ + if ( key === "disabled" ) { + this.options[ key ] = value; + + this.widget() + [ value ? "addClass" : "removeClass"]( "ui-sortable-disabled" ); + } else { + // Don't call widget base _setOption for disable as it adds ui-state-disabled class + $.Widget.prototype._setOption.apply(this, arguments); + } + }, + + _mouseCapture: function(event, overrideHandle) { + + if (this.reverting) { + return false; + } + + if(this.options.disabled || this.options.type == 'static') return false; + + //We have to refresh the items data once first + this._refreshItems(event); + + //Find out if the clicked node (or one of its parents) is a actual item in this.items + var currentItem = null, self = this, nodes = $(event.target).parents().each(function() { + if($.data(this, 'sortable-item') == self) { + currentItem = $(this); + return false; + } + }); + if($.data(event.target, 'sortable-item') == self) currentItem = $(event.target); + + if(!currentItem) return false; + if(this.options.handle && !overrideHandle) { + var validHandle = false; + + $(this.options.handle, currentItem).find("*").andSelf().each(function() { if(this == event.target) validHandle = true; }); + if(!validHandle) return false; + } + + this.currentItem = currentItem; + this._removeCurrentsFromItems(); + return true; + + }, + + _mouseStart: function(event, overrideHandle, noActivation) { + + var o = this.options, self = this; + this.currentContainer = this; + + //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture + this.refreshPositions(); + + //Create and append the visible helper + this.helper = this._createHelper(event); + + //Cache the helper size + this._cacheHelperProportions(); + + /* + * - Position generation - + * This block generates everything position related - it's the core of draggables. + */ + + //Cache the margins of the original element + this._cacheMargins(); + + //Get the next scrolling parent + this.scrollParent = this.helper.scrollParent(); + + //The element's absolute position on the page minus margins + this.offset = this.currentItem.offset(); + this.offset = { + top: this.offset.top - this.margins.top, + left: this.offset.left - this.margins.left + }; + + // Only after we got the offset, we can change the helper's position to absolute + // TODO: Still need to figure out a way to make relative sorting possible + this.helper.css("position", "absolute"); + this.cssPosition = this.helper.css("position"); + + $.extend(this.offset, { + click: { //Where the click happened, relative to the element + left: event.pageX - this.offset.left, + top: event.pageY - this.offset.top + }, + parent: this._getParentOffset(), + relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper + }); + + //Generate the original position + this.originalPosition = this._generatePosition(event); + this.originalPageX = event.pageX; + this.originalPageY = event.pageY; + + //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied + (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt)); + + //Cache the former DOM position + this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] }; + + //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way + if(this.helper[0] != this.currentItem[0]) { + this.currentItem.hide(); + } + + //Create the placeholder + this._createPlaceholder(); + + //Set a containment if given in the options + if(o.containment) + this._setContainment(); + + if(o.cursor) { // cursor option + if ($('body').css("cursor")) this._storedCursor = $('body').css("cursor"); + $('body').css("cursor", o.cursor); + } + + if(o.opacity) { // opacity option + if (this.helper.css("opacity")) this._storedOpacity = this.helper.css("opacity"); + this.helper.css("opacity", o.opacity); + } + + if(o.zIndex) { // zIndex option + if (this.helper.css("zIndex")) this._storedZIndex = this.helper.css("zIndex"); + this.helper.css("zIndex", o.zIndex); + } + + //Prepare scrolling + if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') + this.overflowOffset = this.scrollParent.offset(); + + //Call callbacks + this._trigger("start", event, this._uiHash()); + + //Recache the helper size + if(!this._preserveHelperProportions) + this._cacheHelperProportions(); + + + //Post 'activate' events to possible containers + if(!noActivation) { + for (var i = this.containers.length - 1; i >= 0; i--) { this.containers[i]._trigger("activate", event, self._uiHash(this)); } + } + + //Prepare possible droppables + if($.ui.ddmanager) + $.ui.ddmanager.current = this; + + if ($.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + + this.dragging = true; + + this.helper.addClass("ui-sortable-helper"); + this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position + return true; + + }, + + _mouseDrag: function(event) { + + //Compute the helpers position + this.position = this._generatePosition(event); + this.positionAbs = this._convertPositionTo("absolute"); + + if (!this.lastPositionAbs) { + this.lastPositionAbs = this.positionAbs; + } + + //Do scrolling + if(this.options.scroll) { + var o = this.options, scrolled = false; + if(this.scrollParent[0] != document && this.scrollParent[0].tagName != 'HTML') { + + if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed; + else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) + this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed; + + if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed; + else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) + this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed; + + } else { + + if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed); + else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) + scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed); + + if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed); + else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) + scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed); + + } + + if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) + $.ui.ddmanager.prepareOffsets(this, event); + } + + //Regenerate the absolute position used for position checks + this.positionAbs = this._convertPositionTo("absolute"); + + //Set the helper 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'; + + //Rearrange + for (var i = this.items.length - 1; i >= 0; i--) { + + //Cache variables and intersection, continue if no intersection + var item = this.items[i], itemElement = item.item[0], intersection = this._intersectsWithPointer(item); + if (!intersection) continue; + + if(itemElement != this.currentItem[0] //cannot intersect with itself + && this.placeholder[intersection == 1 ? "next" : "prev"]()[0] != itemElement //no useless actions that have been done before + && !$.ui.contains(this.placeholder[0], itemElement) //no action if the item moved is the parent of the item checked + && (this.options.type == 'semi-dynamic' ? !$.ui.contains(this.element[0], itemElement) : true) + //&& itemElement.parentNode == this.placeholder[0].parentNode // only rearrange items within the same container + ) { + + this.direction = intersection == 1 ? "down" : "up"; + + if (this.options.tolerance == "pointer" || this._intersectsWithSides(item)) { + this._rearrange(event, item); + } else { + break; + } + + this._trigger("change", event, this._uiHash()); + break; + } + } + + //Post events to containers + this._contactContainers(event); + + //Interconnect with droppables + if($.ui.ddmanager) $.ui.ddmanager.drag(this, event); + + //Call callbacks + this._trigger('sort', event, this._uiHash()); + + this.lastPositionAbs = this.positionAbs; + return false; + + }, + + _mouseStop: function(event, noPropagation) { + + if(!event) return; + + //If we are using droppables, inform the manager about the drop + if ($.ui.ddmanager && !this.options.dropBehaviour) + $.ui.ddmanager.drop(this, event); + + if(this.options.revert) { + var self = this; + var cur = self.placeholder.offset(); + + self.reverting = true; + + $(this.helper).animate({ + left: cur.left - this.offset.parent.left - self.margins.left + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollLeft), + top: cur.top - this.offset.parent.top - self.margins.top + (this.offsetParent[0] == document.body ? 0 : this.offsetParent[0].scrollTop) + }, parseInt(this.options.revert, 10) || 500, function() { + self._clear(event); + }); + } else { + this._clear(event, noPropagation); + } + + return false; + + }, + + cancel: function() { + + var self = this; + + if(this.dragging) { + + this._mouseUp({ target: null }); + + if(this.options.helper == "original") + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + else + this.currentItem.show(); + + //Post deactivating events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + this.containers[i]._trigger("deactivate", null, self._uiHash(this)); + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", null, self._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + if (this.placeholder) { + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + if(this.placeholder[0].parentNode) this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + if(this.options.helper != "original" && this.helper && this.helper[0].parentNode) this.helper.remove(); + + $.extend(this, { + helper: null, + dragging: false, + reverting: false, + _noFinalSort: null + }); + + if(this.domPosition.prev) { + $(this.domPosition.prev).after(this.currentItem); + } else { + $(this.domPosition.parent).prepend(this.currentItem); + } + } + + return this; + + }, + + serialize: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected); + var str = []; o = o || {}; + + $(items).each(function() { + var res = ($(o.item || this).attr(o.attribute || 'id') || '').match(o.expression || (/(.+)[-=_](.+)/)); + if(res) str.push((o.key || res[1]+'[]')+'='+(o.key && o.expression ? res[1] : res[2])); + }); + + if(!str.length && o.key) { + str.push(o.key + '='); + } + + return str.join('&'); + + }, + + toArray: function(o) { + + var items = this._getItemsAsjQuery(o && o.connected); + var ret = []; o = o || {}; + + items.each(function() { ret.push($(o.item || this).attr(o.attribute || 'id') || ''); }); + return ret; + + }, + + /* Be careful with the following core functions */ + _intersectsWith: function(item) { + + var x1 = this.positionAbs.left, + x2 = x1 + this.helperProportions.width, + y1 = this.positionAbs.top, + y2 = y1 + this.helperProportions.height; + + var l = item.left, + r = l + item.width, + t = item.top, + b = t + item.height; + + var dyClick = this.offset.click.top, + dxClick = this.offset.click.left; + + var isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r; + + if( this.options.tolerance == "pointer" + || this.options.forcePointerForContainers + || (this.options.tolerance != "pointer" && this.helperProportions[this.floating ? 'width' : 'height'] > item[this.floating ? 'width' : 'height']) + ) { + return isOverElement; + } else { + + return (l < x1 + (this.helperProportions.width / 2) // Right Half + && x2 - (this.helperProportions.width / 2) < r // Left Half + && t < y1 + (this.helperProportions.height / 2) // Bottom Half + && y2 - (this.helperProportions.height / 2) < b ); // Top Half + + } + }, + + _intersectsWithPointer: function(item) { + + var isOverElementHeight = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height), + isOverElementWidth = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width), + isOverElement = isOverElementHeight && isOverElementWidth, + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (!isOverElement) + return false; + + return this.floating ? + ( ((horizontalDirection && horizontalDirection == "right") || verticalDirection == "down") ? 2 : 1 ) + : ( verticalDirection && (verticalDirection == "down" ? 2 : 1) ); + + }, + + _intersectsWithSides: function(item) { + + var isOverBottomHalf = $.ui.isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height), + isOverRightHalf = $.ui.isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width), + verticalDirection = this._getDragVerticalDirection(), + horizontalDirection = this._getDragHorizontalDirection(); + + if (this.floating && horizontalDirection) { + return ((horizontalDirection == "right" && isOverRightHalf) || (horizontalDirection == "left" && !isOverRightHalf)); + } else { + return verticalDirection && ((verticalDirection == "down" && isOverBottomHalf) || (verticalDirection == "up" && !isOverBottomHalf)); + } + + }, + + _getDragVerticalDirection: function() { + var delta = this.positionAbs.top - this.lastPositionAbs.top; + return delta != 0 && (delta > 0 ? "down" : "up"); + }, + + _getDragHorizontalDirection: function() { + var delta = this.positionAbs.left - this.lastPositionAbs.left; + return delta != 0 && (delta > 0 ? "right" : "left"); + }, + + refresh: function(event) { + this._refreshItems(event); + this.refreshPositions(); + return this; + }, + + _connectWith: function() { + var options = this.options; + return options.connectWith.constructor == String + ? [options.connectWith] + : options.connectWith; + }, + + _getItemsAsjQuery: function(connected) { + + var self = this; + var items = []; + var queries = []; + var connectWith = this._connectWith(); + + if(connectWith && connected) { + for (var i = connectWith.length - 1; i >= 0; i--){ + var cur = $(connectWith[i]); + for (var j = cur.length - 1; j >= 0; j--){ + var inst = $.data(cur[j], 'sortable'); + if(inst && inst != this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), inst]); + } + }; + }; + } + + queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not('.ui-sortable-placeholder'), this]); + + for (var i = queries.length - 1; i >= 0; i--){ + queries[i][0].each(function() { + items.push(this); + }); + }; + + return $(items); + + }, + + _removeCurrentsFromItems: function() { + + var list = this.currentItem.find(":data(sortable-item)"); + + for (var i=0; i < this.items.length; i++) { + + for (var j=0; j < list.length; j++) { + if(list[j] == this.items[i].item[0]) + this.items.splice(i,1); + }; + + }; + + }, + + _refreshItems: function(event) { + + this.items = []; + this.containers = [this]; + var items = this.items; + var self = this; + var queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]]; + var connectWith = this._connectWith(); + + if(connectWith) { + for (var i = connectWith.length - 1; i >= 0; i--){ + var cur = $(connectWith[i]); + for (var j = cur.length - 1; j >= 0; j--){ + var inst = $.data(cur[j], 'sortable'); + if(inst && inst != this && !inst.options.disabled) { + queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]); + this.containers.push(inst); + } + }; + }; + } + + for (var i = queries.length - 1; i >= 0; i--) { + var targetData = queries[i][1]; + var _queries = queries[i][0]; + + for (var j=0, queriesLength = _queries.length; j < queriesLength; j++) { + var item = $(_queries[j]); + + item.data('sortable-item', targetData); // Data for target checking (mouse manager) + + items.push({ + item: item, + instance: targetData, + width: 0, height: 0, + left: 0, top: 0 + }); + }; + }; + + }, + + refreshPositions: function(fast) { + + //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change + if(this.offsetParent && this.helper) { + this.offset.parent = this._getParentOffset(); + } + + for (var i = this.items.length - 1; i >= 0; i--){ + var item = this.items[i]; + + var t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item; + + if (!fast) { + item.width = t.outerWidth(); + item.height = t.outerHeight(); + } + + var p = t.offset(); + item.left = p.left; + item.top = p.top; + }; + + if(this.options.custom && this.options.custom.refreshContainers) { + this.options.custom.refreshContainers.call(this); + } else { + for (var i = this.containers.length - 1; i >= 0; i--){ + var p = this.containers[i].element.offset(); + this.containers[i].containerCache.left = p.left; + this.containers[i].containerCache.top = p.top; + this.containers[i].containerCache.width = this.containers[i].element.outerWidth(); + this.containers[i].containerCache.height = this.containers[i].element.outerHeight(); + }; + } + + return this; + }, + + _createPlaceholder: function(that) { + + var self = that || this, o = self.options; + + if(!o.placeholder || o.placeholder.constructor == String) { + var className = o.placeholder; + o.placeholder = { + element: function() { + + var el = $(document.createElement(self.currentItem[0].nodeName)) + .addClass(className || self.currentItem[0].className+" ui-sortable-placeholder") + .removeClass("ui-sortable-helper")[0]; + + if(!className) + el.style.visibility = "hidden"; + + return el; + }, + update: function(container, p) { + + // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that + // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified + if(className && !o.forcePlaceholderSize) return; + + //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item + if(!p.height()) { p.height(self.currentItem.innerHeight() - parseInt(self.currentItem.css('paddingTop')||0, 10) - parseInt(self.currentItem.css('paddingBottom')||0, 10)); }; + if(!p.width()) { p.width(self.currentItem.innerWidth() - parseInt(self.currentItem.css('paddingLeft')||0, 10) - parseInt(self.currentItem.css('paddingRight')||0, 10)); }; + } + }; + } + + //Create the placeholder + self.placeholder = $(o.placeholder.element.call(self.element, self.currentItem)); + + //Append it after the actual current item + self.currentItem.after(self.placeholder); + + //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317) + o.placeholder.update(self, self.placeholder); + + }, + + _contactContainers: function(event) { + + // get innermost container that intersects with item + var innermostContainer = null, innermostIndex = null; + + + for (var i = this.containers.length - 1; i >= 0; i--){ + + // never consider a container that's located within the item itself + if($.ui.contains(this.currentItem[0], this.containers[i].element[0])) + continue; + + if(this._intersectsWith(this.containers[i].containerCache)) { + + // if we've already found a container and it's more "inner" than this, then continue + if(innermostContainer && $.ui.contains(this.containers[i].element[0], innermostContainer.element[0])) + continue; + + innermostContainer = this.containers[i]; + innermostIndex = i; + + } else { + // container doesn't intersect. trigger "out" event if necessary + if(this.containers[i].containerCache.over) { + this.containers[i]._trigger("out", event, this._uiHash(this)); + this.containers[i].containerCache.over = 0; + } + } + + } + + // if no intersecting containers found, return + if(!innermostContainer) return; + + // move the item into the container if it's not there already + if(this.containers.length === 1) { + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } else if(this.currentContainer != this.containers[innermostIndex]) { + + //When entering a new container, we will find the item with the least distance and append our item near it + var dist = 10000; var itemWithLeastDistance = null; var base = this.positionAbs[this.containers[innermostIndex].floating ? 'left' : 'top']; + for (var j = this.items.length - 1; j >= 0; j--) { + if(!$.ui.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) continue; + var cur = this.items[j][this.containers[innermostIndex].floating ? 'left' : 'top']; + if(Math.abs(cur - base) < dist) { + dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j]; + } + } + + if(!itemWithLeastDistance && !this.options.dropOnEmpty) //Check if dropOnEmpty is enabled + return; + + this.currentContainer = this.containers[innermostIndex]; + itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true); + this._trigger("change", event, this._uiHash()); + this.containers[innermostIndex]._trigger("change", event, this._uiHash(this)); + + //Update the placeholder + this.options.placeholder.update(this.currentContainer, this.placeholder); + + this.containers[innermostIndex]._trigger("over", event, this._uiHash(this)); + this.containers[innermostIndex].containerCache.over = 1; + } + + + }, + + _createHelper: function(event) { + + var o = this.options; + var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper == 'clone' ? this.currentItem.clone() : this.currentItem); + + if(!helper.parents('body').length) //Add the helper to the DOM if that didn't happen already + $(o.appendTo != 'parent' ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]); + + if(helper[0] == this.currentItem[0]) + this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") }; + + if(helper[0].style.width == '' || o.forceHelperSize) helper.width(this.currentItem.width()); + if(helper[0].style.height == '' || o.forceHelperSize) helper.height(this.currentItem.height()); + + return helper; + + }, + + _adjustOffsetFromHelper: function(obj) { + if (typeof obj == 'string') { + obj = obj.split(' '); + } + if ($.isArray(obj)) { + obj = {left: +obj[0], top: +obj[1] || 0}; + } + if ('left' in obj) { + this.offset.click.left = obj.left + this.margins.left; + } + if ('right' in obj) { + this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left; + } + if ('top' in obj) { + this.offset.click.top = obj.top + this.margins.top; + } + if ('bottom' in obj) { + this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top; + } + }, + + _getParentOffset: function() { + + + //Get the offsetParent and cache its position + this.offsetParent = this.helper.offsetParent(); + var po = this.offsetParent.offset(); + + // This is a special case where we need to modify a offset calculated on start, since the following happened: + // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent + // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that + // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag + if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) { + po.left += this.scrollParent.scrollLeft(); + po.top += this.scrollParent.scrollTop(); + } + + if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information + || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix + po = { top: 0, left: 0 }; + + return { + top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0), + left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0) + }; + + }, + + _getRelativeOffset: function() { + + if(this.cssPosition == "relative") { + var p = this.currentItem.position(); + return { + top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(), + left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft() + }; + } else { + return { top: 0, left: 0 }; + } + + }, + + _cacheMargins: function() { + this.margins = { + left: (parseInt(this.currentItem.css("marginLeft"),10) || 0), + top: (parseInt(this.currentItem.css("marginTop"),10) || 0) + }; + }, + + _cacheHelperProportions: function() { + this.helperProportions = { + width: this.helper.outerWidth(), + height: this.helper.outerHeight() + }; + }, + + _setContainment: function() { + + var o = this.options; + if(o.containment == 'parent') o.containment = this.helper[0].parentNode; + if(o.containment == 'document' || o.containment == 'window') this.containment = [ + 0 - this.offset.relative.left - this.offset.parent.left, + 0 - this.offset.relative.top - this.offset.parent.top, + $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left, + ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top + ]; + + if(!(/^(document|window|parent)$/).test(o.containment)) { + var ce = $(o.containment)[0]; + var co = $(o.containment).offset(); + var over = ($(ce).css("overflow") != 'hidden'); + + this.containment = [ + co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left, + co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top, + co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left, + co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top + ]; + } + + }, + + _convertPositionTo: function(d, pos) { + + if(!pos) pos = this.position; + var mod = d == "absolute" ? 1 : -1; + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + return { + top: ( + pos.top // The absolute mouse position + + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod) + ), + left: ( + pos.left // The absolute mouse position + + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent + + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border) + - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod) + ) + }; + + }, + + _generatePosition: function(event) { + + var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName); + + // This is another very weird special case that only happens for relative elements: + // 1. If the css position is relative + // 2. and the scroll parent is the document or similar to the offset parent + // we have to refresh the relative offset during the scroll so there are no jumps + if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) { + this.offset.relative = this._getRelativeOffset(); + } + + var pageX = event.pageX; + var pageY = event.pageY; + + /* + * - Position constraining - + * Constrain the position to a mix of grid, containment. + */ + + if(this.originalPosition) { //If we are not dragging yet, we won't check for options + + if(this.containment) { + if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left; + if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top; + if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left; + if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top; + } + + if(o.grid) { + var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1]; + pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top; + + var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0]; + pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left; + } + + } + + return { + top: ( + pageY // The absolute mouse position + - this.offset.click.top // Click offset (relative to the element) + - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.top // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) )) + ), + left: ( + pageX // The absolute mouse position + - this.offset.click.left // Click offset (relative to the element) + - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent + - this.offset.parent.left // The offsetParent's offset without borders (offset + border) + + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() )) + ) + }; + + }, + + _rearrange: function(event, i, a, hardRefresh) { + + a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction == 'down' ? i.item[0] : i.item[0].nextSibling)); + + //Various things done here to improve the performance: + // 1. we create a setTimeout, that calls refreshPositions + // 2. on the instance, we have a counter variable, that get's higher after every append + // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same + // 4. this lets only the last addition to the timeout stack through + this.counter = this.counter ? ++this.counter : 1; + var self = this, counter = this.counter; + + window.setTimeout(function() { + if(counter == self.counter) self.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove + },0); + + }, + + _clear: function(event, noPropagation) { + + this.reverting = false; + // We delay all events that have to be triggered to after the point where the placeholder has been removed and + // everything else normalized again + var delayedTriggers = [], self = this; + + // We first have to update the dom position of the actual currentItem + // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088) + if(!this._noFinalSort && this.currentItem[0].parentNode) this.placeholder.before(this.currentItem); + this._noFinalSort = null; + + if(this.helper[0] == this.currentItem[0]) { + for(var i in this._storedCSS) { + if(this._storedCSS[i] == 'auto' || this._storedCSS[i] == 'static') this._storedCSS[i] = ''; + } + this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"); + } else { + this.currentItem.show(); + } + + if(this.fromOutside && !noPropagation) delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); }); + if((this.fromOutside || this.domPosition.prev != this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent != this.currentItem.parent()[0]) && !noPropagation) delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed + if(!$.ui.contains(this.element[0], this.currentItem[0])) { //Node was moved out of the current element + if(!noPropagation) delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); }); + for (var i = this.containers.length - 1; i >= 0; i--){ + if($.ui.contains(this.containers[i].element[0], this.currentItem[0]) && !noPropagation) { + delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + } + }; + }; + + //Post events to containers + for (var i = this.containers.length - 1; i >= 0; i--){ + if(!noPropagation) delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + if(this.containers[i].containerCache.over) { + delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i])); + this.containers[i].containerCache.over = 0; + } + } + + //Do what was originally in plugins + if(this._storedCursor) $('body').css("cursor", this._storedCursor); //Reset cursor + if(this._storedOpacity) this.helper.css("opacity", this._storedOpacity); //Reset opacity + if(this._storedZIndex) this.helper.css("zIndex", this._storedZIndex == 'auto' ? '' : this._storedZIndex); //Reset z-index + + this.dragging = false; + if(this.cancelHelperRemoval) { + if(!noPropagation) { + this._trigger("beforeStop", event, this._uiHash()); + for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events + this._trigger("stop", event, this._uiHash()); + } + return false; + } + + if(!noPropagation) this._trigger("beforeStop", event, this._uiHash()); + + //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node! + this.placeholder[0].parentNode.removeChild(this.placeholder[0]); + + if(this.helper[0] != this.currentItem[0]) this.helper.remove(); this.helper = null; + + if(!noPropagation) { + for (var i=0; i < delayedTriggers.length; i++) { delayedTriggers[i].call(this, event); }; //Trigger all delayed events + this._trigger("stop", event, this._uiHash()); + } + + this.fromOutside = false; + return true; + + }, + + _trigger: function() { + if ($.Widget.prototype._trigger.apply(this, arguments) === false) { + this.cancel(); + } + }, + + _uiHash: function(inst) { + var self = inst || this; + return { + helper: self.helper, + placeholder: self.placeholder || $([]), + position: self.position, + originalPosition: self.originalPosition, + offset: self.positionAbs, + item: self.currentItem, + sender: inst ? inst.element : null + }; + } + +}); + +$.extend($.ui.sortable, { + version: "1.8.11" +}); + +})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.tabs.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.tabs.js new file mode 100644 index 00000000000..3be7ff494ae --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.tabs.js @@ -0,0 +1,758 @@ +/* + * jQuery UI Tabs 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +var tabId = 0, + listId = 0; + +function getNextTabId() { + return ++tabId; +} + +function getNextListId() { + return ++listId; +} + +$.widget( "ui.tabs", { + options: { + add: null, + ajaxOptions: null, + cache: false, + cookie: null, // e.g. { expires: 7, path: '/', domain: 'jquery.com', secure: true } + collapsible: false, + disable: null, + disabled: [], + enable: null, + event: "click", + fx: null, // e.g. { height: 'toggle', opacity: 'toggle', duration: 200 } + idPrefix: "ui-tabs-", + load: null, + panelTemplate: "
      ", + remove: null, + select: null, + show: null, + spinner: "Loading…", + tabTemplate: "
    • #{label}
    • " + }, + + _create: function() { + this._tabify( true ); + }, + + _setOption: function( key, value ) { + if ( key == "selected" ) { + if (this.options.collapsible && value == this.options.selected ) { + return; + } + this.select( value ); + } else { + this.options[ key ] = value; + this._tabify(); + } + }, + + _tabId: function( a ) { + return a.title && a.title.replace( /\s/g, "_" ).replace( /[^\w\u00c0-\uFFFF-]/g, "" ) || + this.options.idPrefix + getNextTabId(); + }, + + _sanitizeSelector: function( hash ) { + // we need this because an id may contain a ":" + return hash.replace( /:/g, "\\:" ); + }, + + _cookie: function() { + var cookie = this.cookie || + ( this.cookie = this.options.cookie.name || "ui-tabs-" + getNextListId() ); + return $.cookie.apply( null, [ cookie ].concat( $.makeArray( arguments ) ) ); + }, + + _ui: function( tab, panel ) { + return { + tab: tab, + panel: panel, + index: this.anchors.index( tab ) + }; + }, + + _cleanup: function() { + // restore all former loading tabs labels + this.lis.filter( ".ui-state-processing" ) + .removeClass( "ui-state-processing" ) + .find( "span:data(label.tabs)" ) + .each(function() { + var el = $( this ); + el.html( el.data( "label.tabs" ) ).removeData( "label.tabs" ); + }); + }, + + _tabify: function( init ) { + var self = this, + o = this.options, + fragmentId = /^#.+/; // Safari 2 reports '#' for an empty hash + + this.list = this.element.find( "ol,ul" ).eq( 0 ); + this.lis = $( " > li:has(a[href])", this.list ); + this.anchors = this.lis.map(function() { + return $( "a", this )[ 0 ]; + }); + this.panels = $( [] ); + + this.anchors.each(function( i, a ) { + var href = $( a ).attr( "href" ); + // For dynamically created HTML that contains a hash as href IE < 8 expands + // such href to the full page url with hash and then misinterprets tab as ajax. + // Same consideration applies for an added tab with a fragment identifier + // since a[href=#fragment-identifier] does unexpectedly not match. + // Thus normalize href attribute... + var hrefBase = href.split( "#" )[ 0 ], + baseEl; + if ( hrefBase && ( hrefBase === location.toString().split( "#" )[ 0 ] || + ( baseEl = $( "base" )[ 0 ]) && hrefBase === baseEl.href ) ) { + href = a.hash; + a.href = href; + } + + // inline tab + if ( fragmentId.test( href ) ) { + self.panels = self.panels.add( self.element.find( self._sanitizeSelector( href ) ) ); + // remote tab + // prevent loading the page itself if href is just "#" + } else if ( href && href !== "#" ) { + // required for restore on destroy + $.data( a, "href.tabs", href ); + + // TODO until #3808 is fixed strip fragment identifier from url + // (IE fails to load from such url) + $.data( a, "load.tabs", href.replace( /#.*$/, "" ) ); + + var id = self._tabId( a ); + a.href = "#" + id; + var $panel = self.element.find( "#" + id ); + if ( !$panel.length ) { + $panel = $( o.panelTemplate ) + .attr( "id", id ) + .addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" ) + .insertAfter( self.panels[ i - 1 ] || self.list ); + $panel.data( "destroy.tabs", true ); + } + self.panels = self.panels.add( $panel ); + // invalid tab href + } else { + o.disabled.push( i ); + } + }); + + // initialization from scratch + if ( init ) { + // attach necessary classes for styling + 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" ); + + // Selected tab + // use "selected" option or try to retrieve: + // 1. from fragment identifier in url + // 2. from cookie + // 3. from selected class attribute on
    • + if ( o.selected === undefined ) { + if ( location.hash ) { + this.anchors.each(function( i, a ) { + if ( a.hash == location.hash ) { + o.selected = i; + return false; + } + }); + } + if ( typeof o.selected !== "number" && o.cookie ) { + o.selected = parseInt( self._cookie(), 10 ); + } + if ( typeof o.selected !== "number" && this.lis.filter( ".ui-tabs-selected" ).length ) { + o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) ); + } + o.selected = o.selected || ( this.lis.length ? 0 : -1 ); + } else if ( o.selected === null ) { // usage of null is deprecated, TODO remove in next release + o.selected = -1; + } + + // sanity check - default to first tab... + o.selected = ( ( o.selected >= 0 && this.anchors[ o.selected ] ) || o.selected < 0 ) + ? o.selected + : 0; + + // Take disabling tabs via class attribute from HTML + // into account and update option properly. + // A selected tab cannot become disabled. + o.disabled = $.unique( o.disabled.concat( + $.map( this.lis.filter( ".ui-state-disabled" ), function( n, i ) { + return self.lis.index( n ); + }) + ) ).sort(); + + if ( $.inArray( o.selected, o.disabled ) != -1 ) { + o.disabled.splice( $.inArray( o.selected, o.disabled ), 1 ); + } + + // highlight selected tab + this.panels.addClass( "ui-tabs-hide" ); + this.lis.removeClass( "ui-tabs-selected ui-state-active" ); + // check for length avoids error when initializing empty list + if ( o.selected >= 0 && this.anchors.length ) { + self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) ).removeClass( "ui-tabs-hide" ); + this.lis.eq( o.selected ).addClass( "ui-tabs-selected ui-state-active" ); + + // seems to be expected behavior that the show callback is fired + self.element.queue( "tabs", function() { + self._trigger( "show", null, + self._ui( self.anchors[ o.selected ], self.element.find( self._sanitizeSelector( self.anchors[ o.selected ].hash ) )[ 0 ] ) ); + }); + + this.load( o.selected ); + } + + // clean up to avoid memory leaks in certain versions of IE 6 + // TODO: namespace this event + $( window ).bind( "unload", function() { + self.lis.add( self.anchors ).unbind( ".tabs" ); + self.lis = self.anchors = self.panels = null; + }); + // update selected after add/remove + } else { + o.selected = this.lis.index( this.lis.filter( ".ui-tabs-selected" ) ); + } + + // update collapsible + // TODO: use .toggleClass() + this.element[ o.collapsible ? "addClass" : "removeClass" ]( "ui-tabs-collapsible" ); + + // set or update cookie after init and add/remove respectively + if ( o.cookie ) { + this._cookie( o.selected, o.cookie ); + } + + // disable tabs + for ( var i = 0, li; ( li = this.lis[ i ] ); i++ ) { + $( li )[ $.inArray( i, o.disabled ) != -1 && + // TODO: use .toggleClass() + !$( li ).hasClass( "ui-tabs-selected" ) ? "addClass" : "removeClass" ]( "ui-state-disabled" ); + } + + // reset cache if switching from cached to not cached + if ( o.cache === false ) { + this.anchors.removeData( "cache.tabs" ); + } + + // remove all handlers before, tabify may run on existing tabs after add or option change + this.lis.add( this.anchors ).unbind( ".tabs" ); + + if ( o.event !== "mouseover" ) { + var addState = function( state, el ) { + if ( el.is( ":not(.ui-state-disabled)" ) ) { + el.addClass( "ui-state-" + state ); + } + }; + var removeState = function( state, el ) { + el.removeClass( "ui-state-" + state ); + }; + this.lis.bind( "mouseover.tabs" , function() { + addState( "hover", $( this ) ); + }); + this.lis.bind( "mouseout.tabs", function() { + removeState( "hover", $( this ) ); + }); + this.anchors.bind( "focus.tabs", function() { + addState( "focus", $( this ).closest( "li" ) ); + }); + this.anchors.bind( "blur.tabs", function() { + removeState( "focus", $( this ).closest( "li" ) ); + }); + } + + // set up animations + var hideFx, showFx; + if ( o.fx ) { + if ( $.isArray( o.fx ) ) { + hideFx = o.fx[ 0 ]; + showFx = o.fx[ 1 ]; + } else { + hideFx = showFx = o.fx; + } + } + + // Reset certain styles left over from animation + // and prevent IE's ClearType bug... + function resetStyle( $el, fx ) { + $el.css( "display", "" ); + if ( !$.support.opacity && fx.opacity ) { + $el[ 0 ].style.removeAttribute( "filter" ); + } + } + + // Show a tab... + var showTab = showFx + ? function( clicked, $show ) { + $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" ); + $show.hide().removeClass( "ui-tabs-hide" ) // avoid flicker that way + .animate( showFx, showFx.duration || "normal", function() { + resetStyle( $show, showFx ); + self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) ); + }); + } + : function( clicked, $show ) { + $( clicked ).closest( "li" ).addClass( "ui-tabs-selected ui-state-active" ); + $show.removeClass( "ui-tabs-hide" ); + self._trigger( "show", null, self._ui( clicked, $show[ 0 ] ) ); + }; + + // Hide a tab, $show is optional... + var hideTab = hideFx + ? function( clicked, $hide ) { + $hide.animate( hideFx, hideFx.duration || "normal", function() { + self.lis.removeClass( "ui-tabs-selected ui-state-active" ); + $hide.addClass( "ui-tabs-hide" ); + resetStyle( $hide, hideFx ); + self.element.dequeue( "tabs" ); + }); + } + : function( clicked, $hide, $show ) { + self.lis.removeClass( "ui-tabs-selected ui-state-active" ); + $hide.addClass( "ui-tabs-hide" ); + self.element.dequeue( "tabs" ); + }; + + // attach tab event handler, unbind to avoid duplicates from former tabifying... + this.anchors.bind( o.event + ".tabs", function() { + var el = this, + $li = $(el).closest( "li" ), + $hide = self.panels.filter( ":not(.ui-tabs-hide)" ), + $show = self.element.find( self._sanitizeSelector( el.hash ) ); + + // If tab is already selected and not collapsible or tab disabled or + // or is already loading or click callback returns false stop here. + // Check if click handler returns false last so that it is not executed + // for a disabled or loading tab! + if ( ( $li.hasClass( "ui-tabs-selected" ) && !o.collapsible) || + $li.hasClass( "ui-state-disabled" ) || + $li.hasClass( "ui-state-processing" ) || + self.panels.filter( ":animated" ).length || + self._trigger( "select", null, self._ui( this, $show[ 0 ] ) ) === false ) { + this.blur(); + return false; + } + + o.selected = self.anchors.index( this ); + + self.abort(); + + // if tab may be closed + if ( o.collapsible ) { + if ( $li.hasClass( "ui-tabs-selected" ) ) { + o.selected = -1; + + if ( o.cookie ) { + self._cookie( o.selected, o.cookie ); + } + + self.element.queue( "tabs", function() { + hideTab( el, $hide ); + }).dequeue( "tabs" ); + + this.blur(); + return false; + } else if ( !$hide.length ) { + if ( o.cookie ) { + self._cookie( o.selected, o.cookie ); + } + + self.element.queue( "tabs", function() { + showTab( el, $show ); + }); + + // TODO make passing in node possible, see also http://dev.jqueryui.com/ticket/3171 + self.load( self.anchors.index( this ) ); + + this.blur(); + return false; + } + } + + if ( o.cookie ) { + self._cookie( o.selected, o.cookie ); + } + + // show new tab + if ( $show.length ) { + if ( $hide.length ) { + self.element.queue( "tabs", function() { + hideTab( el, $hide ); + }); + } + self.element.queue( "tabs", function() { + showTab( el, $show ); + }); + + self.load( self.anchors.index( this ) ); + } else { + throw "jQuery UI Tabs: Mismatching fragment identifier."; + } + + // Prevent IE from keeping other link focussed when using the back button + // and remove dotted border from clicked link. This is controlled via CSS + // in modern browsers; blur() removes focus from address bar in Firefox + // which can become a usability and annoying problem with tabs('rotate'). + if ( $.browser.msie ) { + this.blur(); + } + }); + + // disable click in any case + this.anchors.bind( "click.tabs", function(){ + return false; + }); + }, + + _getIndex: function( index ) { + // meta-function to give users option to provide a href string instead of a numerical index. + // also sanitizes numerical indexes to valid values. + if ( typeof index == "string" ) { + index = this.anchors.index( this.anchors.filter( "[href$=" + index + "]" ) ); + } + + return index; + }, + + destroy: function() { + var o = 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 href = $.data( this, "href.tabs" ); + if ( href ) { + this.href = href; + } + var $this = $( this ).unbind( ".tabs" ); + $.each( [ "href", "load", "cache" ], function( i, prefix ) { + $this.removeData( prefix + ".tabs" ); + }); + }); + + this.lis.unbind( ".tabs" ).add( this.panels ).each(function() { + if ( $.data( this, "destroy.tabs" ) ) { + $( this ).remove(); + } else { + $( 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" + ].join( " " ) ); + } + }); + + if ( o.cookie ) { + this._cookie( null, o.cookie ); + } + + return this; + }, + + add: function( url, label, index ) { + if ( index === undefined ) { + index = this.anchors.length; + } + + var self = this, + o = this.options, + $li = $( o.tabTemplate.replace( /#\{href\}/g, url ).replace( /#\{label\}/g, label ) ), + id = !url.indexOf( "#" ) ? url.replace( "#", "" ) : this._tabId( $( "a", $li )[ 0 ] ); + + $li.addClass( "ui-state-default ui-corner-top" ).data( "destroy.tabs", true ); + + // try to find an existing element before creating a new one + var $panel = self.element.find( "#" + id ); + if ( !$panel.length ) { + $panel = $( o.panelTemplate ) + .attr( "id", id ) + .data( "destroy.tabs", true ); + } + $panel.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide" ); + + if ( index >= this.lis.length ) { + $li.appendTo( this.list ); + $panel.appendTo( this.list[ 0 ].parentNode ); + } else { + $li.insertBefore( this.lis[ index ] ); + $panel.insertBefore( this.panels[ index ] ); + } + + o.disabled = $.map( o.disabled, function( n, i ) { + return n >= index ? ++n : n; + }); + + this._tabify(); + + if ( this.anchors.length == 1 ) { + o.selected = 0; + $li.addClass( "ui-tabs-selected ui-state-active" ); + $panel.removeClass( "ui-tabs-hide" ); + this.element.queue( "tabs", function() { + self._trigger( "show", null, self._ui( self.anchors[ 0 ], self.panels[ 0 ] ) ); + }); + + this.load( 0 ); + } + + this._trigger( "add", null, this._ui( this.anchors[ index ], this.panels[ index ] ) ); + return this; + }, + + remove: function( index ) { + index = this._getIndex( index ); + var o = this.options, + $li = this.lis.eq( index ).remove(), + $panel = this.panels.eq( index ).remove(); + + // If selected tab was removed focus tab to the right or + // in case the last tab was removed the tab to the left. + if ( $li.hasClass( "ui-tabs-selected" ) && this.anchors.length > 1) { + this.select( index + ( index + 1 < this.anchors.length ? 1 : -1 ) ); + } + + o.disabled = $.map( + $.grep( o.disabled, function(n, i) { + return n != index; + }), + function( n, i ) { + return n >= index ? --n : n; + }); + + this._tabify(); + + this._trigger( "remove", null, this._ui( $li.find( "a" )[ 0 ], $panel[ 0 ] ) ); + return this; + }, + + enable: function( index ) { + index = this._getIndex( index ); + var o = this.options; + if ( $.inArray( index, o.disabled ) == -1 ) { + return; + } + + this.lis.eq( index ).removeClass( "ui-state-disabled" ); + o.disabled = $.grep( o.disabled, function( n, i ) { + return n != index; + }); + + this._trigger( "enable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) ); + return this; + }, + + disable: function( index ) { + index = this._getIndex( index ); + var self = this, o = this.options; + // cannot disable already selected tab + if ( index != o.selected ) { + this.lis.eq( index ).addClass( "ui-state-disabled" ); + + o.disabled.push( index ); + o.disabled.sort(); + + this._trigger( "disable", null, this._ui( this.anchors[ index ], this.panels[ index ] ) ); + } + + return this; + }, + + select: function( index ) { + index = this._getIndex( index ); + if ( index == -1 ) { + if ( this.options.collapsible && this.options.selected != -1 ) { + index = this.options.selected; + } else { + return this; + } + } + this.anchors.eq( index ).trigger( this.options.event + ".tabs" ); + return this; + }, + + load: function( index ) { + index = this._getIndex( index ); + var self = this, + o = this.options, + a = this.anchors.eq( index )[ 0 ], + url = $.data( a, "load.tabs" ); + + this.abort(); + + // not remote or from cache + if ( !url || this.element.queue( "tabs" ).length !== 0 && $.data( a, "cache.tabs" ) ) { + this.element.dequeue( "tabs" ); + return; + } + + // load remote from here on + this.lis.eq( index ).addClass( "ui-state-processing" ); + + if ( o.spinner ) { + var span = $( "span", a ); + span.data( "label.tabs", span.html() ).html( o.spinner ); + } + + this.xhr = $.ajax( $.extend( {}, o.ajaxOptions, { + url: url, + success: function( r, s ) { + self.element.find( self._sanitizeSelector( a.hash ) ).html( r ); + + // take care of tab labels + self._cleanup(); + + if ( o.cache ) { + $.data( a, "cache.tabs", true ); + } + + self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) ); + try { + o.ajaxOptions.success( r, s ); + } + catch ( e ) {} + }, + error: function( xhr, s, e ) { + // take care of tab labels + self._cleanup(); + + self._trigger( "load", null, self._ui( self.anchors[ index ], self.panels[ index ] ) ); + try { + // Passing index avoid a race condition when this method is + // called after the user has selected another tab. + // Pass the anchor that initiated this request allows + // loadError to manipulate the tab content panel via $(a.hash) + o.ajaxOptions.error( xhr, s, index, a ); + } + catch ( e ) {} + } + } ) ); + + // last, so that load event is fired before show... + self.element.dequeue( "tabs" ); + + return this; + }, + + abort: function() { + // stop possibly running animations + this.element.queue( [] ); + this.panels.stop( false, true ); + + // "tabs" queue must not contain more than two elements, + // which are the callbacks for the latest clicked tab... + this.element.queue( "tabs", this.element.queue( "tabs" ).splice( -2, 2 ) ); + + // terminate pending requests from other tabs + if ( this.xhr ) { + this.xhr.abort(); + delete this.xhr; + } + + // take care of tab labels + this._cleanup(); + return this; + }, + + url: function( index, url ) { + this.anchors.eq( index ).removeData( "cache.tabs" ).data( "load.tabs", url ); + return this; + }, + + length: function() { + return this.anchors.length; + } +}); + +$.extend( $.ui.tabs, { + version: "1.8.11" +}); + +/* + * Tabs Extensions + */ + +/* + * Rotate + */ +$.extend( $.ui.tabs.prototype, { + rotation: null, + rotate: function( ms, continuing ) { + var self = this, + o = this.options; + + var rotate = self._rotate || ( self._rotate = function( e ) { + clearTimeout( self.rotation ); + self.rotation = setTimeout(function() { + var t = o.selected; + self.select( ++t < self.anchors.length ? t : 0 ); + }, ms ); + + if ( e ) { + e.stopPropagation(); + } + }); + + var stop = self._unrotate || ( self._unrotate = !continuing + ? function(e) { + if (e.clientX) { // in case of a true click + self.rotate(null); + } + } + : function( e ) { + t = o.selected; + rotate(); + }); + + // start rotation + if ( ms ) { + this.element.bind( "tabsshow", rotate ); + this.anchors.bind( o.event + ".tabs", stop ); + rotate(); + // stop rotation + } else { + clearTimeout( self.rotation ); + this.element.unbind( "tabsshow", rotate ); + this.anchors.unbind( o.event + ".tabs", stop ); + delete this._rotate; + delete this._unrotate; + } + + return this; + } +}); + +})( jQuery ); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.widget.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.widget.js new file mode 100644 index 00000000000..b6b1beea976 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/jquery.ui.widget.js @@ -0,0 +1,262 @@ +/*! + * jQuery UI Widget 1.8.11 + * + * Copyright 2011, 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( $, undefined ) { + +// jQuery 1.4+ +if ( $.cleanData ) { + var _cleanData = $.cleanData; + $.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $( elem ).triggerHandler( "remove" ); + } + _cleanData( elems ); + }; +} else { + var _remove = $.fn.remove; + $.fn.remove = function( selector, keepData ) { + return this.each(function() { + if ( !keepData ) { + if ( !selector || $.filter( selector, [ this ] ).length ) { + $( "*", this ).add( [ this ] ).each(function() { + $( this ).triggerHandler( "remove" ); + }); + } + } + return _remove.call( $(this), selector, keepData ); + }); + }; +} + +$.widget = function( name, base, prototype ) { + var namespace = name.split( "." )[ 0 ], + fullName; + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName ] = function( elem ) { + return !!$.data( elem, name ); + }; + + $[ namespace ] = $[ namespace ] || {}; + $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + var basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from +// $.each( basePrototype, function( key, val ) { +// if ( $.isPlainObject(val) ) { +// basePrototype[ key ] = $.extend( {}, val ); +// } +// }); + basePrototype.options = $.extend( true, {}, basePrototype.options ); + $[ namespace ][ name ].prototype = $.extend( true, basePrototype, { + namespace: namespace, + widgetName: name, + widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name, + widgetBaseClass: fullName + }, prototype ); + + $.widget.bridge( name, $[ namespace ][ name ] ); +}; + +$.widget.bridge = function( name, object ) { + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = Array.prototype.slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.extend.apply( null, [ true, options ].concat(args) ) : + options; + + // prevent calls to internal methods + if ( isMethodCall && options.charAt( 0 ) === "_" ) { + return returnValue; + } + + if ( isMethodCall ) { + this.each(function() { + var instance = $.data( this, name ), + methodValue = instance && $.isFunction( instance[options] ) ? + instance[ options ].apply( instance, args ) : + instance; + // TODO: add this back in 1.9 and use $.error() (see #5972) +// if ( !instance ) { +// throw "cannot call methods on " + name + " prior to initialization; " + +// "attempted to call method '" + options + "'"; +// } +// if ( !$.isFunction( instance[options] ) ) { +// throw "no such method '" + options + "' for " + name + " widget instance"; +// } +// var methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, name ); + if ( instance ) { + instance.option( options || {} )._init(); + } else { + $.data( this, name, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } +}; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + options: { + disabled: false + }, + _createWidget: function( options, element ) { + // $.widget.bridge stores the plugin instance, but we do it anyway + // so that it's stored even before the _create function runs + $.data( element, this.widgetName, this ); + this.element = $( element ); + this.options = $.extend( true, {}, + this.options, + this._getCreateOptions(), + options ); + + var self = this; + this.element.bind( "remove." + this.widgetName, function() { + self.destroy(); + }); + + this._create(); + this._trigger( "create" ); + this._init(); + }, + _getCreateOptions: function() { + return $.metadata && $.metadata.get( this.element[0] )[ this.widgetName ]; + }, + _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( key, value ) { + var options = key; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.extend( {}, this.options ); + } + + if (typeof key === "string" ) { + if ( value === undefined ) { + return this.options[ key ]; + } + options = {}; + options[ key ] = value; + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var self = this; + $.each( options, function( key, value ) { + self._setOption( key, value ); + }); + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + [ value ? "addClass" : "removeClass"]( + this.widgetBaseClass + "-disabled" + " " + + "ui-state-disabled" ) + .attr( "aria-disabled", value ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _trigger: function( type, event, data ) { + var callback = this.options[ type ]; + + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + data = data || {}; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if ( event.originalEvent ) { + for ( var i = $.event.props.length, prop; i; ) { + prop = $.event.props[ --i ]; + event[ prop ] = event.originalEvent[ prop ]; + } + } + + this.element.trigger( event, data ); + + return !( $.isFunction(callback) && + callback.call( this.element[0], event, data ) === false || + event.isDefaultPrevented() ); + } +}; + +})( jQuery ); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.blind.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.blind.min.js new file mode 100644 index 00000000000..fa8837c9a1a --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.blind.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Blind 1.8.11 + * + * Copyright 2011, 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/Blind + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.blind=function(c){return this.queue(function(){var a=b(this),g=["position","top","bottom","left","right"],f=b.effects.setMode(a,c.options.mode||"hide"),d=c.options.direction||"vertical";b.effects.save(a,g);a.show();var e=b.effects.createWrapper(a).css({overflow:"hidden"}),h=d=="vertical"?"height":"width";d=d=="vertical"?e.height():e.width();f=="show"&&e.css(h,0);var i={};i[h]=f=="show"?d:0;e.animate(i,c.duration,c.options.easing,function(){f=="hide"&&a.hide();b.effects.restore(a, +g);b.effects.removeWrapper(a);c.callback&&c.callback.apply(a[0],arguments);a.dequeue()})})}})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.bounce.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.bounce.min.js new file mode 100644 index 00000000000..78d1e8d8dc5 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.bounce.min.js @@ -0,0 +1,15 @@ +/* + * jQuery UI Effects Bounce 1.8.11 + * + * Copyright 2011, 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/Bounce + * + * Depends: + * jquery.effects.core.js + */ +(function(e){e.effects.bounce=function(b){return this.queue(function(){var a=e(this),l=["position","top","bottom","left","right"],h=e.effects.setMode(a,b.options.mode||"effect"),d=b.options.direction||"up",c=b.options.distance||20,m=b.options.times||5,i=b.duration||250;/show|hide/.test(h)&&l.push("opacity");e.effects.save(a,l);a.show();e.effects.createWrapper(a);var f=d=="up"||d=="down"?"top":"left";d=d=="up"||d=="left"?"pos":"neg";c=b.options.distance||(f=="top"?a.outerHeight({margin:true})/3:a.outerWidth({margin:true})/ +3);if(h=="show")a.css("opacity",0).css(f,d=="pos"?-c:c);if(h=="hide")c/=m*2;h!="hide"&&m--;if(h=="show"){var g={opacity:1};g[f]=(d=="pos"?"+=":"-=")+c;a.animate(g,i/2,b.options.easing);c/=2;m--}for(g=0;g").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,right:"auto",bottom:"auto"})}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),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(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(m(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(m(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); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.fade.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.fade.min.js new file mode 100644 index 00000000000..6b8c6c25c87 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.fade.min.js @@ -0,0 +1,13 @@ +/* + * jQuery UI Effects Fade 1.8.11 + * + * Copyright 2011, 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/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.fold.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.fold.min.js new file mode 100644 index 00000000000..05c2b69b2f4 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.fold.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Fold 1.8.11 + * + * Copyright 2011, 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","bottom","left","right"],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); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.highlight.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.highlight.min.js new file mode 100644 index 00000000000..9b8d63cdb8b --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.highlight.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Highlight 1.8.11 + * + * Copyright 2011, 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); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.pulsate.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.pulsate.min.js new file mode 100644 index 00000000000..450bbbd8cca --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.effects.pulsate.min.js @@ -0,0 +1,14 @@ +/* + * jQuery UI Effects Pulsate 1.8.11 + * + * Copyright 2011, 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); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.accordion.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.accordion.min.js new file mode 100644 index 00000000000..0d5a88298a3 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.accordion.min.js @@ -0,0 +1,30 @@ +/* + * jQuery UI Accordion 1.8.11 + * + * Copyright 2011, 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/Accordion + * + * Depends: + * jquery.ui.core.js + * jquery.ui.widget.js + */ +(function(c){c.widget("ui.accordion",{options:{active:0,animated:"slide",autoHeight:true,clearStyle:false,collapsible:false,event:"click",fillSpace:false,header:"> 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 h=d.closest(".ui-accordion-header");a.active=h.length?h: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").toggleClass("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(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"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(f){a._clickHandler.call(a,f,this);f.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("aria-selected").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,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); +a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.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)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.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")}}}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 g=this.active.next(), +e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,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;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", +"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"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");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.11", +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"),h=0,f={},g={},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){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/); +f[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(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[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); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.autocomplete.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.autocomplete.min.js new file mode 100644 index 00000000000..933124703ec --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.autocomplete.min.js @@ -0,0 +1,32 @@ +/* + * jQuery UI Autocomplete 1.8.11 + * + * Copyright 2011, 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(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;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||a.element.attr("readonly"))){g= +false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.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("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).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=d("
        ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& +a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},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"); +d.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();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& +b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= +this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length
      • ").data("item.autocomplete",b).append(d("").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}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, +"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); +(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=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(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})}, +deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},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(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0); +e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e, +g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first")); +this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!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,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){if(this.options.text)e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("");d.secondary&&b.append("");if(!this.options.text){e.push(f?"ui-button-icons-only": +"ui-button-icon-only");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_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(this.options.items).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); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.core.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.core.min.js new file mode 100644 index 00000000000..272fe367f62 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.core.min.js @@ -0,0 +1,17 @@ +/*! + * jQuery UI 1.8.11 + * + * Copyright 2011, 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.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, +NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, +"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); +if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, +"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h, +d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); +c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{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')}function F(a,b){d.extend(a,b);for(var c in b)if(b[c]== +null||b[c]==A)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.11"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){F(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);b.dpDiv.show()}},_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)}F(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");F(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.empty();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=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[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));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.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);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[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_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(),j=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>j&&j>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||d.expr.filters.hidden(a));)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;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var 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,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},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=k+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"),j=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)),k=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=k&&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-j,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+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,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;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z= +this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",D=0;D1)switch(E){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)&&D==0?c?f:n:"")+(/all|right/.test(t)&&D==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,D>0||E>0,z,w)+'
        ';var B=j?'":"";for(t=0;t<7;t++){var q= +(t+h)%7;B+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}x+=B+"";B=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,B);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;B=l?6:Math.ceil((t+B)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O";var P=!j?"":'";for(t=0;t<7;t++){var G= +p?p.apply(a.input?a.input[0]:null,[q]):[true,""],C=q.getMonth()!=g,J=C&&!H||!G[0]||k&&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)+""+(C&&!v?" ":J?''+q.getDate()+"":''+q.getDate()+"")+"
        "+(l?""+(i[0]>0&&E==i[1]-1?'
        ':""):"");M+=x}I+=M}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 j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
        ', +o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&& +l)?" ":""));a.yearshtml="";if(h||!l)k+=''+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(a.yearshtml+='";if(d.browser.mozilla)k+='";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
        ";return k},_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-this._daylightSavingAdjust(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(!this.length)return this;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 K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.11";window["DP_jQuery_"+y]=d})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.dialog.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.dialog.min.js new file mode 100644 index 00000000000..1f47be08e62 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.dialog.min.js @@ -0,0 +1,40 @@ +/* + * jQuery UI Dialog 1.8.11 + * + * Copyright 2011, 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){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};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",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="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=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":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(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(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose= +b.beforeclose;f.find("*").add(f).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,e;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]){e=c(this).css("z-index"); +isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.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;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.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._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
        ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
        ").addClass("ui-dialog-buttonset").appendTo(e);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(f, +h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g= +d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize, +position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=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:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f, +h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,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],e;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,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});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;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in +l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled"); +break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e= +this.uiDialog.is(":visible");this.element.show().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();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&& +this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.11",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){if(c(d.target).zIndex()").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){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},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 athis.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=9)&&!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){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate); +if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);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); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.position.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.position.min.js new file mode 100644 index 00000000000..8a5de73b2ba --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.position.min.js @@ -0,0 +1,16 @@ +/* + * jQuery UI Position 1.8.11 + * + * Copyright 2011, 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 n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, +left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= +k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= +m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= +d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= +a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), +g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.progressbar.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.progressbar.min.js new file mode 100644 index 00000000000..cd29ff01309 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.progressbar.min.js @@ -0,0 +1,16 @@ +/* + * jQuery UI Progressbar 1.8.11 + * + * Copyright 2011, 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,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_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.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
        ").appendTo(this.element);this.oldValue=this._value();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===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* +this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.11"})})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.resizable.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.resizable.min.js new file mode 100644 index 00000000000..bb6f85f07e8 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.resizable.min.js @@ -0,0 +1,47 @@ +/* + * jQuery UI Resizable 1.8.11 + * + * Copyright 2011, 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/Resizables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(e){e.widget("ui.resizable",e.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:false,animate:false,animateDuration:"slow",animateEasing:"swing",aspectRatio:false,autoHide:false,containment:false,ghost:false,grid:false,handles:"e,s,se",helper:false,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1E3},_create:function(){var b=this,a=this.options;this.element.addClass("ui-resizable");e.extend(this,{_aspectRatio:!!a.aspectRatio,aspectRatio:a.aspectRatio,originalElement:this.element, +_proportionallyResizeElements:[],_helper:a.helper||a.ghost||a.animate?a.helper||"ui-resizable-helper":null});if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)){/relative/.test(this.element.css("position"))&&e.browser.opera&&this.element.css({position:"relative",top:"auto",left:"auto"});this.element.wrap(e('
        ').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=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.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.11"});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); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.selectable.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.selectable.min.js new file mode 100644 index 00000000000..4b64a439032 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.selectable.min.js @@ -0,0 +1,22 @@ +/* + * jQuery UI Selectable 1.8.11 + * + * Copyright 2011, 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");if(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("
        ");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("").appendTo(this.element).addClass("ui-slider-handle"); +if(a.values&&a.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(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.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(!b.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(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h=== +b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._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(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.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(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b, +g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true}, +_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a; +if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value= +this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max}, +_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.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,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate); +if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.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,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1, +1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.11"})})(jQuery); diff --git a/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.sortable.min.js b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.sortable.min.js new file mode 100644 index 00000000000..d42ebaf620e --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/development-bundle/ui/minified/jquery.ui.sortable.min.js @@ -0,0 +1,60 @@ +/* + * jQuery UI Sortable 1.8.11 + * + * Copyright 2011, 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/Sortables + * + * Depends: + * jquery.ui.core.js + * jquery.ui.mouse.js + * jquery.ui.widget.js + */ +(function(d){d.widget("ui.sortable",d.ui.mouse,{widgetEventPrefix:"sort",options:{appendTo:"parent",axis:false,connectWith:false,containment:false,cursor:"auto",cursorAt:false,dropOnEmpty:true,forcePlaceholderSize:false,forceHelperSize:false,grid:false,handle:false,helper:"original",items:"> *",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"))||/inline|table-cell/.test(this.items[0].item.css("display")):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({target:null});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}}}if(this.placeholder){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.top< +this.containment[1]||g-this.offset.click.top>this.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",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
      • #{label}
      • "},_create:function(){this._tabify(true)},_setOption:function(b,e){if(b=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= +d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=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 i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){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(a._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 a.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){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.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);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).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);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; +this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= +-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.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(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=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 a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.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")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, +e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); +j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.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[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); +if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, +this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, +load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[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(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, +"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,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(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.11"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k").appendTo("body"),c=b.css("display");b.remove();if(c==="none"||c==="")c="block";bZ[a]=c}return bZ[a]}function cc(a,b){var c={};d.each(cb.concat.apply([],cb.slice(0,b)),function(){c[this]=a});return c}function bY(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function bX(){try{return new a.XMLHttpRequest}catch(b){}}function bW(){d(a).unload(function(){for(var a in bU)bU[a](0,1)})}function bQ(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var e=a.dataTypes,f={},g,h,i=e.length,j,k=e[0],l,m,n,o,p;for(g=1;g=0===c})}function N(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function F(a,b){return(a&&a!=="*"?a+".":"")+b.replace(r,"`").replace(s,"&")}function E(a){var b,c,e,f,g,h,i,j,k,l,m,n,o,q=[],r=[],s=d._data(this,"events");if(a.liveFired!==this&&s&&s.live&&!a.target.disabled&&(!a.button||a.type!=="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var t=s.live.slice(0);for(i=0;ic)break;a.currentTarget=f.elem,a.data=f.handleObj.data,a.handleObj=f.handleObj,o=f.handleObj.origHandler.apply(f.elem,arguments);if(o===!1||a.isPropagationStopped()){c=f.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function C(a,c,e){var f=d.extend({},e[0]);f.type=a,f.originalEvent={},f.liveFired=b,d.event.handle.call(c,f),f.isDefaultPrevented()&&e[0].preventDefault()}function w(){return!0}function v(){return!1}function g(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function f(a,c,f){if(f===b&&a.nodeType===1){f=a.getAttribute("data-"+c);if(typeof f==="string"){try{f=f==="true"?!0:f==="false"?!1:f==="null"?null:d.isNaN(f)?e.test(f)?d.parseJSON(f):f:parseFloat(f)}catch(g){}d.data(a,c,f)}else f=b}return f}var c=a.document,d=function(){function I(){if(!d.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(I,1);return}d.ready()}}var d=function(a,b){return new d.fn.init(a,b,g)},e=a.jQuery,f=a.$,g,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,i=/\S/,j=/^\s+/,k=/\s+$/,l=/\d/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=navigator.userAgent,w,x=!1,y,z="then done fail isResolved isRejected promise".split(" "),A,B=Object.prototype.toString,C=Object.prototype.hasOwnProperty,D=Array.prototype.push,E=Array.prototype.slice,F=String.prototype.trim,G=Array.prototype.indexOf,H={};d.fn=d.prototype={constructor:d,init:function(a,e,f){var g,i,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!e&&c.body){this.context=c,this[0]=c.body,this.selector="body",this.length=1;return this}if(typeof a==="string"){g=h.exec(a);if(!g||!g[1]&&e)return!e||e.jquery?(e||f).find(a):this.constructor(e).find(a);if(g[1]){e=e instanceof d?e[0]:e,k=e?e.ownerDocument||e:c,j=m.exec(a),j?d.isPlainObject(e)?(a=[c.createElement(j[1])],d.fn.attr.call(a,e,!0)):a=[k.createElement(j[1])]:(j=d.buildFragment([g[1]],[k]),a=(j.cacheable?d.clone(j.fragment):j.fragment).childNodes);return d.merge(this,a)}i=c.getElementById(g[2]);if(i&&i.parentNode){if(i.id!==g[2])return f.find(a);this.length=1,this[0]=i}this.context=c,this.selector=a;return this}if(d.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return d.makeArray(a,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return E.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var e=this.constructor();d.isArray(a)?D.apply(e,a):d.merge(e,a),e.prevObject=this,e.context=this.context,b==="find"?e.selector=this.selector+(this.selector?" ":"")+c:b&&(e.selector=this.selector+"."+b+"("+c+")");return e},each:function(a,b){return d.each(this,a,b)},ready:function(a){d.bindReady(),y.done(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(E.apply(this,arguments),"slice",E.call(arguments).join(","))},map:function(a){return this.pushStack(d.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:D,sort:[].sort,splice:[].splice},d.fn.init.prototype=d.fn,d.extend=d.fn.extend=function(){var a,c,e,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i==="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!=="object"&&!d.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;y.resolveWith(c,[d]),d.fn.trigger&&d(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!x){x=!0;if(c.readyState==="complete")return setTimeout(d.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",A,!1),a.addEventListener("load",d.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",A),a.attachEvent("onload",d.ready);var b=!1;try{b=a.frameElement==null}catch(e){}c.documentElement.doScroll&&b&&I()}}},isFunction:function(a){return d.type(a)==="function"},isArray:Array.isArray||function(a){return d.type(a)==="array"},isWindow:function(a){return a&&typeof a==="object"&&"setInterval"in a},isNaN:function(a){return a==null||!l.test(a)||isNaN(a)},type:function(a){return a==null?String(a):H[B.call(a)]||"object"},isPlainObject:function(a){if(!a||d.type(a)!=="object"||a.nodeType||d.isWindow(a))return!1;if(a.constructor&&!C.call(a,"constructor")&&!C.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a){}return c===b||C.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!=="string"||!b)return null;b=d.trim(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return a.JSON&&a.JSON.parse?a.JSON.parse(b):(new Function("return "+b))();d.error("Invalid JSON: "+b)},parseXML:function(b,c,e){a.DOMParser?(e=new DOMParser,c=e.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),e=c.documentElement,(!e||!e.nodeName||e.nodeName==="parsererror")&&d.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(a){if(a&&i.test(a)){var b=c.head||c.getElementsByTagName("head")[0]||c.documentElement,e=c.createElement("script");d.support.scriptEval()?e.appendChild(c.createTextNode(a)):e.text=a,b.insertBefore(e,b.firstChild),b.removeChild(e)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,e){var f,g=0,h=a.length,i=h===b||d.isFunction(a);if(e){if(i){for(f in a)if(c.apply(a[f],e)===!1)break}else for(;g1){var f=E.call(arguments,0),g=b,h=function(a){return function(b){f[a]=arguments.length>1?E.call(arguments,0):b,--g||c.resolveWith(e,f)}};while(b--)a=f[b],a&&d.isFunction(a.promise)?a.promise().then(h(b),c.reject):--g;g||c.resolveWith(e,f)}else c!==a&&c.resolve(a);return e},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}d.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.subclass=this.subclass,a.fn.init=function b(b,c){c&&c instanceof d&&!(c instanceof a)&&(c=a(c));return d.fn.init.call(this,b,c,e)},a.fn.init.prototype=a.fn;var e=a(c);return a},browser:{}}),y=d._Deferred(),d.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){H["[object "+b+"]"]=b.toLowerCase()}),w=d.uaMatch(v),w.browser&&(d.browser[w.browser]=!0,d.browser.version=w.version),d.browser.webkit&&(d.browser.safari=!0),G&&(d.inArray=function(a,b){return G.call(b,a)}),i.test(" ")&&(j=/^[\s\xA0]+/,k=/[\s\xA0]+$/),g=d(c),c.addEventListener?A=function(){c.removeEventListener("DOMContentLoaded",A,!1),d.ready()}:c.attachEvent&&(A=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",A),d.ready())});return d}();(function(){d.support={};var b=c.createElement("div");b.style.display="none",b.innerHTML="
        a";var e=b.getElementsByTagName("*"),f=b.getElementsByTagName("a")[0],g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=b.getElementsByTagName("input")[0];if(e&&e.length&&f){d.support={leadingWhitespace:b.firstChild.nodeType===3,tbody:!b.getElementsByTagName("tbody").length,htmlSerialize:!!b.getElementsByTagName("link").length,style:/red/.test(f.getAttribute("style")),hrefNormalized:f.getAttribute("href")==="/a",opacity:/^0.55$/.test(f.style.opacity),cssFloat:!!f.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,deleteExpando:!0,optDisabled:!1,checkClone:!1,noCloneEvent:!0,noCloneChecked:!0,boxModel:null,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableHiddenOffsets:!0},i.checked=!0,d.support.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,d.support.optDisabled=!h.disabled;var j=null;d.support.scriptEval=function(){if(j===null){var b=c.documentElement,e=c.createElement("script"),f="script"+d.now();try{e.appendChild(c.createTextNode("window."+f+"=1;"))}catch(g){}b.insertBefore(e,b.firstChild),a[f]?(j=!0,delete a[f]):j=!1,b.removeChild(e),b=e=f=null}return j};try{delete b.test}catch(k){d.support.deleteExpando=!1}!b.addEventListener&&b.attachEvent&&b.fireEvent&&(b.attachEvent("onclick",function l(){d.support.noCloneEvent=!1,b.detachEvent("onclick",l)}),b.cloneNode(!0).fireEvent("onclick")),b=c.createElement("div"),b.innerHTML="";var m=c.createDocumentFragment();m.appendChild(b.firstChild),d.support.checkClone=m.cloneNode(!0).cloneNode(!0).lastChild.checked,d(function(){var a=c.createElement("div"),b=c.getElementsByTagName("body")[0];if(b){a.style.width=a.style.paddingLeft="1px",b.appendChild(a),d.boxModel=d.support.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,d.support.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="
        ",d.support.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="
        t
        ";var e=a.getElementsByTagName("td");d.support.reliableHiddenOffsets=e[0].offsetHeight===0,e[0].style.display="",e[1].style.display="none",d.support.reliableHiddenOffsets=d.support.reliableHiddenOffsets&&e[0].offsetHeight===0,a.innerHTML="",b.removeChild(a).style.display="none",a=e=null}});var n=function(a){var b=c.createElement("div");a="on"+a;if(!b.attachEvent)return!0;var d=a in b;d||(b.setAttribute(a,"return;"),d=typeof b[a]==="function"),b=null;return d};d.support.submitBubbles=n("submit"),d.support.changeBubbles=n("change"),b=e=f=null}})();var e=/^(?:\{.*\}|\[.*\])$/;d.extend({cache:{},uuid:0,expando:"jQuery"+(d.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?d.cache[a[d.expando]]:a[d.expando];return!!a&&!g(a)},data:function(a,c,e,f){if(d.acceptData(a)){var g=d.expando,h=typeof c==="string",i,j=a.nodeType,k=j?d.cache:a,l=j?a[d.expando]:a[d.expando]&&d.expando;if((!l||f&&l&&!k[l][g])&&h&&e===b)return;l||(j?a[d.expando]=l=++d.uuid:l=d.expando),k[l]||(k[l]={},j||(k[l].toJSON=d.noop));if(typeof c==="object"||typeof c==="function")f?k[l][g]=d.extend(k[l][g],c):k[l]=d.extend(k[l],c);i=k[l],f&&(i[g]||(i[g]={}),i=i[g]),e!==b&&(i[c]=e);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[c]:i}},removeData:function(b,c,e){if(d.acceptData(b)){var f=d.expando,h=b.nodeType,i=h?d.cache:b,j=h?b[d.expando]:d.expando;if(!i[j])return;if(c){var k=e?i[j][f]:i[j];if(k){delete k[c];if(!g(k))return}}if(e){delete i[j][f];if(!g(i[j]))return}var l=i[j][f];d.support.deleteExpando||i!=a?delete i[j]:i[j]=null,l?(i[j]={},h||(i[j].toJSON=d.noop),i[j][f]=l):h&&(d.support.deleteExpando?delete b[d.expando]:b.removeAttribute?b.removeAttribute(d.expando):b[d.expando]=null)}},_data:function(a,b,c){return d.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=d.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),d.fn.extend({data:function(a,c){var e=null;if(typeof a==="undefined"){if(this.length){e=d.data(this[0]);if(this[0].nodeType===1){var g=this[0].attributes,h;for(var i=0,j=g.length;i-1)return!0;return!1},val:function(a){if(!arguments.length){var c=this[0];if(c){if(d.nodeName(c,"option")){var e=c.attributes.value;return!e||e.specified?c.value:c.text}if(d.nodeName(c,"select")){var f=c.selectedIndex,g=[],h=c.options,i=c.type==="select-one";if(f<0)return null;for(var k=i?f:0,l=i?f+1:h.length;k=0;else if(d.nodeName(this,"select")){var f=d.makeArray(e);d("option",this).each(function(){this.selected=d.inArray(d(this).val(),f)>=0}),f.length||(this.selectedIndex=-1)}else this.value=e}})}}),d.extend({attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,e,f){if(!a||a.nodeType===3||a.nodeType===8||a.nodeType===2)return b;if(f&&c in d.attrFn)return d(a)[c](e);var g=a.nodeType!==1||!d.isXMLDoc(a),h=e!==b;c=g&&d.props[c]||c;if(a.nodeType===1){var i=k.test(c);if(c==="selected"&&!d.support.optSelected){var j=a.parentNode;j&&(j.selectedIndex,j.parentNode&&j.parentNode.selectedIndex)}if((c in a||a[c]!==b)&&g&&!i){h&&(c==="type"&&l.test(a.nodeName)&&a.parentNode&&d.error("type property can't be changed"),e===null?a.nodeType===1&&a.removeAttribute(c):a[c]=e);if(d.nodeName(a,"form")&&a.getAttributeNode(c))return a.getAttributeNode(c).nodeValue;if(c==="tabIndex"){var o=a.getAttributeNode("tabIndex");return o&&o.specified?o.value:m.test(a.nodeName)||n.test(a.nodeName)&&a.href?0:b}return a[c]}if(!d.support.style&&g&&c==="style"){h&&(a.style.cssText=""+e);return a.style.cssText}h&&a.setAttribute(c,""+e);if(!a.attributes[c]&&(a.hasAttribute&&!a.hasAttribute(c)))return b;var p=!d.support.hrefNormalized&&g&&i?a.getAttribute(c,2):a.getAttribute(c);return p===null?b:p}h&&(a[c]=e);return a[c]}});var p=/\.(.*)$/,q=/^(?:textarea|input|select)$/i,r=/\./g,s=/ /g,t=/[^\w\s.|`]/g,u=function(a){return a.replace(t,"\\$&")};d.event={add:function(c,e,f,g){if(c.nodeType!==3&&c.nodeType!==8){try{d.isWindow(c)&&(c!==a&&!c.frameElement)&&(c=a)}catch(h){}if(f===!1)f=v;else if(!f)return;var i,j;f.handler&&(i=f,f=i.handler),f.guid||(f.guid=d.guid++);var k=d._data(c);if(!k)return;var l=k.events,m=k.handle;l||(k.events=l={}),m||(k.handle=m=function(){return typeof d!=="undefined"&&!d.event.triggered?d.event.handle.apply(m.elem,arguments):b}),m.elem=c,e=e.split(" ");var n,o=0,p;while(n=e[o++]){j=i?d.extend({},i):{handler:f,data:g},n.indexOf(".")>-1?(p=n.split("."),n=p.shift(),j.namespace=p.slice(0).sort().join(".")):(p=[],j.namespace=""),j.type=n,j.guid||(j.guid=f.guid);var q=l[n],r=d.event.special[n]||{};if(!q){q=l[n]=[];if(!r.setup||r.setup.call(c,g,p,m)===!1)c.addEventListener?c.addEventListener(n,m,!1):c.attachEvent&&c.attachEvent("on"+n,m)}r.add&&(r.add.call(c,j),j.handler.guid||(j.handler.guid=f.guid)),q.push(j),d.event.global[n]=!0}c=null}},global:{},remove:function(a,c,e,f){if(a.nodeType!==3&&a.nodeType!==8){e===!1&&(e=v);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=d.hasData(a)&&d._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(e=c.handler,c=c.type);if(!c||typeof c==="string"&&c.charAt(0)==="."){c=c||"";for(h in t)d.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+d.map(m.slice(0).sort(),u).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!e){for(j=0;j=0&&(a.type=f=f.slice(0,-1),a.exclusive=!0),e||(a.stopPropagation(),d.event.global[f]&&d.each(d.cache,function(){var b=d.expando,e=this[b];e&&e.events&&e.events[f]&&d.event.trigger(a,c,e.handle.elem)}));if(!e||e.nodeType===3||e.nodeType===8)return b;a.result=b,a.target=e,c=d.makeArray(c),c.unshift(a)}a.currentTarget=e;var h=d._data(e,"handle");h&&h.apply(e,c);var i=e.parentNode||e.ownerDocument;try{e&&e.nodeName&&d.noData[e.nodeName.toLowerCase()]||e["on"+f]&&e["on"+f].apply(e,c)===!1&&(a.result=!1,a.preventDefault())}catch(j){}if(!a.isPropagationStopped()&&i)d.event.trigger(a,c,i,!0);else if(!a.isDefaultPrevented()){var k,l=a.target,m=f.replace(p,""),n=d.nodeName(l,"a")&&m==="click",o=d.event.special[m]||{};if((!o._default||o._default.call(e,a)===!1)&&!n&&!(l&&l.nodeName&&d.noData[l.nodeName.toLowerCase()])){try{l[m]&&(k=l["on"+m],k&&(l["on"+m]=null),d.event.triggered=!0,l[m]())}catch(q){}k&&(l["on"+m]=k),d.event.triggered=!1}}},handle:function(c){var e,f,g,h,i,j=[],k=d.makeArray(arguments);c=k[0]=d.event.fix(c||a.event),c.currentTarget=this,e=c.type.indexOf(".")<0&&!c.exclusive,e||(g=c.type.split("."),c.type=g.shift(),j=g.slice(0).sort(),h=new RegExp("(^|\\.)"+j.join("\\.(?:.*\\.)?")+"(\\.|$)")),c.namespace=c.namespace||j.join("."),i=d._data(this,"events"),f=(i||{})[c.type];if(i&&f){f=f.slice(0);for(var l=0,m=f.length;l-1?d.map(a.options,function(a){return a.selected}).join("-"):"":a.nodeName.toLowerCase()==="select"&&(c=a.selectedIndex);return c},B=function B(a){var c=a.target,e,f;if(q.test(c.nodeName)&&!c.readOnly){e=d._data(c,"_change_data"),f=A(c),(a.type!=="focusout"||c.type!=="radio")&&d._data(c,"_change_data",f);if(e===b||f===e)return;if(e!=null||f)a.type="change",a.liveFired=b,d.event.trigger(a,arguments[1],c)}};d.event.special.change={filters:{focusout:B,beforedeactivate:B,click:function(a){var b=a.target,c=b.type;(c==="radio"||c==="checkbox"||b.nodeName.toLowerCase()==="select")&&B.call(this,a)},keydown:function(a){var b=a.target,c=b.type;(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&B.call(this,a)},beforeactivate:function(a){var b=a.target;d._data(b,"_change_data",A(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in z)d.event.add(this,c+".specialChange",z[c]);return q.test(this.nodeName)},teardown:function(a){d.event.remove(this,".specialChange");return q.test(this.nodeName)}},z=d.event.special.change.filters,z.focus=z.beforeactivate}c.addEventListener&&d.each({focus:"focusin",blur:"focusout"},function(a,b){function c(a){a=d.event.fix(a),a.type=b;return d.event.handle.call(this,a)}d.event.special[b]={setup:function(){this.addEventListener(a,c,!0)},teardown:function(){this.removeEventListener(a,c,!0)}}}),d.each(["bind","one"],function(a,c){d.fn[c]=function(a,e,f){if(typeof a==="object"){for(var g in a)this[c](g,e,a[g],f);return this}if(d.isFunction(e)||e===!1)f=e,e=b;var h=c==="one"?d.proxy(f,function(a){d(this).unbind(a,h);return f.apply(this,arguments)}):f;if(a==="unload"&&c!=="one")this.one(a,e,f);else for(var i=0,j=this.length;i0?this.bind(b,a,c):this.trigger(b)},d.attrFn&&(d.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,e,g){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!=="string")return e;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(f.call(n)==="[object Array]")if(u)if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&e.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&e.push(j[t]);else e.push.apply(e,n);else p(n,e);o&&(k(o,h,e,g),k.uniqueSort(e));return e};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e":function(a,b){var c,d=typeof b==="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){return"text"===a.getAttribute("type")},radio:function(a){return"radio"===a.type},checkbox:function(a){return"checkbox"===a.type},file:function(a){return"file"===a.type},password:function(a){return"password"===a.type},submit:function(a){return"submit"===a.type},image:function(a){return"image"===a.type},reset:function(a){return"reset"===a.type},button:function(a){return"button"===a.type||a.nodeName.toLowerCase()==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(f.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length==="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!=="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!=="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!=="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!=="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

        ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector,d=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(e){d=!0}b&&(k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(d||!l.match.PSEUDO.test(c)&&!/!=/.test(c))return b.call(a,c)}catch(e){}return k(c,null,null,[a]).length>0})}(),function(){var a=c.createElement("div");a.innerHTML="
        ";if(a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!=="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g0)for(var g=c;g0},closest:function(a,b){var c=[],e,f,g=this[0];if(d.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(e=0,f=a.length;e-1:d(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=L.test(a)?d(a,b||this.context):null;for(e=0,f=this.length;e-1:d.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b)break}}c=c.length>1?d.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a==="string")return d.inArray(this[0],a?d(a):this.parent().children());return d.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a==="string"?d(a,b):d.makeArray(a),e=d.merge(this.get(),c);return this.pushStack(N(c[0])||N(e[0])?e:d.unique(e))},andSelf:function(){return this.add(this.prevObject)}}),d.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return d.dir(a,"parentNode")},parentsUntil:function(a,b,c){return d.dir(a,"parentNode",c)},next:function(a){return d.nth(a,2,"nextSibling")},prev:function(a){return d.nth(a,2,"previousSibling")},nextAll:function(a){return d.dir(a,"nextSibling")},prevAll:function(a){return d.dir(a,"previousSibling")},nextUntil:function(a,b,c){return d.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return d.dir(a,"previousSibling",c)},siblings:function(a){return d.sibling(a.parentNode.firstChild,a)},children:function(a){return d.sibling(a.firstChild)},contents:function(a){return d.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:d.makeArray(a.childNodes)}},function(a,b){d.fn[a]=function(c,e){var f=d.map(this,b,c),g=K.call(arguments);G.test(a)||(e=c),e&&typeof e==="string"&&(f=d.filter(e,f)),f=this.length>1&&!M[a]?d.unique(f):f,(this.length>1||I.test(e))&&H.test(a)&&(f=f.reverse());return this.pushStack(f,a,g.join(","))}}),d.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?d.find.matchesSelector(b[0],a)?[b[0]]:[]:d.find.matches(a,b)},dir:function(a,c,e){var f=[],g=a[c];while(g&&g.nodeType!==9&&(e===b||g.nodeType!==1||!d(g).is(e)))g.nodeType===1&&f.push(g),g=g[c];return f},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var P=/ jQuery\d+="(?:\d+|null)"/g,Q=/^\s+/,R=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,S=/<([\w:]+)/,T=/",""],legend:[1,"
        ","
        "],thead:[1,"","
        "],tr:[2,"","
        "],td:[3,"","
        "],col:[2,"","
        "],area:[1,"",""],_default:[0,"",""]};X.optgroup=X.option,X.tbody=X.tfoot=X.colgroup=X.caption=X.thead,X.th=X.td,d.support.htmlSerialize||(X._default=[1,"div
        ","
        "]),d.fn.extend({text:function(a){if(d.isFunction(a))return this.each(function(b){var c=d(this);c.text(a.call(this,b,c.text()))});if(typeof a!=="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return d.text(this)},wrapAll:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapAll(a.call(this,b))});if(this[0]){var b=d(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(d.isFunction(a))return this.each(function(b){d(this).wrapInner(a.call(this,b))});return this.each(function(){var b=d(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){d(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){d.nodeName(this,"body")||d(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=d(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,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,d(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,e;(e=this[c])!=null;c++)if(!a||d.filter(a,[e]).length)!b&&e.nodeType===1&&(d.cleanData(e.getElementsByTagName("*")),d.cleanData([e])),e.parentNode&&e.parentNode.removeChild(e);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&d.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return d.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(P,""):null;if(typeof a!=="string"||V.test(a)||!d.support.leadingWhitespace&&Q.test(a)||X[(S.exec(a)||["",""])[1].toLowerCase()])d.isFunction(a)?this.each(function(b){var c=d(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);else{a=a.replace(R,"<$1>");try{for(var c=0,e=this.length;c1&&l0?this.clone(!0):this).get();d(f[h])[b](j),e=e.concat(j)}return this.pushStack(e,a,f.selector)}}),d.extend({clone:function(a,b,c){var e=a.cloneNode(!0),f,g,h;if((!d.support.noCloneEvent||!d.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!d.isXMLDoc(a)){$(a,e),f=_(a),g=_(e);for(h=0;f[h];++h)$(f[h],g[h])}if(b){Z(a,e);if(c){f=_(a),g=_(e);for(h=0;f[h];++h)Z(f[h],g[h])}}return e},clean:function(a,b,e,f){b=b||c,typeof b.createElement==="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var g=[];for(var h=0,i;(i=a[h])!=null;h++){typeof i==="number"&&(i+="");if(!i)continue;if(typeof i!=="string"||U.test(i)){if(typeof i==="string"){i=i.replace(R,"<$1>");var j=(S.exec(i)||["",""])[1].toLowerCase(),k=X[j]||X._default,l=k[0],m=b.createElement("div");m.innerHTML=k[1]+i+k[2];while(l--)m=m.lastChild;if(!d.support.tbody){var n=T.test(i),o=j==="table"&&!n?m.firstChild&&m.firstChild.childNodes:k[1]===""&&!n?m.childNodes:[];for(var p=o.length-1;p>=0;--p)d.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!d.support.leadingWhitespace&&Q.test(i)&&m.insertBefore(b.createTextNode(Q.exec(i)[0]),m.firstChild),i=m.childNodes}}else i=b.createTextNode(i);i.nodeType?g.push(i):g=d.merge(g,i)}if(e)for(h=0;g[h];h++)!f||!d.nodeName(g[h],"script")||g[h].type&&g[h].type.toLowerCase()!=="text/javascript"?(g[h].nodeType===1&&g.splice.apply(g,[h+1,0].concat(d.makeArray(g[h].getElementsByTagName("script")))),e.appendChild(g[h])):f.push(g[h].parentNode?g[h].parentNode.removeChild(g[h]):g[h]);return g},cleanData:function(a){var b,c,e=d.cache,f=d.expando,g=d.event.special,h=d.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&d.noData[j.nodeName.toLowerCase()])continue;c=j[d.expando];if(c){b=e[c]&&e[c][f];if(b&&b.events){for(var k in b.events)g[k]?d.event.remove(j,k):d.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[d.expando]:j.removeAttribute&&j.removeAttribute(d.expando),delete e[c]}}}});var bb=/alpha\([^)]*\)/i,bc=/opacity=([^)]*)/,bd=/-([a-z])/ig,be=/([A-Z])/g,bf=/^-?\d+(?:px)?$/i,bg=/^-?\d/,bh={position:"absolute",visibility:"hidden",display:"block"},bi=["Left","Right"],bj=["Top","Bottom"],bk,bl,bm,bn=function(a,b){return b.toUpperCase()};d.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return d.access(this,a,c,!0,function(a,c,e){return e!==b?d.style(a,c,e):d.css(a,c)})},d.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bk(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{zIndex:!0,fontWeight:!0,opacity:!0,zoom:!0,lineHeight:!0},cssProps:{"float":d.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,e,f){if(a&&a.nodeType!==3&&a.nodeType!==8&&a.style){var g,h=d.camelCase(c),i=a.style,j=d.cssHooks[h];c=d.cssProps[h]||h;if(e===b){if(j&&"get"in j&&(g=j.get(a,!1,f))!==b)return g;return i[c]}if(typeof e==="number"&&isNaN(e)||e==null)return;typeof e==="number"&&!d.cssNumber[h]&&(e+="px");if(!j||!("set"in j)||(e=j.set(a,e))!==b)try{i[c]=e}catch(k){}}},css:function(a,c,e){var f,g=d.camelCase(c),h=d.cssHooks[g];c=d.cssProps[g]||g;if(h&&"get"in h&&(f=h.get(a,!0,e))!==b)return f;if(bk)return bk(a,c,g)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]},camelCase:function(a){return a.replace(bd,bn)}}),d.curCSS=d.css,d.each(["height","width"],function(a,b){d.cssHooks[b]={get:function(a,c,e){var f;if(c){a.offsetWidth!==0?f=bo(a,b,e):d.swap(a,bh,function(){f=bo(a,b,e)});if(f<=0){f=bk(a,b,b),f==="0px"&&bm&&(f=bm(a,b,b));if(f!=null)return f===""||f==="auto"?"0px":f}if(f<0||f==null){f=a.style[b];return f===""||f==="auto"?"0px":f}return typeof f==="string"?f:f+"px"}},set:function(a,b){if(!bf.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),d.support.opacity||(d.cssHooks.opacity={get:function(a,b){return bc.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style;c.zoom=1;var e=d.isNaN(b)?"":"alpha(opacity="+b*100+")",f=c.filter||"";c.filter=bb.test(f)?f.replace(bb,e):c.filter+" "+e}}),c.defaultView&&c.defaultView.getComputedStyle&&(bl=function(a,c,e){var f,g,h;e=e.replace(be,"-$1").toLowerCase();if(!(g=a.ownerDocument.defaultView))return b;if(h=g.getComputedStyle(a,null))f=h.getPropertyValue(e),f===""&&!d.contains(a.ownerDocument.documentElement,a)&&(f=d.style(a,e));return f}),c.documentElement.currentStyle&&(bm=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bf.test(d)&&bg.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bk=bl||bm,d.expr&&d.expr.filters&&(d.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!d.support.reliableHiddenOffsets&&(a.style.display||d.css(a,"display"))==="none"},d.expr.filters.visible=function(a){return!d.expr.filters.hidden(a)});var bp=/%20/g,bq=/\[\]$/,br=/\r?\n/g,bs=/#.*$/,bt=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bu=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bv=/(?:^file|^widget|\-extension):$/,bw=/^(?:GET|HEAD)$/,bx=/^\/\//,by=/\?/,bz=/)<[^<]*)*<\/script>/gi,bA=/^(?:select|textarea)/i,bB=/\s+/,bC=/([?&])_=[^&]*/,bD=/(^|\-)([a-z])/g,bE=function(a,b,c){return b+c.toUpperCase()},bF=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,bG=d.fn.load,bH={},bI={},bJ,bK;try{bJ=c.location.href}catch(bL){bJ=c.createElement("a"),bJ.href="",bJ=bJ.href}bK=bF.exec(bJ.toLowerCase()),d.fn.extend({load:function(a,c,e){if(typeof a!=="string"&&bG)return bG.apply(this,arguments);if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var g=a.slice(f,a.length);a=a.slice(0,f)}var h="GET";c&&(d.isFunction(c)?(e=c,c=b):typeof c==="object"&&(c=d.param(c,d.ajaxSettings.traditional),h="POST"));var i=this;d.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?d("
        ").append(c.replace(bz,"")).find(g):c)),e&&i.each(e,[c,b,a])}});return this},serialize:function(){return d.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?d.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bA.test(this.nodeName)||bu.test(this.type))}).map(function(a,b){var c=d(this).val();return c==null?null:d.isArray(c)?d.map(c,function(a,c){return{name:b.name,value:a.replace(br,"\r\n")}}):{name:b.name,value:c.replace(br,"\r\n")}}).get()}}),d.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){d.fn[b]=function(a){return this.bind(b,a)}}),d.each(["get","post"],function(a,c){d[c]=function(a,e,f,g){d.isFunction(e)&&(g=g||f,f=e,e=b);return d.ajax({type:c,url:a,data:e,success:f,dataType:g})}}),d.extend({getScript:function(a,c){return d.get(a,b,c,"script")},getJSON:function(a,b,c){return d.get(a,b,c,"json")},ajaxSetup:function(a,b){b?d.extend(!0,a,d.ajaxSettings,b):(b=a,a=d.extend(!0,d.ajaxSettings,b));for(var c in {context:1,url:1})c in b?a[c]=b[c]:c in d.ajaxSettings&&(a[c]=d.ajaxSettings[c]);return a},ajaxSettings:{url:bJ,isLocal:bv.test(bK[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":d.parseJSON,"text xml":d.parseXML}},ajaxPrefilter:bM(bH),ajaxTransport:bM(bI),ajax:function(a,c){function v(a,c,l,n){if(r!==2){r=2,p&&clearTimeout(p),o=b,m=n||"",u.readyState=a?4:0;var q,t,v,w=l?bP(e,u,l):b,x,y;if(a>=200&&a<300||a===304){if(e.ifModified){if(x=u.getResponseHeader("Last-Modified"))d.lastModified[k]=x;if(y=u.getResponseHeader("Etag"))d.etag[k]=y}if(a===304)c="notmodified",q=!0;else try{t=bQ(e,w),c="success",q=!0}catch(z){c="parsererror",v=z}}else{v=c;if(!c||a)c="error",a<0&&(a=0)}u.status=a,u.statusText=c,q?h.resolveWith(f,[t,c,u]):h.rejectWith(f,[u,c,v]),u.statusCode(j),j=b,s&&g.trigger("ajax"+(q?"Success":"Error"),[u,e,q?t:v]),i.resolveWith(f,[u,c]),s&&(g.trigger("ajaxComplete",[u,e]),--d.active||d.event.trigger("ajaxStop"))}}typeof a==="object"&&(c=a,a=b),c=c||{};var e=d.ajaxSetup({},c),f=e.context||e,g=f!==e&&(f.nodeType||f instanceof d)?d(f):d.event,h=d.Deferred(),i=d._Deferred(),j=e.statusCode||{},k,l={},m,n,o,p,q,r=0,s,t,u={readyState:0,setRequestHeader:function(a,b){r||(l[a.toLowerCase().replace(bD,bE)]=b);return this},getAllResponseHeaders:function(){return r===2?m:null},getResponseHeader:function(a){var c;if(r===2){if(!n){n={};while(c=bt.exec(m))n[c[1].toLowerCase()]=c[2]}c=n[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){r||(e.mimeType=a);return this},abort:function(a){a=a||"abort",o&&o.abort(a),v(0,a);return this}};h.promise(u),u.success=u.done,u.error=u.fail,u.complete=i.done,u.statusCode=function(a){if(a){var b;if(r<2)for(b in a)j[b]=[j[b],a[b]];else b=a[u.status],u.then(b,b)}return this},e.url=((a||e.url)+"").replace(bs,"").replace(bx,bK[1]+"//"),e.dataTypes=d.trim(e.dataType||"*").toLowerCase().split(bB),e.crossDomain||(q=bF.exec(e.url.toLowerCase()),e.crossDomain=q&&(q[1]!=bK[1]||q[2]!=bK[2]||(q[3]||(q[1]==="http:"?80:443))!=(bK[3]||(bK[1]==="http:"?80:443)))),e.data&&e.processData&&typeof e.data!=="string"&&(e.data=d.param(e.data,e.traditional)),bN(bH,e,c,u);if(r===2)return!1;s=e.global,e.type=e.type.toUpperCase(),e.hasContent=!bw.test(e.type),s&&d.active++===0&&d.event.trigger("ajaxStart");if(!e.hasContent){e.data&&(e.url+=(by.test(e.url)?"&":"?")+e.data),k=e.url;if(e.cache===!1){var w=d.now(),x=e.url.replace(bC,"$1_="+w);e.url=x+(x===e.url?(by.test(e.url)?"&":"?")+"_="+w:"")}}if(e.data&&e.hasContent&&e.contentType!==!1||c.contentType)l["Content-Type"]=e.contentType;e.ifModified&&(k=k||e.url,d.lastModified[k]&&(l["If-Modified-Since"]=d.lastModified[k]),d.etag[k]&&(l["If-None-Match"]=d.etag[k])),l.Accept=e.dataTypes[0]&&e.accepts[e.dataTypes[0]]?e.accepts[e.dataTypes[0]]+(e.dataTypes[0]!=="*"?", */*; q=0.01":""):e.accepts["*"];for(t in e.headers)u.setRequestHeader(t,e.headers[t]);if(e.beforeSend&&(e.beforeSend.call(f,u,e)===!1||r===2)){u.abort();return!1}for(t in {success:1,error:1,complete:1})u[t](e[t]);o=bN(bI,e,c,u);if(o){u.readyState=1,s&&g.trigger("ajaxSend",[u,e]),e.async&&e.timeout>0&&(p=setTimeout(function(){u.abort("timeout")},e.timeout));try{r=1,o.send(l,v)}catch(y){status<2?v(-1,y):d.error(y)}}else v(-1,"No Transport");return u},param:function(a,c){var e=[],f=function(a,b){b=d.isFunction(b)?b():b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=d.ajaxSettings.traditional);if(d.isArray(a)||a.jquery&&!d.isPlainObject(a))d.each(a,function(){f(this.name,this.value)});else for(var g in a)bO(g,a[g],c,f);return e.join("&").replace(bp,"+")}}),d.extend({active:0,lastModified:{},etag:{}});var bR=d.now(),bS=/(\=)\?(&|$)|()\?\?()/i;d.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return d.expando+"_"+bR++}}),d.ajaxPrefilter("json jsonp",function(b,c,e){var f=typeof b.data==="string";if(b.dataTypes[0]==="jsonp"||c.jsonpCallback||c.jsonp!=null||b.jsonp!==!1&&(bS.test(b.url)||f&&bS.test(b.data))){var g,h=b.jsonpCallback=d.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2",m=function(){a[h]=i,g&&d.isFunction(i)&&a[h](g[0])};b.jsonp!==!1&&(j=j.replace(bS,l),b.url===j&&(f&&(k=k.replace(bS,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},e.then(m,m),b.converters["script json"]=function(){g||d.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),d.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){d.globalEval(a);return a}}}),d.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),d.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var bT=d.now(),bU,bV;d.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&bX()||bY()}:bX,bV=d.ajaxSettings.xhr(),d.support.ajax=!!bV,d.support.cors=bV&&"withCredentials"in bV,bV=b,d.support.ajax&&d.ajaxTransport(function(a){if(!a.crossDomain||d.support.cors){var c;return{send:function(e,f){var g=a.xhr(),h,i;a.username?g.open(a.type,a.url,a.async,a.username,a.password):g.open(a.type,a.url,a.async);if(a.xhrFields)for(i in a.xhrFields)g[i]=a.xhrFields[i];a.mimeType&&g.overrideMimeType&&g.overrideMimeType(a.mimeType),(!a.crossDomain||a.hasContent)&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(i in e)g.setRequestHeader(i,e[i])}catch(j){}g.send(a.hasContent&&a.data||null),c=function(e,i){var j,k,l,m,n;try{if(c&&(i||g.readyState===4)){c=b,h&&(g.onreadystatechange=d.noop,delete bU[h]);if(i)g.readyState!==4&&g.abort();else{j=g.status,l=g.getAllResponseHeaders(),m={},n=g.responseXML,n&&n.documentElement&&(m.xml=n),m.text=g.responseText;try{k=g.statusText}catch(o){k=""}j||!a.isLocal||a.crossDomain?j===1223&&(j=204):j=m.text?200:404}}}catch(p){i||f(-1,p)}m&&f(j,k,m,l)},a.async&&g.readyState!==4?(bU||(bU={},bW()),h=bT++,g.onreadystatechange=bU[h]=c):c()},abort:function(){c&&c(0,1)}}}});var bZ={},b$=/^(?:toggle|show|hide)$/,b_=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,ca,cb=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];d.fn.extend({show:function(a,b,c){var e,f;if(a||a===0)return this.animate(cc("show",3),a,b,c);for(var g=0,h=this.length;g=0;a--)c[a].elem===this&&(b&&c[a](!0),c.splice(a,1))}),b||this.dequeue();return this}}),d.each({slideDown:cc("show",1),slideUp:cc("hide",1),slideToggle:cc("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){d.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),d.extend({speed:function(a,b,c){var e=a&&typeof a==="object"?d.extend({},a):{complete:c||!c&&b||d.isFunction(a)&&a,duration:a,easing:c&&b||b&&!d.isFunction(b)&&b};e.duration=d.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in d.fx.speeds?d.fx.speeds[e.duration]:d.fx.speeds._default,e.old=e.complete,e.complete=function(){e.queue!==!1&&d(this).dequeue(),d.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig||(b.orig={})}}),d.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(d.fx.step[this.prop]||d.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=d.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function g(a){return e.step(a)}var e=this,f=d.fx;this.startTime=d.now(),this.start=a,this.end=b,this.unit=c||this.unit||(d.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,g.elem=this.elem,g()&&d.timers.push(g)&&!ca&&(ca=setInterval(f.tick,f.interval))},show:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),d(this.elem).show()},hide:function(){this.options.orig[this.prop]=d.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=d.now(),c=!0;if(a||b>=this.options.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),this.options.curAnim[this.prop]=!0;for(var e in this.options.curAnim)this.options.curAnim[e]!==!0&&(c=!1);if(c){if(this.options.overflow!=null&&!d.support.shrinkWrapBlocks){var f=this.elem,g=this.options;d.each(["","X","Y"],function(a,b){f.style["overflow"+b]=g.overflow[a]})}this.options.hide&&d(this.elem).hide();if(this.options.hide||this.options.show)for(var h in this.options.curAnim)d.style(this.elem,h,this.options.orig[h]);this.options.complete.call(this.elem)}return!1}var i=b-this.startTime;this.state=i/this.options.duration;var j=this.options.specialEasing&&this.options.specialEasing[this.prop],k=this.options.easing||(d.easing.swing?"swing":"linear");this.pos=d.easing[j||k](this.state,i,0,1,this.options.duration),this.now=this.start+(this.end-this.start)*this.pos,this.update();return!0}},d.extend(d.fx,{tick:function(){var a=d.timers;for(var b=0;b
        ";d.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),e=b.firstChild,f=e.firstChild,h=e.nextSibling.firstChild.firstChild,this.doesNotAddBorder=f.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,f.style.position="fixed",f.style.top="20px",this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15,f.style.position=f.style.top="",e.style.overflow="hidden",e.style.position="relative",this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),a=b=e=f=g=h=null,d.offset.initialize=d.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;d.offset.initialize(),d.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(d.css(a,"marginTop"))||0,c+=parseFloat(d.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var e=d.css(a,"position");e==="static"&&(a.style.position="relative");var f=d(a),g=f.offset(),h=d.css(a,"top"),i=d.css(a,"left"),j=e==="absolute"&&d.inArray("auto",[h,i])>-1,k={},l={},m,n;j&&(l=f.position()),m=j?l.top:parseInt(h,10)||0,n=j?l.left:parseInt(i,10)||0,d.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):f.css(k)}},d.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),e=cf.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(d.css(a,"marginTop"))||0,c.left-=parseFloat(d.css(a,"marginLeft"))||0,e.top+=parseFloat(d.css(b[0],"borderTopWidth"))||0,e.left+=parseFloat(d.css(b[0],"borderLeftWidth"))||0;return{top:c.top-e.top,left:c.left-e.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&(!cf.test(a.nodeName)&&d.css(a,"position")==="static"))a=a.offsetParent;return a})}}),d.each(["Left","Top"],function(a,c){var e="scroll"+c;d.fn[e]=function(c){var f=this[0],g;if(!f)return null;if(c!==b)return this.each(function(){g=cg(this),g?g.scrollTo(a?d(g).scrollLeft():c,a?c:d(g).scrollTop()):this[e]=c});g=cg(f);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:d.support.boxModel&&g.document.documentElement[e]||g.document.body[e]:f[e]}}),d.each(["Height","Width"],function(a,c){var e=c.toLowerCase();d.fn["inner"+c]=function(){return this[0]?parseFloat(d.css(this[0],e,"padding")):null},d.fn["outer"+c]=function(a){return this[0]?parseFloat(d.css(this[0],e,a?"margin":"border")):null},d.fn[e]=function(a){var f=this[0];if(!f)return a==null?null:this;if(d.isFunction(a))return this.each(function(b){var c=d(this);c[e](a.call(this,b,c[e]()))});if(d.isWindow(f)){var g=f.document.documentElement["client"+c];return f.document.compatMode==="CSS1Compat"&&g||f.document.body["client"+c]||g}if(f.nodeType===9)return Math.max(f.documentElement["client"+c],f.body["scroll"+c],f.documentElement["scroll"+c],f.body["offset"+c],f.documentElement["offset"+c]);if(a===b){var h=d.css(f,e),i=parseFloat(h);return d.isNaN(i)?h:i}return this.css(e,typeof a==="string"?a:a+"px")}}),a.jQuery=a.$=d})(window); \ No newline at end of file diff --git a/public/javascripts/jquery-ui-1.8.11.custom/js/jquery-ui-1.8.11.custom.min.js b/public/javascripts/jquery-ui-1.8.11.custom/js/jquery-ui-1.8.11.custom.min.js new file mode 100644 index 00000000000..f8709e0ff12 --- /dev/null +++ b/public/javascripts/jquery-ui-1.8.11.custom/js/jquery-ui-1.8.11.custom.min.js @@ -0,0 +1,783 @@ +/*! + * jQuery UI 1.8.11 + * + * Copyright 2011, 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.11",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106, +NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}});c.fn.extend({_focus:c.fn.focus,focus:function(a,b){return typeof a==="number"?this.each(function(){var d=this;setTimeout(function(){c(d).focus();b&&b.call(d)},a)}):this._focus.apply(this,arguments)},scrollParent:function(){var a;a=c.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(c.curCSS(this, +"position",1))&&/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!a.length?c(document):a},zIndex:function(a){if(a!==j)return this.css("zIndex",a);if(this.length){a=c(this[0]);for(var b;a.length&&a[0]!==document;){b=a.css("position"); +if(b==="absolute"||b==="relative"||b==="fixed"){b=parseInt(a.css("zIndex"),10);if(!isNaN(b)&&b!==0)return b}a=a.parent()}}return 0},disableSelection:function(){return this.bind((c.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}});c.each(["Width","Height"],function(a,b){function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"padding"+this,true))||0;if(l)g-=parseFloat(c.curCSS(f, +"border"+this+"Width",true))||0;if(m)g-=parseFloat(c.curCSS(f,"margin"+this,true))||0});return g}var e=b==="Width"?["Left","Right"]:["Top","Bottom"],h=b.toLowerCase(),i={innerWidth:c.fn.innerWidth,innerHeight:c.fn.innerHeight,outerWidth:c.fn.outerWidth,outerHeight:c.fn.outerHeight};c.fn["inner"+b]=function(f){if(f===j)return i["inner"+b].call(this);return this.each(function(){c(this).css(h,d(this,f)+"px")})};c.fn["outer"+b]=function(f,g){if(typeof f!=="number")return i["outer"+b].call(this,f);return this.each(function(){c(this).css(h, +d(this,f,true,g)+"px")})}});c.extend(c.expr[":"],{data:function(a,b,d){return!!c.data(a,d[3])},focusable:function(a){var b=a.nodeName.toLowerCase(),d=c.attr(a,"tabindex");if("area"===b){b=a.parentNode;d=b.name;if(!a.href||!d||b.nodeName.toLowerCase()!=="map")return false;a=c("img[usemap=#"+d+"]")[0];return!!a&&k(a)}return(/input|select|textarea|button|object/.test(b)?!a.disabled:"a"==b?a.href||!isNaN(d):!isNaN(d))&&k(a)},tabbable:function(a){var b=c.attr(a,"tabindex");return(isNaN(b)||b>=0)&&c(a).is(":focusable")}}); +c(function(){var a=document.body,b=a.appendChild(b=document.createElement("div"));c.extend(b.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0});c.support.minHeight=b.offsetHeight===100;c.support.selectstart="onselectstart"in b;a.removeChild(b).style.display="none"});c.extend(c.ui,{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=9)&&!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){b(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate); +if(this._mouseStarted){this._mouseStarted=false;a.target==this._mouseDownEvent.target&&b.data(a.target,this.widgetName+".preventClickEvent",true);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.11 + * + * Copyright 2011, 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 n=/left|center|right/,o=/top|center|bottom/,t=c.fn.position,u=c.fn.offset;c.fn.position=function(b){if(!b||!b.of)return t.apply(this,arguments);b=c.extend({},b);var a=c(b.of),d=a[0],g=(b.collision||"flip").split(" "),e=b.offset?b.offset.split(" "):[0,0],h,k,j;if(d.nodeType===9){h=a.width();k=a.height();j={top:0,left:0}}else if(d.setTimeout){h=a.width();k=a.height();j={top:a.scrollTop(),left:a.scrollLeft()}}else if(d.preventDefault){b.at="left top";h=k=0;j={top:b.of.pageY, +left:b.of.pageX}}else{h=a.outerWidth();k=a.outerHeight();j=a.offset()}c.each(["my","at"],function(){var f=(b[this]||"").split(" ");if(f.length===1)f=n.test(f[0])?f.concat(["center"]):o.test(f[0])?["center"].concat(f):["center","center"];f[0]=n.test(f[0])?f[0]:"center";f[1]=o.test(f[1])?f[1]:"center";b[this]=f});if(g.length===1)g[1]=g[0];e[0]=parseInt(e[0],10)||0;if(e.length===1)e[1]=e[0];e[1]=parseInt(e[1],10)||0;if(b.at[0]==="right")j.left+=h;else if(b.at[0]==="center")j.left+=h/2;if(b.at[1]==="bottom")j.top+= +k;else if(b.at[1]==="center")j.top+=k/2;j.left+=e[0];j.top+=e[1];return this.each(function(){var f=c(this),l=f.outerWidth(),m=f.outerHeight(),p=parseInt(c.curCSS(this,"marginLeft",true))||0,q=parseInt(c.curCSS(this,"marginTop",true))||0,v=l+p+(parseInt(c.curCSS(this,"marginRight",true))||0),w=m+q+(parseInt(c.curCSS(this,"marginBottom",true))||0),i=c.extend({},j),r;if(b.my[0]==="right")i.left-=l;else if(b.my[0]==="center")i.left-=l/2;if(b.my[1]==="bottom")i.top-=m;else if(b.my[1]==="center")i.top-= +m/2;i.left=Math.round(i.left);i.top=Math.round(i.top);r={left:i.left-p,top:i.top-q};c.each(["left","top"],function(s,x){c.ui.position[g[s]]&&c.ui.position[g[s]][x](i,{targetWidth:h,targetHeight:k,elemWidth:l,elemHeight:m,collisionPosition:r,collisionWidth:v,collisionHeight:w,offset:e,my:b.my,at:b.at})});c.fn.bgiframe&&f.bgiframe();f.offset(c.extend(i,{using:b.using}))})};c.ui.position={fit:{left:function(b,a){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();b.left= +d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0];b.left+= +a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d=c(b), +g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); +;/* + * jQuery UI Draggable 1.8.11 + * + * Copyright 2011, 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)&&this.options.helper=="original")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,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),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=[(a.containment=="document"?0:d(window).scrollLeft())-this.offset.relative.left-this.offset.parent.left,(a.containment=="document"?0:d(window).scrollTop())-this.offset.relative.top-this.offset.parent.top,(a.containment=="document"?0:d(window).scrollLeft())+d(a.containment=="document"? +document:window).width()-this.helperProportions.width-this.margins.left,(a.containment=="document"?0:d(window).scrollTop())+(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),a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0),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-this.margins.right,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-this.margins.bottom]}}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=f?0:c.sizeDiff.width;f={width:c.helper.width()-f,height:c.helper.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.11"});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.11 + * + * Copyright 2011, 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"))||/inline|table-cell/.test(this.items[0].item.css("display")):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({target:null});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}}}if(this.placeholder){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.top< +this.containment[1]||g-this.offset.click.top>this.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 h=d.closest(".ui-accordion-header");a.active=h.length?h: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").toggleClass("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(f){return a._keydown(f)}).next().attr("role","tabpanel");a.headers.not(a.active||"").attr({"aria-expanded":"false","aria-selected":"false",tabIndex:-1}).next().hide();a.active.length?a.active.attr({"aria-expanded":"true","aria-selected":"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(f){a._clickHandler.call(a,f,this);f.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("aria-selected").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,h=this.headers.index(a.target),f=false;switch(a.keyCode){case b.RIGHT:case b.DOWN:f=this.headers[(h+1)%d];break;case b.LEFT:case b.UP:f=this.headers[(h-1+d)%d];break;case b.SPACE:case b.ENTER:this._clickHandler({target:a.target},a.target); +a.preventDefault()}if(f){c(a.target).attr("tabIndex",-1);c(f).attr("tabIndex",0);f.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)){var h=this.active;j=a.next();g=this.active.next();e={options:d,newHeader:b&&d.collapsible?c([]):a,oldHeader:this.active,newContent:b&&d.collapsible?c([]):j,oldContent:g};var f=this.headers.index(this.active[0])>this.headers.index(a[0]);this.active=b?c([]):a;this._toggle(j,g,e,b,f);h.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")}}}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 g=this.active.next(), +e={options:d,newHeader:c([]),oldHeader:d.active,newContent:c([]),oldContent:g},j=this.active=c([]);this._toggle(j,g,e)}},_toggle:function(a,b,d,h,f){var g=this,e=g.options;g.toShow=a;g.toHide=b;g.data=d;var j=function(){if(g)return g._completed.apply(g,arguments)};g._trigger("changestart",null,g.data);g.running=b.size()===0?a.size():b.size();if(e.animated){d={};d=e.collapsible&&h?{toShow:c([]),toHide:b,complete:j,down:f,autoHeight:e.autoHeight||e.fillSpace}:{toShow:a,toHide:b,complete:j,down:f,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;h=c.ui.accordion.animations;var i=e.duration,k=e.animated;if(k&&!h[k]&&!c.easing[k])k="slide";h[k]||(h[k]=function(l){this.slide(l,{easing:k,duration:i||700})});h[k](d)}else{if(e.collapsible&&h)a.toggle();else{b.hide();a.show()}j(true)}b.prev().attr({"aria-expanded":"false", +"aria-selected":"false",tabIndex:-1}).blur();a.prev().attr({"aria-expanded":"true","aria-selected":"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");if(this.toHide.length)this.toHide.parent()[0].className=this.toHide.parent()[0].className;this._trigger("change",null,this.data)}}});c.extend(c.ui.accordion,{version:"1.8.11", +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"),h=0,f={},g={},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){g[i]="hide";j=(""+c.css(a.toShow[0],i)).match(/^([\d+-.]+)(.*)$/); +f[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(g,{step:function(j,i){if(i.prop=="height")h=i.end-i.start===0?0:(i.now-i.start)/(i.end-i.start);a.toShow[0].style[i.prop]=h*f[i.prop].value+f[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.11 + * + * Copyright 2011, 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(d){var e=0;d.widget("ui.autocomplete",{options:{appendTo:"body",autoFocus:false,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null},pending:0,_create:function(){var a=this,b=this.element[0].ownerDocument,g;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||a.element.attr("readonly"))){g= +false;var f=d.ui.keyCode;switch(c.keyCode){case f.PAGE_UP:a._move("previousPage",c);break;case f.PAGE_DOWN:a._move("nextPage",c);break;case f.UP:a._move("previous",c);c.preventDefault();break;case f.DOWN:a._move("next",c);c.preventDefault();break;case f.ENTER:case f.NUMPAD_ENTER:if(a.menu.active){g=true;c.preventDefault()}case f.TAB:if(!a.menu.active)return;a.menu.select(c);break;case f.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("keypress.autocomplete",function(c){if(g){g=false;c.preventDefault()}}).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=d("
          ").addClass("ui-autocomplete").appendTo(d(this.options.appendTo||"body",b)[0]).mousedown(function(c){var f=a.menu.element[0];d(c.target).closest(".ui-menu-item").length||setTimeout(function(){d(document).one("mousedown",function(h){h.target!==a.element[0]&&h.target!==f&&!d.ui.contains(f,h.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,f){f=f.item.data("item.autocomplete");false!==a._trigger("focus",c,{item:f})&&/^key/.test(c.originalEvent.type)&& +a.element.val(f.value)},selected:function(c,f){var h=f.item.data("item.autocomplete"),i=a.previous;if(a.element[0]!==b.activeElement){a.element.focus();a.previous=i;setTimeout(function(){a.previous=i;a.selectedItem=h},1)}false!==a._trigger("select",c,{item:h})&&a.element.val(h.value);a.term=a.element.val();a.close(c);a.selectedItem=h},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"); +d.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();d.Widget.prototype.destroy.call(this)},_setOption:function(a,b){d.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(d(b||"body",this.element[0].ownerDocument)[0]);a==="disabled"&& +b&&this.xhr&&this.xhr.abort()},_initSource:function(){var a=this,b,g;if(d.isArray(this.options.source)){b=this.options.source;this.source=function(c,f){f(d.ui.autocomplete.filter(b,c.term))}}else if(typeof this.options.source==="string"){g=this.options.source;this.source=function(c,f){a.xhr&&a.xhr.abort();a.xhr=d.ajax({url:g,data:c,dataType:"json",autocompleteRequest:++e,success:function(h){this.autocompleteRequest===e&&f(h)},error:function(){this.autocompleteRequest===e&&f([])}})}}else this.source= +this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(d("").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}});d.extend(d.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, +"\\$&")},filter:function(a,b){var g=new RegExp(d.ui.autocomplete.escapeRegex(b),"i");return d.grep(a,function(c){return g.test(c.label||c.value||c)})}})})(jQuery); +(function(d){d.widget("ui.menu",{_create:function(){var e=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(a){if(d(a.target).closest(".ui-menu-item a").length){a.preventDefault();e.select(a)}});this.refresh()},refresh:function(){var e=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(a){e.activate(a,d(this).parent())}).mouseleave(function(){e.deactivate()})},activate:function(e,a){this.deactivate();if(this.hasScroll()){var b=a.offset().top-this.element.offset().top,g=this.element.attr("scrollTop"),c=this.element.height();if(b<0)this.element.attr("scrollTop",g+b);else b>=c&&this.element.attr("scrollTop",g+b-c+a.height())}this.active=a.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",e,{item:a})}, +deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(e){this.move("next",".ui-menu-item:first",e)},previous:function(e){this.move("prev",".ui-menu-item:last",e)},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(e,a,b){if(this.active){e=this.active[e+"All"](".ui-menu-item").eq(0); +e.length?this.activate(b,e):this.activate(b,this.element.children(a))}else this.activate(b,this.element.children(a))},nextPage:function(e){if(this.hasScroll())if(!this.active||this.last())this.activate(e,this.element.children(".ui-menu-item:first"));else{var a=this.active.offset().top,b=this.element.height(),g=this.element.children(".ui-menu-item").filter(function(){var c=d(this).offset().top-a-b+d(this).height();return c<10&&c>-10});g.length||(g=this.element.children(".ui-menu-item:last"));this.activate(e, +g)}else this.activate(e,this.element.children(".ui-menu-item").filter(!this.active||this.last()?":first":":last"))},previousPage:function(e){if(this.hasScroll())if(!this.active||this.first())this.activate(e,this.element.children(".ui-menu-item:last"));else{var a=this.active.offset().top,b=this.element.height();result=this.element.children(".ui-menu-item").filter(function(){var g=d(this).offset().top-a+b-d(this).height();return g<10&&g>-10});result.length||(result=this.element.children(".ui-menu-item:first")); +this.activate(e,result)}else this.activate(e,this.element.children(".ui-menu-item").filter(!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,f=d.primary&&d.secondary,e=[];if(d.primary||d.secondary){if(this.options.text)e.push("ui-button-text-icon"+(f?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("");d.secondary&&b.append("");if(!this.options.text){e.push(f?"ui-button-icons-only": +"ui-button-icon-only");this.hasTitle||b.attr("title",c)}}else e.push("ui-button-text-only");b.addClass(e.join(" "))}}});a.widget("ui.buttonset",{options:{items:":button, :submit, :reset, :checkbox, :radio, a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_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(this.options.items).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.11 + * + * Copyright 2011, 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){var k={buttons:true,height:true,maxHeight:true,maxWidth:true,minHeight:true,minWidth:true,width:true},l={maxHeight:true,maxWidth:true,minHeight:true,minWidth:true};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",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="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",e=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":e}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var f=(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(f);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id",e).html(d).prependTo(f);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose= +b.beforeclose;f.find("*").add(f).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,e;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]){e=c(this).css("z-index"); +isNaN(e)||(d=Math.max(d,e))}});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,e=d.options;if(e.modal&&!a||!e.stack&&!e.modal)return d._trigger("focus",b);if(e.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ=e.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;a._size();a._position(b.position);d.show(b.show);a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(e){if(e.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),f=g.filter(":first");g=g.filter(":last");if(e.target===g[0]&&!e.shiftKey){f.focus(1);return false}else if(e.target===f[0]&&e.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._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false,e=c("
          ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
          ").addClass("ui-dialog-buttonset").appendTo(e);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(f, +h){h=c.isFunction(h)?{click:h,text:f}:h;f=c('').attr(h,true).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&f.button()});e.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(f){return{position:f.position,offset:f.offset}}var b=this,d=b.options,e=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(f,h){g= +d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",f,a(h))},drag:function(f,h){b._trigger("drag",f,a(h))},stop:function(f,h){d.position=[h.position.left-e.scrollLeft(),h.position.top-e.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g);b._trigger("dragStop",f,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(f){return{originalPosition:f.originalPosition,originalSize:f.originalSize, +position:f.position,size:f.size}}a=a===j?this.options.resizable:a;var d=this,e=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:e.maxWidth,maxHeight:e.maxHeight,minWidth:e.minWidth,minHeight:d._minHeight(),handles:a,start:function(f,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",f,b(h))},resize:function(f,h){d._trigger("resize",f,b(h))},stop:function(f, +h){c(this).removeClass("ui-dialog-resizing");e.height=c(this).height();e.width=c(this).width();d._trigger("resizeStop",f,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],e;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,f){if(+b[g]===b[g]){d[g]=b[g];b[g]=f}});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;(e=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(c.extend({of:window},a));e||this.uiDialog.hide()},_setOptions:function(a){var b=this,d={},e=false;c.each(a,function(g,f){b._setOption(g,f);if(g in k)e=true;if(g in +l)d[g]=f});e&&this._size();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",d)},_setOption:function(a,b){var d=this,e=d.uiDialog;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":e.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?e.addClass("ui-dialog-disabled"):e.removeClass("ui-dialog-disabled"); +break;case "draggable":var g=e.is(":data(draggable)");g&&!b&&e.draggable("destroy");!g&&b&&d._makeDraggable();break;case "position":d._position(b);break;case "resizable":(g=e.is(":data(resizable)"))&&!b&&e.resizable("destroy");g&&typeof b==="string"&&e.resizable("option","handles",b);!g&&b!==false&&d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break}c.Widget.prototype._setOption.apply(d,arguments)},_size:function(){var a=this.options,b,d,e= +this.uiDialog.is(":visible");this.element.show().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();d=Math.max(0,a.minHeight-b);if(a.height==="auto")if(c.support.minHeight)this.element.css({minHeight:d,height:"auto"});else{this.uiDialog.show();a=this.element.css("height","auto").height();e||this.uiDialog.hide();this.element.height(Math.max(a,d))}else this.element.height(Math.max(a.height-b,0));this.uiDialog.is(":data(resizable)")&& +this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.11",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){if(c(d.target).zIndex()").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){var b=c.inArray(a,this.instances);b!=-1&&this.oldInstances.push(this.instances.splice(b,1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var d=0;c.each(this.instances,function(){d=Math.max(d,this.css("z-index"))});this.maxZ=d},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(!a.values)a.values=[this._valueMin(),this._valueMin()];if(a.values.length&&a.values.length!==2)a.values=[a.values[0],a.values[0]]}else this.range=d("
          ");this.range.appendTo(this.element).addClass("ui-slider-range");if(a.range==="min"||a.range==="max")this.range.addClass("ui-slider-range-"+a.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("").appendTo(this.element).addClass("ui-slider-handle"); +if(a.values&&a.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(){a.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(a.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(!b.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(!b._keySliding){b._keySliding=true;d(this).addClass("ui-state-active");h=b._start(c,f);if(h===false)return}break}i=b.options.step;h=b.options.values&&b.options.values.length?(g=b.values(f)):(g=b.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=b._valueMin();break;case d.ui.keyCode.END:g=b._valueMax();break;case d.ui.keyCode.PAGE_UP:g=b._trimAlignValue(h+(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=b._trimAlignValue(h-(b._valueMax()-b._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h=== +b._valueMax())return;g=b._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===b._valueMin())return;g=b._trimAlignValue(h-i);break}b._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(b._keySliding){b._keySliding=false;b._stop(c,e);b._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(b){var a=this.options,c,e,f,h,g;if(a.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:b.pageX,y:b.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(a.range===true&&this.values(1)===a.min){g+=1;f=d(this.handles[g])}if(this._start(b, +g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();a=f.offset();this._clickOffset=!d(b.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:b.pageX-a.left-f.width()/2,top:b.pageY-a.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this.handles.hasClass("ui-state-hover")||this._slide(b,g,c);return this._animateOff=true},_mouseStart:function(){return true}, +_mouseDrag:function(b){var a=this._normValueFromMouse({x:b.pageX,y:b.pageY});this._slide(b,this._handleIndex,a);return false},_mouseStop:function(b){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(b,this._handleIndex);this._change(b,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(b){var a; +if(this.orientation==="horizontal"){a=this.elementSize.width;b=b.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{a=this.elementSize.height;b=b.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}a=b/a;if(a>1)a=1;if(a<0)a=0;if(this.orientation==="vertical")a=1-a;b=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+a*b)},_start:function(b,a){var c={handle:this.handles[a],value:this.value()};if(this.options.values&&this.options.values.length){c.value= +this.values(a);c.values=this.values()}return this._trigger("start",b,c)},_slide:function(b,a,c){var e;if(this.options.values&&this.options.values.length){e=this.values(a?0:1);if(this.options.values.length===2&&this.options.range===true&&(a===0&&c>e||a===1&&c1){this.options.values[b]=this._trimAlignValue(a);this._refreshValue();this._change(null,b)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;f=this._valueMax())return this._valueMax();var a=this.options.step>0?this.options.step:1,c=(b-this._valueMin())%a;alignValue=b-c;if(Math.abs(c)*2>=a)alignValue+=c>0?a:-a;return parseFloat(alignValue.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max}, +_refreshValue:function(){var b=this.options.range,a=this.options,c=this,e=!this._animateOff?a.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,a.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},a.animate); +if(k===1)c.range[e?"animate":"css"]({width:f-g+"%"},{queue:false,duration:a.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},a.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:a.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,a.animate);if(b==="min"&&this.orientation==="horizontal")this.range.stop(1, +1)[e?"animate":"css"]({width:f+"%"},a.animate);if(b==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:a.animate});if(b==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},a.animate);if(b==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:a.animate})}}});d.extend(d.ui.slider,{version:"1.8.11"})})(jQuery); +;/* + * jQuery UI Tabs 1.8.11 + * + * Copyright 2011, 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(b,e){if(b=="selected")this.options.collapsible&& +e==this.options.selected||this.select(e);else{this.options[b]=e;this._tabify()}},_tabId:function(b){return b.title&&b.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(b){return b.replace(/:/g,"\\:")},_cookie:function(){var b=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[b].concat(d.makeArray(arguments)))},_ui:function(b,e){return{tab:b,panel:e,index:this.anchors.index(b)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var b= +d(this);b.html(b.data("label.tabs")).removeData("label.tabs")})},_tabify:function(b){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var a=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 i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| +(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))a.panels=a.panels.add(a.element.find(a._sanitizeSelector(i)));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=a._tabId(f);f.href="#"+i;f=a.element.find("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(a.panels[g-1]||a.list);f.data("destroy.tabs",true)}a.panels=a.panels.add(f)}else c.disabled.push(g)});if(b){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(a._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 a.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){a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash)).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");a.element.queue("tabs",function(){a._trigger("show",null,a._ui(a.anchors[c.selected],a.element.find(a._sanitizeSelector(a.anchors[c.selected].hash))[0]))});this.load(c.selected)}d(window).bind("unload",function(){a.lis.add(a.anchors).unbind(".tabs");a.lis=a.anchors=a.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);b=0;for(var j;j=this.lis[b];b++)d(j)[d.inArray(b,c.disabled)!=-1&&!d(j).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);a._trigger("show",null,a._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");a._trigger("show",null,a._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);a.element.dequeue("tabs")})}:function(g,f){a.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");a.element.dequeue("tabs")}; +this.anchors.bind(c.event+".tabs",function(){var g=this,f=d(g).closest("li"),i=a.panels.filter(":not(.ui-tabs-hide)"),l=a.element.find(a._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||a.panels.filter(":animated").length||a._trigger("select",null,a._ui(this,l[0]))===false){this.blur();return false}c.selected=a.anchors.index(this);a.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected= +-1;c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&a._cookie(c.selected,c.cookie);a.element.queue("tabs",function(){r(g,l)});a.load(a.anchors.index(this));this.blur();return false}c.cookie&&a._cookie(c.selected,c.cookie);if(l.length){i.length&&a.element.queue("tabs",function(){s(g,i)});a.element.queue("tabs",function(){r(g,l)});a.load(a.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(b){if(typeof b=="string")b=this.anchors.index(this.anchors.filter("[href$="+b+"]"));return b},destroy:function(){var b=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 a=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){a.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")});b.cookie&&this._cookie(null,b.cookie);return this},add:function(b, +e,a){if(a===p)a=this.anchors.length;var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,b).replace(/#\{label\}/g,e));b=!b.indexOf("#")?b.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=c.element.find("#"+b);j.length||(j=d(h.panelTemplate).attr("id",b).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(a>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[a]); +j.insertBefore(this.panels[a])}h.disabled=d.map(h.disabled,function(k){return k>=a?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.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[a],this.panels[a]));return this},remove:function(b){b=this._getIndex(b);var e=this.options,a=this.lis.eq(b).remove(),c=this.panels.eq(b).remove(); +if(a.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(b+(b+1=b?--h:h});this._tabify();this._trigger("remove",null,this._ui(a.find("a")[0],c[0]));return this},enable:function(b){b=this._getIndex(b);var e=this.options;if(d.inArray(b,e.disabled)!=-1){this.lis.eq(b).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(a){return a!=b});this._trigger("enable",null, +this._ui(this.anchors[b],this.panels[b]));return this}},disable:function(b){b=this._getIndex(b);var e=this.options;if(b!=e.selected){this.lis.eq(b).addClass("ui-state-disabled");e.disabled.push(b);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[b],this.panels[b]))}return this},select:function(b){b=this._getIndex(b);if(b==-1)if(this.options.collapsible&&this.options.selected!=-1)b=this.options.selected;else return this;this.anchors.eq(b).trigger(this.options.event+".tabs");return this}, +load:function(b){b=this._getIndex(b);var e=this,a=this.options,c=this.anchors.eq(b)[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(b).addClass("ui-state-processing");if(a.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(a.spinner)}this.xhr=d.ajax(d.extend({},a.ajaxOptions,{url:h,success:function(k,n){e.element.find(e._sanitizeSelector(c.hash)).html(k);e._cleanup();a.cache&&d.data(c, +"cache.tabs",true);e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[b],e.panels[b]));try{a.ajaxOptions.error(k,n,b,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(b,e){this.anchors.eq(b).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.11"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(b,e){var a=this,c=this.options,h=a._rotate||(a._rotate=function(j){clearTimeout(a.rotation);a.rotation=setTimeout(function(){var k=c.selected;a.select(++k')}function F(a,b){d.extend(a,b);for(var c in b)if(b[c]== +null||b[c]==A)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.11"}});var y=(new Date).getTime();d.extend(K.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){F(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);b.dpDiv.show()}},_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)}F(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");F(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.empty();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=b.dpDiv.find("iframe.ui-datepicker-cover");if(i.length){var g=d.datepicker._getBorders(b.dpDiv);i.css({left:-g[0],top:-g[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));var e=a.dpDiv.find("iframe.ui-datepicker-cover");e.length&&e.css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()});a.dpDiv.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);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[0]!=document.activeElement&&a.input.focus();if(a.yearshtml){var f=a.yearshtml;setTimeout(function(){f===a.yearshtml&&a.dpDiv.find("select.ui-datepicker-year:first").replaceWith(a.yearshtml);f=a.yearshtml=null},0)}},_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(),j=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>j&&j>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||d.expr.filters.hidden(a));)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;var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff;e=typeof e!="string"?e:(new Date).getFullYear()%100+parseInt(e,10);for(var 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,j=c=-1,l=-1,u=-1,k=false,o=function(p){(p=z+1-1){j=1;l=u;do{e=this._getDaysInMonth(c,j-1);if(l<=e)break;j++;l-=e}while(1)}w=this._daylightSavingAdjust(new Date(c,j-1,l));if(w.getFullYear()!=c||w.getMonth()+1!=j||w.getDate()!=l)throw"Invalid date";return w},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=k+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"),j=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)),k=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=k&&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-j,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+j,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";j=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;j=!h?j:this.formatDate(j,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;j=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z= +this._get(a,"monthNames"),w=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),v=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var L=this._getDefaultDate(a),I="",D=0;D1)switch(E){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)&&D==0?c?f:n:"")+(/all|right/.test(t)&&D==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,k,o,D>0||E>0,z,w)+'
          ';var B=j?'":"";for(t=0;t<7;t++){var q= +(t+h)%7;B+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}x+=B+"";B=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay,B);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;B=l?6:Math.ceil((t+B)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O";var P=!j?"":'";for(t=0;t<7;t++){var G= +p?p.apply(a.input?a.input[0]:null,[q]):[true,""],C=q.getMonth()!=g,J=C&&!H||!G[0]||k&&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)+""+(C&&!v?" ":J?''+q.getDate()+"":''+q.getDate()+"")+"
          "+(l?""+(i[0]>0&&E==i[1]-1?'
          ':""):"");M+=x}I+=M}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 j=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),k='
          ', +o="";if(h||!j)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(k+=o+(h||!(j&& +l)?" ":""));a.yearshtml="";if(h||!l)k+=''+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(a.yearshtml+='";if(d.browser.mozilla)k+='";else{k+=a.yearshtml;a.yearshtml=null}}k+=this._get(a,"yearSuffix");if(u)k+=(h||!(j&&l)?" ":"")+o;k+="
          ";return k},_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-this._daylightSavingAdjust(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(!this.length)return this;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 K;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.11";window["DP_jQuery_"+y]=d})(jQuery); +;/* + * jQuery UI Progressbar 1.8.11 + * + * Copyright 2011, 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,d){b.widget("ui.progressbar",{options:{value:0,max:100},min:0,_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.options.max,"aria-valuenow":this._value()});this.valueDiv=b("
          ").appendTo(this.element);this.oldValue=this._value();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===d)return this._value();this._setOption("value",a);return this},_setOption:function(a,c){if(a==="value"){this.options.value=c;this._refreshValue();this._value()===this.options.max&&this._trigger("complete")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.options.max,Math.max(this.min,a))},_percentage:function(){return 100* +this._value()/this.options.max},_refreshValue:function(){var a=this.value(),c=this._percentage();if(this.oldValue!==a){this.oldValue=a;this._trigger("change")}this.valueDiv.toggleClass("ui-corner-right",a===this.options.max).width(c.toFixed(0)+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.11"})})(jQuery); +;/* + * jQuery UI Effects 1.8.11 + * + * Copyright 2011, 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 n(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 o.transparent;return o[f.trim(c).toLowerCase()]}function s(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 n(b)}function p(){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 q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a in t||/scrollbar/.test(a)||!/color/i.test(a)&&isNaN(parseFloat(b)))delete c[a]}return c}function u(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:b in f.fx.speeds?f.fx.speeds[b]:f.fx.speeds._default;d=d||a.complete;return[c,a,b,d]}function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(typeof c==="string"&&!f.effects[c])return true;return false}f.effects={};f.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor", +"borderTopColor","borderColor","color","outlineColor"],function(c,a){f.fx.step[a]=function(b){if(!b.colorInit){b.start=s(b.elem,a);b.end=n(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 o={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]},r=["add","remove","toggle"],t={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.queue("fx",function(){var e=f(this),g=e.attr("style")||" ",h=q(p.call(this)),l,v=e.attr("className");f.each(r,function(w,i){c[i]&&e[i+"Class"](c[i])});l=q(p.call(this));e.attr("className",v);e.animate(u(h,l),a,b,function(){f.each(r,function(w,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)});h=f.queue(this);l=h.splice(h.length-1,1)[0]; +h.splice(1,0,l);f.dequeue(this)})};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.11",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,right:"auto",bottom:"auto"})}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),b={options:a[1],duration:a[2],callback:a[3]};a=b.options.mode;var d=f.effects[c];if(f.fx.off||!d)return a?this[a](b.duration,b.callback):this.each(function(){b.callback&&b.callback.call(this)});return d.call(this,b)},_show:f.fn.show,show:function(c){if(m(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(m(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(m(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 Fade 1.8.11 + * + * Copyright 2011, 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/Fade + * + * Depends: + * jquery.effects.core.js + */ +(function(b){b.effects.fade=function(a){return this.queue(function(){var c=b(this),d=b.effects.setMode(c,a.options.mode||"hide");c.animate({opacity:d},{queue:false,duration:a.duration,easing:a.options.easing,complete:function(){a.callback&&a.callback.apply(this,arguments);c.dequeue()}})})}})(jQuery); +;/* + * jQuery UI Effects Fold 1.8.11 + * + * Copyright 2011, 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","bottom","left","right"],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.11 + * + * Copyright 2011, 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.11 + * + * Copyright 2011, 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/public/javascripts/jquery-ujs/rails.js b/public/javascripts/jquery-ujs/rails.js new file mode 100644 index 00000000000..b8cb6f15e17 --- /dev/null +++ b/public/javascripts/jquery-ujs/rails.js @@ -0,0 +1,291 @@ +/** + * Unobtrusive scripting adapter for jQuery + * + * Requires jQuery 1.4.3 or later. + * https://github.com/rails/jquery-ujs + + * Uploading file using rails.js + * ============================= + * + * By default, browsers do not allow files to be uploaded via AJAX. As a result, if there are any non-blank file fields + * in the remote form, this adapter aborts the AJAX submission and allows the form to submit through standard means. + * + * The `ajax:aborted:file` event allows you to bind your own handler to process the form submission however you wish. + * + * Ex: + * $('form').live('ajax:aborted:file', function(event, elements){ + * // Implement own remote file-transfer handler here for non-blank file inputs passed in `elements`. + * // Returning false in this handler tells rails.js to disallow standard form submission + * return false; + * }); + * + * The `ajax:aborted:file` event is fired when a file-type input is detected with a non-blank value. + * + * Third-party tools can use this hook to detect when an AJAX file upload is attempted, and then use + * techniques like the iframe method to upload the file instead. + * + * Required fields in rails.js + * =========================== + * + * If any blank required inputs (required="required") are detected in the remote form, the whole form submission + * is canceled. Note that this is unlike file inputs, which still allow standard (non-AJAX) form submission. + * + * The `ajax:aborted:required` event allows you to bind your own handler to inform the user of blank required inputs. + * + * !! Note that Opera does not fire the form's submit event if there are blank required inputs, so this event may never + * get fired in Opera. This event is what causes other browsers to exhibit the same submit-aborting behavior. + * + * Ex: + * $('form').live('ajax:aborted:required', function(event, elements){ + * // Returning false in this handler tells rails.js to submit the form anyway. + * // The blank required inputs are passed to this function in `elements`. + * return ! confirm("Would you like to submit the form with missing info?"); + * }); + */ + +(function($) { + + // Shorthand to make it a little easier to call public rails functions from within rails.js + var rails; + + $.rails = rails = { + + // Link elements bound by jquery-ujs + linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]', + + // Form elements bound by jquery-ujs + formSubmitSelector: 'form', + + // Form input elements bound by jquery-ujs + formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type])', + + // Form input elements disabled during form submission + disableSelector: 'input[data-disable-with], button[data-disable-with], textarea[data-disable-with]', + + // Form input elements re-enabled after form submission + enableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled', + + // Form required input elements + requiredInputSelector: 'input[name][required],textarea[name][required]', + + // Form file input elements + fileInputSelector: 'input:file', + + // Make sure that every Ajax request sends the CSRF token + CSRFProtection: function(xhr) { + var token = $('meta[name="csrf-token"]').attr('content'); + if (token) xhr.setRequestHeader('X-CSRF-Token', token); + }, + + // Triggers an event on an element and returns false if the event result is false + fire: function(obj, name, data) { + var event = $.Event(name); + obj.trigger(event, data); + return event.result !== false; + }, + + // Submits "remote" forms and links with ajax + handleRemote: function(element) { + var method, url, data, + dataType = element.data('type') || ($.ajaxSettings && $.ajaxSettings.dataType); + + if (rails.fire(element, 'ajax:before')) { + + if (element.is('form')) { + method = element.attr('method'); + url = element.attr('action'); + data = element.serializeArray(); + // memoized value from clicked submit button + var button = element.data('ujs:submit-button'); + if (button) { + data.push(button); + element.data('ujs:submit-button', null); + } + } else { + method = element.data('method'); + url = element.attr('href'); + data = null; + } + + $.ajax({ + url: url, type: method || 'GET', data: data, dataType: dataType, + // stopping the "ajax:beforeSend" event will cancel the ajax request + beforeSend: function(xhr, settings) { + if (settings.dataType === undefined) { + xhr.setRequestHeader('accept', '*/*;q=0.5, ' + settings.accepts.script); + } + return rails.fire(element, 'ajax:beforeSend', [xhr, settings]); + }, + success: function(data, status, xhr) { + element.trigger('ajax:success', [data, status, xhr]); + }, + complete: function(xhr, status) { + element.trigger('ajax:complete', [xhr, status]); + }, + error: function(xhr, status, error) { + element.trigger('ajax:error', [xhr, status, error]); + } + }); + } + }, + + // Handles "data-method" on links such as: + // Delete + handleMethod: function(link) { + var href = link.attr('href'), + method = link.data('method'), + csrf_token = $('meta[name=csrf-token]').attr('content'), + csrf_param = $('meta[name=csrf-param]').attr('content'), + form = $('
          '), + metadata_input = ''; + + if (csrf_param !== undefined && csrf_token !== undefined) { + metadata_input += ''; + } + + form.hide().append(metadata_input).appendTo('body'); + form.submit(); + }, + + /* Disables form elements: + - Caches element value in 'ujs:enable-with' data store + - Replaces element text with value of 'data-disable-with' attribute + - Adds disabled=disabled attribute + */ + disableFormElements: function(form) { + form.find(rails.disableSelector).each(function() { + var element = $(this), method = element.is('button') ? 'html' : 'val'; + element.data('ujs:enable-with', element[method]()); + element[method](element.data('disable-with')); + element.attr('disabled', 'disabled'); + }); + }, + + /* Re-enables disabled form elements: + - Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`) + - Removes disabled attribute + */ + enableFormElements: function(form) { + form.find(rails.enableSelector).each(function() { + var element = $(this), method = element.is('button') ? 'html' : 'val'; + if (element.data('ujs:enable-with')) element[method](element.data('ujs:enable-with')); + element.removeAttr('disabled'); + }); + }, + + // If message provided in 'data-confirm' attribute, fires `confirm` event and returns result of confirm dialog. + // Attaching a handler to the element's `confirm` event that returns false cancels the confirm dialog. + allowAction: function(element) { + var message = element.data('confirm'); + return !message || (rails.fire(element, 'confirm') && confirm(message)); + }, + + // Helper function which checks for blank inputs in a form that match the specified CSS selector + blankInputs: function(form, specifiedSelector, nonBlank) { + var inputs = $(), input, + selector = specifiedSelector || 'input,textarea'; + form.find(selector).each(function() { + input = $(this); + // Collect non-blank inputs if nonBlank option is true, otherwise, collect blank inputs + if (nonBlank ? input.val() : !input.val()) { + inputs = inputs.add(input); + } + }); + return inputs.length ? inputs : false; + }, + + // Helper function which checks for non-blank inputs in a form that match the specified CSS selector + nonBlankInputs: function(form, specifiedSelector) { + return rails.blankInputs(form, specifiedSelector, true); // true specifies nonBlank + }, + + // Helper function, needed to provide consistent behavior in IE + stopEverything: function(e) { + e.stopImmediatePropagation(); + return false; + }, + + // find all the submit events directly bound to the form and + // manually invoke them. If anyone returns false then stop the loop + callFormSubmitBindings: function(form) { + var events = form.data('events'), continuePropagation = true; + if (events !== undefined && events['submit'] !== undefined) { + $.each(events['submit'], function(i, obj){ + if (typeof obj.handler === 'function') return continuePropagation = obj.handler(obj.data); + }); + } + return continuePropagation; + } + }; + + // ajaxPrefilter is a jQuery 1.5 feature + if ('ajaxPrefilter' in $) { + $.ajaxPrefilter(function(options, originalOptions, xhr){ rails.CSRFProtection(xhr); }); + } else { + $(document).ajaxSend(function(e, xhr){ rails.CSRFProtection(xhr); }); + } + + $(rails.linkClickSelector).live('click.rails', function(e) { + var link = $(this); + if (!rails.allowAction(link)) return rails.stopEverything(e); + + if (link.data('remote') !== undefined) { + rails.handleRemote(link); + return false; + } else if (link.data('method')) { + rails.handleMethod(link); + return false; + } + }); + + $(rails.formSubmitSelector).live('submit.rails', function(e) { + var form = $(this), + remote = form.data('remote') !== undefined, + blankRequiredInputs = rails.blankInputs(form, rails.requiredInputSelector), + nonBlankFileInputs = rails.nonBlankInputs(form, rails.fileInputSelector); + + if (!rails.allowAction(form)) return rails.stopEverything(e); + + // skip other logic when required values are missing or file upload is present + if (blankRequiredInputs && rails.fire(form, 'ajax:aborted:required', [blankRequiredInputs])) { + return !remote; + } + + if (remote) { + if (nonBlankFileInputs) { + return rails.fire(form, 'ajax:aborted:file', [nonBlankFileInputs]); + } + + // If browser does not support submit bubbling, then this live-binding will be called before direct + // bindings. Therefore, we should directly call any direct bindings before remotely submitting form. + if (!$.support.submitBubbles && rails.callFormSubmitBindings(form) === false) return rails.stopEverything(e); + + rails.handleRemote(form); + return false; + } else { + // slight timeout so that the submit button gets properly serialized + setTimeout(function(){ rails.disableFormElements(form); }, 13); + } + }); + + $(rails.formInputClickSelector).live('click.rails', function(event) { + var button = $(this); + + if (!rails.allowAction(button)) return rails.stopEverything(event); + + // register the pressed submit button + var name = button.attr('name'), + data = name ? {name:name, value:button.val()} : null; + + button.closest('form').data('ujs:submit-button', data); + }); + + $(rails.formSubmitSelector).live('ajax:beforeSend.rails', function(event) { + if (this == event.target) rails.disableFormElements($(this)); + }); + + $(rails.formSubmitSelector).live('ajax:complete.rails', function(event) { + if (this == event.target) rails.enableFormElements($(this)); + }); + +})( jQuery ); diff --git a/public/javascripts/jquery.ajaxfileupload.js b/public/javascripts/jquery.ajaxfileupload.js new file mode 100644 index 00000000000..ff4d3e933ad --- /dev/null +++ b/public/javascripts/jquery.ajaxfileupload.js @@ -0,0 +1,205 @@ +jQuery.extend({ + + createUploadIframe: function(id, uri) + { + //create frame + var frameId = 'jUploadFrame' + id; + + if(window.ActiveXObject) { + var io = document.createElement('

          b2w52#Ho2ylK?(#Rsj7k`G?ocPh@dR& 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 b1JQgtf6M>azotV4sE@(Z)z4*}Q$iB}eRV|T literal 0 HcmV?d00001 diff --git a/public/images/center-background.png b/public/images/center-background.png new file mode 100644 index 0000000000000000000000000000000000000000..a507e9b8e696d1e6e9c726fc98f018d57c0c3d20 GIT binary patch literal 2121 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 literal 0 HcmV?d00001 diff --git a/public/images/icons/close.png b/public/images/icons/close.png new file mode 100644 index 0000000000000000000000000000000000000000..1120dc5a66454bd31d4adc56078ad68dd2ebe3cb GIT binary patch literal 422 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4#g<1Xt!J<>zE3D|ja7=P86_q~@mfEzw*JRQkiy#WBR9_v|D?@52cKZS#L$ zYB{H;v_#{ggJ4%Sdpq0zhF|vG{}@(xJF|;#cbd3(cTbm} z->ZMWbLPcmF{@wJGrqXediXCh^SirRd*;}mk7uabd(ThfU_{Hs;C&O;GCW|kxVmD- zlIoW;i`R>>KIA>bc`SJ`bGVqeRLQ#oY*M1as!TZyPoz#%{@t7N>zGO3V}B0!sZ&-@ zp7_1)WA4K?j)?8MneOfP$lv-eo!xWN8?Tky4;UJ(eqv`3tUmL5-Oj6x+Fz<{*Z3Kg zP6}O67jP>ynMJrQ$>;j*J>R`cCv_T{Cf<;Exc%$*<#(h$F#7Vx{P(;qkq!(422WQ% Jmvv4FO#oNLtbzal literal 0 HcmV?d00001 diff --git a/public/images/icons/edit-hover.png b/public/images/icons/edit-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..d0eb58f145a682333d3e3e12b3da68c60318cefc GIT binary patch literal 531 zcmV+u0_^>XP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipW2 z4jK?)vG=C{00EOpL_t(I%gvHKXcJ)=$A8az=UrM_GKiyCkyHhVV3X7@B%6~6f(S0s zLELoFT@f8boYcWVaBz^|;L<$^*1Jof$>x@&xE8A>y?FO`=!aGDaMSR69of?+r@Kp2b|??U=M)I9)1~T z)Al!O9%?jp2RZM6SzuAvqM^sYs$YQ6?swwmOtV=EJ`dl3W(7&0?Bdw@HxK|_SAZ}C zY#r~>7~M(Vy8;`pU10aK)-DZ+{SNY@1)-7c@*TUuJ#%JZxB#!JNI9SHCHNqhqE z00>GeNM&H;na(foC(I@^(eFuj8 Vl*T;7e7pbv002ovPDHLkV1j5N=cWJv literal 0 HcmV?d00001 diff --git a/public/images/icons/edit.png b/public/images/icons/edit.png new file mode 100644 index 0000000000000000000000000000000000000000..ac37b63e5c3b3b0a6c4f7df7e751248fb72900d8 GIT binary patch literal 528 zcmV+r0`L8aP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipS? z0}nSQOAG%100EFmL_t(I%gvI%iW6ZJ#eXL=!?|i5Cm~qQuqco!6GRZ4a}0{n`@IuP!sI*HuoOxy_|F4 zz`rgz=UxKaEB3uKO&dQ!uXo≥YU}=|vpJ&qFiYkhF@RSPY#`=a~1t2OI@3v&ThI z9M<2+Y`5D-DwWDdU<=rhv}0yZf&Fleg z#wz({CNp~loB_Ug?=K`tat^o;81Q7R1?Su&;0~}K1i@+VeF^LWH8Z=HW!YUh=iULA zmj3#q(dcBoUcUi6116Hrhhg}6GMVg3+LZLR(P&(eWECL(g?QR(wLI`(j;{}g!w<9B z?2V*NpdZKaHAx1bHS)g$$#gnRq9}R@+yuUw*@-O628+AUIrkd4y7c=gP193A01!pd z0H^^6Wm#U#^L(&O^d}1kiVt;xu3IL~yZAaPT^hlEJOnl-(;HgCEvH+-HZ!VwH4UB1lAS}2~!yK{F6~@b_gr57PS`Py@NS^f7#KWV L{an^LB{Ts5{8UT# literal 0 HcmV?d00001 diff --git a/public/images/icons/expander-collapsed.png b/public/images/icons/expander-collapsed.png new file mode 100644 index 0000000000000000000000000000000000000000..9032e44f42d0150d462285ab837122df9e913b7c GIT binary patch literal 239 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4Kdtex!0`Kl>JQ c;`cdz^N(T2UItgH1MOw-boFyt=akR{05vyH{{R30 literal 0 HcmV?d00001 diff --git a/public/images/icons/expander-expanded.png b/public/images/icons/expander-expanded.png new file mode 100644 index 0000000000000000000000000000000000000000..c75af486f5894a8862e1bdf8521f9ade03bb4355 GIT binary patch literal 240 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4zT;F^e`dm{eM;8)h;cwE{1-!Z(v*S z_804wfE(woEHZRM`x$7K2W cuX-4>dQOFvaK70A3!udep00i_>zopr0I)JpQ~&?~ literal 0 HcmV?d00001 diff --git a/public/images/icons/favorite.png b/public/images/icons/favorite.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9123c3b5c3b875e9c045890d77df6295702b1a GIT binary patch literal 469 zcmV;`0V@89P)UQ52m`0mhi2wYK7%yII0~ZLO^sV}`KM#CpA+Di({cz`Do(sI}e& zrlz?u77B&6AIt!o-ELRS9?SuhQu$vhSc&6!&kF!%C-LB%I|Zst#`c-yzzYzO9PlC{ z=TQ{p%jNQ&*7|lZ80?Ek4R{}q$GJJrPrq?78jXemFvi6H0(=)AHi&l_v3Ih600000 LNkvXXu0mjfz-7an literal 0 HcmV?d00001 diff --git a/public/images/icons/grabber.png b/public/images/icons/grabber.png new file mode 100644 index 0000000000000000000000000000000000000000..d361f06a4dcccd080ce8d1ace76185dcaca31b48 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^Y(T8Q!3<(O{}~9R7>k44ofy`glX(f`Bn0?`xc+8l z{{R1fNND8GU%&qT{aaL25)~Em<;$0suU@-(c*n;ltX;pMrlvM2DLEh@xV*gL-rf7# zcI=!vYtG@rM*{*w&z(EJe8oyDE8F+)-(SCR>-V2Ow{G9vx_$SJ>o<1oJ+N`ZCZW&M zZ-Fc>3GxeOaCmkj4a7G3?EA_a zn`*lYQd49Kk5)=*T1Q{_^IFjU=#qdEF4I-vUOS)s36`yN>nqSt_|E#hl`m+IgIqGu Oa0X9TKbLh*2~7Z(J%xe* literal 0 HcmV?d00001 diff --git a/public/images/icons/icon_menu_arrow.gif b/public/images/icons/icon_menu_arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..daae9747671d34c5f46307e184e7f9352975544a GIT binary patch literal 56 zcmZ?wbhEHb6k=dwXkcV8G&KDG|G(l-7DjdkMg|=QAOOiQF!A^BuB@s(J*Q<;TSof5 Itqcs-0DzqjM*si- literal 0 HcmV?d00001 diff --git a/public/images/icons/icon_search.png b/public/images/icons/icon_search.png new file mode 100644 index 0000000000000000000000000000000000000000..19d2c5c9492dbcc08775d0e05c971c76d00e44d9 GIT binary patch literal 449 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf2?p zUk71ECym(^Ktah8*NBqf{Irtt#G+J&^73-M%)IR4ShVWT@>?GdN8R?G^hD63k#Pfa*uCG8^Pa!= zWeT#?=u#4%n7-h)!S{u$$|I+VmM#j7T{q1&MN#SH!-5?`6GL3Y80)uP`zEE#aywQq zQX=_NM?CY+;&ZEBS)8$zvE-P^xXjm5*=DWq)B_9)bWZzTE^FcU<9x$lHTRtFWQUgb zew=HZ=9_T3{8;6;g>ldK%_^SnLQCJw*?eFNQ1K3%z^fn6&!}I;{pYKEO>1(rprmB- zx33&2kzp0@*Ed>z;Hqh}`+n~}Q*^?LRo>5I{+~Fwv*_H{&{9sGWc9Vh-Jw9$N=99C o_WbE8Sa>2T^uAtK!K!_Xk1Bfne*QG@0R}gNr>mdKI;Vst0B5bZApigX literal 0 HcmV?d00001 diff --git a/public/images/icons/info-hover.png b/public/images/icons/info-hover.png new file mode 100644 index 0000000000000000000000000000000000000000..69f56ae2bca7f5c427c5f107d716c76c24a46667 GIT binary patch literal 357 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 Hu0mjfuRO<( literal 0 HcmV?d00001 diff --git a/public/images/icons/right-arrow.png b/public/images/icons/right-arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..994fb63863b9f90eaa58782207c9bcae45b75bd0 GIT binary patch literal 3159 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 BJDmUk literal 0 HcmV?d00001 diff --git a/public/images/nav_pipe.png b/public/images/nav_pipe.png new file mode 100644 index 0000000000000000000000000000000000000000..ebb211bc211252d4507a1bcc93810dbe3f0d55df GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^j6f{L!2~4xmL&cKQj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS>JibOnJ978H@CH1VHdH%?O0}i=70tpOlzKlyl79|=1DSr z1<%~X^wgl##FWaylc_d9MUI{>jv*DdVtg7o85}t_)%};fwSjY$eKWJA;}xO(9S6=- zr0tqnS-yS}!?gFkwV`k0KDlT3+XjZt-szue7rmc>nPKfu?K{RFwxDSr z1<%~X^wgl##FWaylc_d9Me?35jv*DdlHxWbFdqK@|Nl%035kwFOIE0gI-h0ZFkoPp W;#REQl(qnaT+^qm#z$3ZS55iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$Qb0xio-U3d z5>w}1G~{bA;9)tay69{CdY{=^@4s^UurdkWY|_>}Yj#hmX@BHlK#?ubk2~sy0@6<9VADnUXwJv+4j-0&nUi&jZqZvG1{an^LB{Ts5Z4yBk literal 0 HcmV?d00001 diff --git a/public/images/order-desc.png b/public/images/order-desc.png new file mode 100644 index 0000000000000000000000000000000000000000..eb75d53c94f783dc73e74c21b4193038e5b884dd GIT binary patch literal 211 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 KMNUMnLSTYdqD}Y! literal 0 HcmV?d00001 diff --git a/public/images/spinner.gif b/public/images/spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a2da81c22d6d63098512302dd295b9ad0d80269 GIT binary patch literal 3532 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 CUqv4P literal 0 HcmV?d00001 diff --git a/public/images/ui.totop.png b/public/images/ui.totop.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8808446826ee74d207b6ffe80a8c8f358ef9ce GIT binary patch literal 1734 zcmV;%208hOP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01EH`01EH{Laa2H00007bV*G`2ipT3 z6E{0Zxcrp{@%=+UGLfnwxxzpBvMcbAR%r!Ac0a;l0#Kh ztrUr>;sS~|Aa48vTsc>869q*ana6*VDBqIk2mcV|64khM0( zF<#r0O6^FN*SoXxzV~zHeI_)F>FMcH<#PEmA;jlI^Z|M>j4=zfTJ5IeIJZYfNAD${ z5db`X{1`zH3=q-W%F0UCwr%8cIarou;yK;O4}yR^&qELdC>D#GQ4}4>WHQSmBO_n{ zs8lNNS(Y_lDwUkU!9g%Hj4|keZ~&l8CIiQDptVM+RC2S~?0gu8`vEL70Oa%e`L(q* zr&ui31rpJ=?=H+=zm`%WpU;!$c}}5Fm;;cbr%#`LRIOI;M^OYRB^m*A10oil1OWhA zYcMmEQm0r-`DqkIuq+G4nAe2uB)r-EMnTEnNia$&1VI4Xwm)Yn{mQq3pL1_gy3P>#6RQqO2 z3n9QQCbSgP?mMl35YekT&}zgQbs7sXn4}Am&zXqcs7*I%*eno}_c?83H)_=iXk#rg z#%!}F5kYjSl@J0-DKK;0Rk3zylo6c>FBXfqapMLK9Xf>5r%&U_lP7Rp7qL5Afp`tn z^XJcv@B3{DS4v@RZ4GD6oWb1O+$$e4Lu-x8moMYOg$wn$?Zl4jy6sy)N{Q*|X`DQH z5_5BN$Ye6OckdpqT)6@OxOVLtjvqgcLZOh#5+Y4%EiEmfQmJ5KVgfTWGZ-2g!nt$j zaR2^&96WdstE;Q^m}qyTnjJ+EZr;3!qeqWIYYk%zJkP`4y?Ze=HHE8JuR?2`u4c3w z0{~##Hlip(tybH%yT!hC90$JdH_i8*Vt~_RK&4V?n)|g{4FC`;(yUH&?Sf=Q+v(KQ z$#%}&)cH=g?2Zf3+ZZtb^A2Pi01!kpLqwFOeD4P>Phq?A(x0L#nE-p0m;8-^jhZ6I5ln(6QF_Xh?Ba$;*oJJ8?X?<=KD zT)}!76UjAW;mmxX-utbuuLHm!fZsjO%T_9txYqZiIVB=uW@IuMW0vK$x#+xkDcnsV6{Z|x4-!k*m{{8!Z*|8FyJ$sg3zI=&lwJM2d zornf|({TFZT!HqXU`CZ;rqsz+11rmS1CogTn&^y2FbrUk&!0b!zP`TSHa0fgd_GTUy5q)Y%|IpZF*A1U+C{$ayM29qvtwgpIa*j) zIHk4zC5ob?=5LK3FvdV@9XF>RGc$h?h9TLuor)hw%Z?<$SeAt#2*|eW36@fh3nAVp zI4zK7ZCTQF%nW9pU@7Hryce`O(R9NPG`m(x87bue6A?A`^lytFXmByr+w*tD4+tUt z=Lb6D2RgAt&-j6)cC}iq-juXcnwu%Zod{P-;lYCkc=YHIve_)g#>Ox-Gz6`6YKzgz z%8Chspe>Ds5Ga*OxOM9mmX?<4MWtG;VsvyABO@bqrlcJpmSwdM000&i7I6FaZD_5L z$z(7wF@eR!Mclo67q08VwryOxbP3gJwQT^YdPC3iP^naK?AS4kkB>u2i9LJvVBfxd zxO3+YUc7jLH)U1FE&za;nHdy|MeN?ayJ>noeE1M2PMkmx1ig2GF$Pk~Z71f&$dCD= zb}f+F1#!yllvYs`rOtwXO?Uj?24LQi>^eU%+iorIWv{q(AXyef^z*yo2Z-o9A*K8w z`FGtvHKde~Qhraq??Y?t`M&Q)QS^`S15!%kx~|X6IpMl4q?E&s<7_gsN%r%-<_ET_ zrEwf*Q%X6UWJ(t;%Q_;2_%#TEY#4?y9osX0ApV2HvMisOkJM_l#d;mcX0vb{=g-N> z$-YvlG+r*3zt&p+p|vKhHNr5ge}W)r`AN>zS|f@g(pvvfE| 0) { + parent_cbx.attr('checked', false); + } + else { + parent_cbx.attr('checked', false); + } + + }); + +}); + + +var content = (function(){ + return { + statusChecker : function(repo, sync, product_id){ + fadeUpdate("#prod_sync_start_" + product_id, ' '); + var updateField = $('#' + common.escapeId("repo_bar_" + repo)); + updateField.fadeOut('fast'); + updateField.html(''); + cancelButton = $('') + .attr("id", "cancel_"+repo) + .attr("class", "fr") + .attr("href", "#") + .text(i18n.cancel); + progressBar = $('