ab_admin 0.3.6 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/{LICENSE.txt → MIT-LICENSE} +2 -4
- data/README.md +3 -3
- data/Rakefile +21 -3
- data/app/assets/images/admin/flags/b_de.png +0 -0
- data/app/assets/images/admin/flags/b_es.png +0 -0
- data/app/assets/images/admin/flags/b_fr.png +0 -0
- data/app/assets/images/admin/flags/flag_de.gif +0 -0
- data/app/assets/images/admin/flags/flag_de_nonact.gif +0 -0
- data/app/assets/images/admin/flags/flag_es.gif +0 -0
- data/app/assets/images/admin/flags/flag_es_nonact.gif +0 -0
- data/app/assets/images/admin/flags/flag_fr.gif +0 -0
- data/app/assets/images/admin/flags/flag_fr_nonact.gif +0 -0
- data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +50 -60
- data/app/assets/javascripts/ab_admin/components/base_assets.js.coffee +86 -0
- data/app/assets/javascripts/ab_admin/components/croppable_image.js.coffee +4 -4
- data/app/assets/javascripts/ab_admin/components/gmaps.js.coffee +5 -0
- data/app/assets/javascripts/ab_admin/components/google_translate.js.coffee +0 -1
- data/app/assets/javascripts/ab_admin/components/in_place_edit.js.coffee +7 -3
- data/app/assets/javascripts/ab_admin/components/locator.js.coffee +1 -1
- data/app/assets/javascripts/ab_admin/components/select2_bridge.js.coffee +152 -0
- data/app/assets/javascripts/ab_admin/components/sortable_tree.js.coffee +1 -1
- data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +5 -4
- data/app/assets/javascripts/ab_admin/core/columns_hider.js.coffee +4 -11
- data/app/assets/javascripts/ab_admin/core/confirmation.js.coffee +4 -43
- data/app/assets/javascripts/ab_admin/core/deprecated_utils.js.coffee +44 -0
- data/app/assets/javascripts/ab_admin/core/init.js.coffee +8 -25
- data/app/assets/javascripts/ab_admin/core/pjax.js.coffee +18 -4
- data/app/assets/javascripts/ab_admin/core/search_form.js.coffee +5 -5
- data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +15 -86
- data/app/assets/javascripts/ab_admin/core/utils.js.coffee +38 -51
- data/app/assets/javascripts/ab_admin/core/view_layout.js.coffee +1 -1
- data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +16 -18
- data/app/assets/javascripts/ab_admin/main.js +7 -7
- data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.css.scss +21 -8
- data/app/assets/stylesheets/ab_admin/components/_admin_comments.css.scss +17 -5
- data/app/assets/stylesheets/ab_admin/components/_base.css.scss +4 -0
- data/app/assets/stylesheets/ab_admin/components/_colored_tabs.css.scss +1 -4
- data/app/assets/stylesheets/ab_admin/components/_columns_hider.css.scss +5 -0
- data/app/assets/stylesheets/ab_admin/components/_form.css.scss +45 -16
- data/app/assets/stylesheets/ab_admin/components/_grid_view.css.scss +11 -0
- data/app/assets/stylesheets/ab_admin/components/_locale_tabs.css.scss +1 -1
- data/app/assets/stylesheets/ab_admin/components/_navigation.css.scss +11 -9
- data/app/assets/stylesheets/ab_admin/components/_table_view.css.scss +1 -1
- data/app/assets/stylesheets/ab_admin/components/_translations.css.scss +1 -0
- data/app/assets/stylesheets/ab_admin/components/{_sortable_tree.css.scss → _tree_view.css.scss} +8 -3
- data/app/assets/stylesheets/ab_admin/fileupload.css.scss +51 -43
- data/app/assets/stylesheets/ab_admin/main.css.scss +1 -3
- data/app/controllers/admin/admin_comments_controller.rb +14 -4
- data/app/controllers/admin/assets_controller.rb +44 -35
- data/app/controllers/admin/base_controller.rb +93 -38
- data/app/controllers/admin/locators_controller.rb +3 -2
- data/app/controllers/admin/manager_controller.rb +20 -9
- data/app/controllers/admin/structures_controller.rb +9 -1
- data/app/controllers/admin/users_controller.rb +1 -2
- data/app/views/ab_admin/devise/sessions/new.html.slim +1 -1
- data/app/views/admin/admin_comments/_comment.html.slim +21 -7
- data/app/views/admin/admin_comments/_comments.html.slim +1 -1
- data/app/views/admin/admin_comments/_form.html.slim +8 -3
- data/app/views/admin/admin_comments/_list_block.html.slim +7 -0
- data/app/views/admin/admin_comments/create.js.erb +3 -2
- data/app/views/admin/admin_comments/destroy.js.erb +1 -1
- data/app/views/admin/admin_comments/index.js.erb +14 -0
- data/app/views/admin/assets/batch_edit.html.slim +14 -0
- data/app/views/admin/base/_modal_form_layout.html.slim +12 -0
- data/app/views/admin/base/_search_layout.html.slim +4 -3
- data/app/views/admin/base/_table.html.slim +2 -2
- data/app/views/admin/base/create.js.erb +13 -8
- data/app/views/admin/base/history.html.slim +18 -0
- data/app/views/admin/base/index.html.slim +3 -3
- data/app/views/admin/base/new.js.erb +14 -8
- data/app/views/admin/base/show.html.slim +1 -2
- data/app/views/admin/base/show.js.erb +7 -0
- data/app/views/admin/fileupload/_asset_templates.html.slim +29 -0
- data/app/views/admin/fileupload/_container.html.slim +13 -12
- data/app/views/admin/fileupload/_file.html.slim +2 -2
- data/app/views/admin/fileupload/_image.html.slim +8 -0
- data/app/views/admin/fileupload/_video.html.slim +2 -2
- data/app/views/admin/headers/_form.html.slim +2 -0
- data/app/views/admin/locators/edit.html.slim +1 -1
- data/app/views/admin/locators/show.html.slim +1 -2
- data/app/views/admin/manager/_form.html.slim +17 -3
- data/app/views/admin/manager/_modal_form.html.slim +19 -0
- data/app/views/admin/manager/_table.html.slim +3 -3
- data/app/views/admin/manager/show.html.slim +1 -0
- data/app/views/admin/shared/_content_actions.html.slim +39 -0
- data/app/views/admin/shared/_locale_tabs.html.slim +3 -3
- data/app/views/admin/shared/inputs/_checkbox_tree.html.slim +9 -3
- data/app/views/admin/structures/_form.html.slim +4 -7
- data/app/views/admin/users/_form.html.slim +2 -4
- data/app/views/admin/users/_search_form.html.slim +0 -1
- data/app/views/admin/users/_table.html.slim +8 -10
- data/app/views/layouts/admin/_footer.html.slim +3 -4
- data/app/views/layouts/admin/_navigation.html.slim +2 -2
- data/app/views/layouts/admin/application.html.slim +7 -9
- data/app/views/layouts/admin/devise.html.slim +3 -4
- data/config/locales/de.yml +319 -0
- data/config/locales/en.devise.yml +44 -31
- data/config/locales/en.yml +166 -143
- data/config/locales/it.devise.yml +54 -41
- data/config/locales/it.yml +178 -163
- data/config/locales/ru.devise.yml +70 -56
- data/config/locales/ru.yml +280 -264
- data/config/routes.rb +6 -3
- data/db/migrate/20130101000001_create_users.rb +7 -11
- data/db/migrate/20130101000003_create_assets.rb +5 -5
- data/db/migrate/20130101000004_create_headers.rb +2 -6
- data/db/migrate/20130101000005_create_static_pages.rb +1 -5
- data/db/migrate/20130101000006_create_structures.rb +5 -9
- data/db/migrate/20130101000007_base_translations.rb +3 -1
- data/db/migrate/20130101000008_create_admin_comments.rb +5 -5
- data/db/migrate/20130101000009_create_tracks.rb +20 -0
- data/lib/ab_admin.rb +36 -4
- data/lib/ab_admin/abstract_resource.rb +28 -7
- data/lib/ab_admin/carrierwave/base_uploader.rb +85 -5
- data/lib/ab_admin/carrierwave/glue.rb +6 -1
- data/lib/ab_admin/concerns/admin_addition.rb +26 -9
- data/lib/ab_admin/concerns/asset_human_names.rb +23 -0
- data/lib/ab_admin/concerns/fileuploads.rb +102 -0
- data/lib/ab_admin/concerns/has_tracking.rb +32 -0
- data/lib/ab_admin/concerns/nested_set.rb +9 -9
- data/lib/ab_admin/concerns/silencer.rb +5 -5
- data/lib/ab_admin/concerns/utilities.rb +28 -16
- data/lib/ab_admin/concerns/validations.rb +1 -1
- data/lib/ab_admin/config/base.rb +10 -2
- data/lib/ab_admin/controllers/callbacks.rb +2 -2
- data/lib/ab_admin/controllers/can_can_manager_resource.rb +3 -2
- data/lib/ab_admin/controllers/fv.rb +16 -0
- data/lib/ab_admin/controllers/head_options.rb +6 -4
- data/lib/ab_admin/core_ext/hash.rb +25 -70
- data/lib/ab_admin/core_ext/string.rb +17 -4
- data/lib/ab_admin/engine.rb +2 -8
- data/lib/ab_admin/hooks.rb +8 -3
- data/lib/ab_admin/hooks/active_model_hooks.rb +1 -1
- data/lib/ab_admin/hooks/globalize_hooks.rb +35 -0
- data/lib/ab_admin/hooks/paginate_hooks.rb +3 -1
- data/lib/ab_admin/i18n_tools/model_translator.rb +1 -1
- data/lib/ab_admin/menu/abstract_builder.rb +14 -0
- data/lib/ab_admin/menu/base_group.rb +26 -0
- data/lib/ab_admin/menu/builder.rb +16 -0
- data/lib/ab_admin/menu/group.rb +24 -0
- data/lib/ab_admin/menu/item.rb +23 -0
- data/lib/ab_admin/models/admin_comment.rb +68 -0
- data/lib/ab_admin/models/asset.rb +30 -19
- data/lib/ab_admin/models/attachment_file.rb +2 -1
- data/lib/ab_admin/models/header.rb +15 -0
- data/lib/ab_admin/models/locator.rb +1 -3
- data/lib/ab_admin/models/settings.rb +10 -10
- data/lib/ab_admin/models/structure.rb +20 -9
- data/lib/ab_admin/models/track.rb +61 -0
- data/lib/ab_admin/models/type_model.rb +30 -17
- data/lib/ab_admin/models/user.rb +18 -49
- data/lib/ab_admin/utils.rb +16 -7
- data/lib/ab_admin/utils/logger.rb +11 -7
- data/lib/ab_admin/utils/mysql.rb +10 -0
- data/lib/ab_admin/version.rb +1 -1
- data/lib/ab_admin/views/admin_helpers.rb +20 -9
- data/lib/ab_admin/views/admin_navigation_helpers.rb +44 -21
- data/lib/ab_admin/views/content_only_wrapper.rb +14 -0
- data/lib/ab_admin/views/form_builder.rb +27 -89
- data/lib/ab_admin/views/helpers.rb +1 -28
- data/lib/ab_admin/views/inputs/capture_block_input.rb +16 -0
- data/lib/ab_admin/views/inputs/date_time_picker_input.rb +45 -0
- data/lib/ab_admin/views/inputs/token_input.rb +2 -1
- data/lib/ab_admin/views/inputs/uploader_input.rb +101 -0
- data/lib/ab_admin/views/manager_helpers.rb +12 -0
- data/lib/ab_admin/views/search_form_builder.rb +36 -13
- data/lib/generators/ab_admin/ckeditor_assets/ckeditor_assets_generator.rb +1 -1
- data/lib/generators/ab_admin/install/install_generator.rb +3 -2
- data/lib/generators/ab_admin/install/templates/config/ab_admin.rb.erb +1 -1
- data/lib/generators/ab_admin/install/templates/config/admin_menu.rb +1 -1
- data/lib/generators/ab_admin/install/templates/config/i18n-js.yml +1 -1
- data/lib/generators/ab_admin/install/templates/config/nginx.conf +22 -9
- data/lib/generators/ab_admin/install/templates/config/robots.txt +7 -0
- data/lib/generators/ab_admin/install/templates/config/seeds.rb +2 -1
- data/lib/generators/ab_admin/install/templates/models/ability.rb +2 -7
- data/lib/generators/ab_admin/install/templates/models/admin_comment.rb +3 -28
- data/lib/generators/ab_admin/install/templates/models/asset.rb +4 -2
- data/lib/generators/ab_admin/install/templates/models/attachment_file.rb +1 -1
- data/lib/generators/ab_admin/install/templates/models/avatar.rb +2 -2
- data/lib/generators/ab_admin/install/templates/models/gender_type.rb +1 -1
- data/lib/generators/ab_admin/install/templates/models/header.rb +2 -2
- data/lib/generators/ab_admin/install/templates/models/locator.rb +0 -1
- data/lib/generators/ab_admin/install/templates/models/picture.rb +1 -1
- data/lib/generators/ab_admin/install/templates/models/settings.rb +1 -1
- data/lib/generators/ab_admin/install/templates/models/structure.rb +6 -8
- data/lib/generators/ab_admin/install/templates/models/track.rb +5 -0
- data/lib/generators/ab_admin/install/templates/models/user.rb +2 -3
- data/lib/generators/ab_admin/install/templates/script/unicorn.sh +0 -2
- data/lib/generators/ab_admin/install/templates/spec/factories/user_factory.rb +1 -2
- data/lib/generators/ab_admin/install/templates/uploaders/attachment_file_uploader.rb +1 -1
- data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +1 -1
- data/lib/generators/ab_admin/install/templates/uploaders/picture_uploader.rb +1 -1
- data/lib/generators/ab_admin/model/templates/resource.erb +1 -1
- data/lib/generators/ab_admin/resource/templates/_form.slim.erb +49 -45
- data/lib/generators/ab_admin/resource/templates/_table.slim.erb +1 -1
- data/lib/generators/template.rb +32 -56
- data/lib/tasks/assets.rake +1 -0
- metadata +197 -698
- data/.gitignore +0 -41
- data/Gemfile +0 -77
- data/Guardfile +0 -35
- data/TODO +0 -4
- data/ab_admin.gemspec +0 -59
- data/app/views/admin/fileupload/_asset.html.slim +0 -8
- data/app/views/admin/fileupload/_ftmpl.html.slim +0 -6
- data/app/views/admin/fileupload/_tmpl.html.slim +0 -9
- data/app/views/admin/fileupload/_vtmpl.html.slim +0 -10
- data/app/views/admin/shared/_batch_actions.html.slim +0 -27
- data/cucumber.yml +0 -10
- data/features/dsl/action_items.feature +0 -79
- data/features/dsl/admin_comments.feature +0 -30
- data/features/dsl/batch_actions.feature +0 -69
- data/features/dsl/config.feature +0 -44
- data/features/dsl/custom_actions.feature +0 -62
- data/features/dsl/export.feature +0 -42
- data/features/dsl/form.feature +0 -77
- data/features/dsl/in_place_edit.feature +0 -26
- data/features/dsl/list_edit.feature +0 -46
- data/features/dsl/parent_resource.feature +0 -18
- data/features/dsl/resource_action_items.feature +0 -40
- data/features/dsl/search.feature +0 -41
- data/features/dsl/show.feature +0 -37
- data/features/dsl/table.feature +0 -71
- data/features/dsl/tree.feature +0 -37
- data/features/index_views/table.feature +0 -20
- data/features/locators.feature +0 -40
- data/features/menu.feature +0 -35
- data/features/settings.feature +0 -36
- data/features/step_definitions/configuration_steps.rb +0 -94
- data/features/step_definitions/dsl/action_items_steps.rb +0 -13
- data/features/step_definitions/dsl/admin_comments_steps.rb +0 -12
- data/features/step_definitions/dsl/batch_actions_steps.rb +0 -27
- data/features/step_definitions/dsl/in_place_edit_steps.rb +0 -7
- data/features/step_definitions/dsl/parent_resource_steps.rb +0 -8
- data/features/step_definitions/dsl/resource_action_items_steps.rb +0 -14
- data/features/step_definitions/dsl/show_steps.rb +0 -8
- data/features/step_definitions/dsl/table_steps.rb +0 -38
- data/features/step_definitions/dsl/tree_steps.rb +0 -28
- data/features/step_definitions/menu_steps.rb +0 -20
- data/features/step_definitions/settings_steps.rb +0 -7
- data/features/step_definitions/structure_steps.rb +0 -7
- data/features/step_definitions/table_steps.rb +0 -23
- data/features/step_definitions/user_steps.rb +0 -72
- data/features/step_definitions/web_steps/browsing_steps.rb +0 -108
- data/features/step_definitions/web_steps/debug_steps.rb +0 -6
- data/features/step_definitions/web_steps/form_steps.rb +0 -190
- data/features/step_definitions/web_steps/i18n_steps.rb +0 -8
- data/features/step_definitions/web_steps/step_scoper.rb +0 -9
- data/features/step_definitions/web_steps/transforms_steps.rb +0 -3
- data/features/structure/tree.feature +0 -21
- data/features/support/capybara_helpers.rb +0 -15
- data/features/support/carrierwave.rb +0 -21
- data/features/support/env.rb +0 -40
- data/features/support/paths.rb +0 -55
- data/features/support/selector_helpers.rb +0 -9
- data/features/support/selectors.rb +0 -43
- data/features/support/tolerance_for_selenium_sync_issues.rb +0 -27
- data/features/user/sign_in.feature +0 -27
- data/features/user/sign_out.feature +0 -11
- data/features/user/user_edit.feature +0 -19
- data/features/user/user_show.feature +0 -9
- data/lib/ab_admin/hooks/quiet_scope_page.rb +0 -16
- data/lib/ab_admin/hooks/simple_form_hooks.rb +0 -31
- data/lib/ab_admin/menu_builder.rb +0 -89
- data/lib/ab_admin/views/inputs/date_time_input.rb +0 -65
- data/lib/generators/ab_admin/install/templates/models/user_state.rb +0 -6
- data/lib/generators/ab_admin/resource/templates/_form.haml.erb +0 -71
- data/lib/generators/ab_admin/resource/templates/_search_form.haml.erb +0 -35
- data/lib/generators/ab_admin/resource/templates/_table.haml.erb +0 -33
- data/spec/ab_admin_spec.rb +0 -23
- data/spec/dummy/Rakefile +0 -7
- data/spec/dummy/app/assets/images/rails.png +0 -0
- data/spec/dummy/app/assets/javascripts/application.js +0 -15
- data/spec/dummy/app/assets/stylesheets/application.css +0 -13
- data/spec/dummy/app/controllers/application_controller.rb +0 -3
- data/spec/dummy/app/controllers/products_controller.rb +0 -5
- data/spec/dummy/app/controllers/welcome_controller.rb +0 -5
- data/spec/dummy/app/mailers/.gitkeep +0 -0
- data/spec/dummy/app/models/ab_admin/ab_admin_catalogue.rb +0 -5
- data/spec/dummy/app/models/ab_admin/ab_admin_collection.rb +0 -35
- data/spec/dummy/app/models/ab_admin/ab_admin_product.rb +0 -74
- data/spec/dummy/app/models/admin_menu.rb +0 -18
- data/spec/dummy/app/models/catalogue.rb +0 -10
- data/spec/dummy/app/models/ckeditor/asset.rb +0 -7
- data/spec/dummy/app/models/ckeditor/attachment_file.rb +0 -7
- data/spec/dummy/app/models/ckeditor/picture.rb +0 -7
- data/spec/dummy/app/models/collection.rb +0 -20
- data/spec/dummy/app/models/product.rb +0 -32
- data/spec/dummy/app/uploaders/ckeditor_attachment_file_uploader.rb +0 -42
- data/spec/dummy/app/uploaders/ckeditor_picture_uploader.rb +0 -53
- data/spec/dummy/app/views/admin/collections/_form.html.slim +0 -24
- data/spec/dummy/app/views/layouts/application.html.erb +0 -14
- data/spec/dummy/app/views/products/show.html.erb +0 -2
- data/spec/dummy/app/views/welcome/index.html.erb +0 -2
- data/spec/dummy/config.ru +0 -4
- data/spec/dummy/config/application.rb +0 -82
- data/spec/dummy/config/boot.rb +0 -10
- data/spec/dummy/config/database.yml +0 -26
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/development.rb +0 -37
- data/spec/dummy/config/environments/production.rb +0 -67
- data/spec/dummy/config/environments/test.rb +0 -37
- data/spec/dummy/config/i18n-js.yml +0 -21
- data/spec/dummy/config/initializers/ab_admin.rb +0 -15
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/ckeditor.rb +0 -18
- data/spec/dummy/config/initializers/devise.rb +0 -232
- data/spec/dummy/config/initializers/inflections.rb +0 -15
- data/spec/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/dummy/config/initializers/secret_token.rb +0 -7
- data/spec/dummy/config/initializers/session_store.rb +0 -8
- data/spec/dummy/config/initializers/simple_form.rb +0 -142
- data/spec/dummy/config/initializers/simple_form_bootstrap.rb +0 -45
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/spec/dummy/config/locales/devise.en.yml +0 -60
- data/spec/dummy/config/locales/en.yml +0 -5
- data/spec/dummy/config/locales/simple_form.en.yml +0 -26
- data/spec/dummy/config/routes.rb +0 -14
- data/spec/dummy/config/settings/development.local.yml +0 -9
- data/spec/dummy/config/settings/development.yml +0 -7
- data/spec/dummy/db/migrate/20130129151853_create_ckeditor_assets.rb +0 -26
- data/spec/dummy/db/migrate/20130130161853_create_collections.rb +0 -10
- data/spec/dummy/db/migrate/20130130162046_create_products.rb +0 -13
- data/spec/dummy/db/migrate/20130130175446_create_globalize_collection_product.rb +0 -11
- data/spec/dummy/db/migrate/20130207224516_create_catalogues.rb +0 -16
- data/spec/dummy/db/migrate/20130209223506_add_lat_lon_zoom_to_products.rb +0 -7
- data/spec/dummy/db/seeds.rb +0 -46
- data/spec/dummy/lib/assets/.gitkeep +0 -0
- data/spec/dummy/lib/capybara_irb.rb +0 -42
- data/spec/dummy/lib/tasks/.gitkeep +0 -0
- data/spec/dummy/lib/tasks/cucumber.rake +0 -65
- data/spec/dummy/lib/templates/slim/scaffold/_form.html.slim +0 -10
- data/spec/dummy/log/.gitkeep +0 -0
- data/spec/dummy/public/404.html +0 -26
- data/spec/dummy/public/422.html +0 -26
- data/spec/dummy/public/500.html +0 -25
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/cucumber +0 -10
- data/spec/dummy/script/rails +0 -6
- data/spec/factories/assets.rb +0 -52
- data/spec/factories/catalogues.rb +0 -7
- data/spec/factories/collections.rb +0 -8
- data/spec/factories/files/rails.png +0 -0
- data/spec/factories/products.rb +0 -17
- data/spec/factories/sequences.rb +0 -7
- data/spec/factories/structures.rb +0 -17
- data/spec/factories/users.rb +0 -30
- data/spec/generators/ckeditor_assets_generator_spec.rb +0 -19
- data/spec/generators/install_generator_spec.rb +0 -48
- data/spec/generators/model_generator_spec.rb +0 -31
- data/spec/generators/resource_generator_spec.rb +0 -36
- data/spec/models/ab_admin/abstract_resource_spec.rb +0 -5
- data/spec/models/avatar_spec.rb +0 -162
- data/spec/models/picture_uploader_spec.rb +0 -49
- data/spec/models/structure_spec.rb +0 -69
- data/spec/models/user_spec.rb +0 -159
- data/spec/shared_behaviors/concerns.rb +0 -20
- data/spec/spec_helper.rb +0 -96
- data/spec/support/controller_macros.rb +0 -52
- data/spec/support/custom_capybara_matchers.rb +0 -58
- data/spec/support/mailer_macros.rb +0 -17
- data/spec/support/shared_connection.rb +0 -11
- data/vendor/assets/images/ab_admin/clear.png +0 -0
- data/vendor/assets/images/ab_admin/loading.gif +0 -0
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/core.js +0 -899
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/index.js +0 -2
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.bg.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.br.js +0 -13
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.cs.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.da.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.de.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.es.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.fi.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.fr.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.id.js +0 -13
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.is.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.it.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ja.js +0 -13
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.kr.js +0 -13
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.lt.js +0 -15
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.lv.js +0 -16
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ms.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.nb.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.nl.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.pl.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.pt-BR.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.pt.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ro.js +0 -15
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ru.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.sk.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.sl.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.sv.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.th.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.tr.js +0 -15
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.zh-CN.js +0 -14
- data/vendor/assets/javascripts/ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.zh-TW.js +0 -13
- data/vendor/assets/javascripts/ab_admin/bootstrap-editable-inline.js +0 -2895
- data/vendor/assets/javascripts/ab_admin/bootstrap-editable.js +0 -4523
- data/vendor/assets/javascripts/ab_admin/bootstrap-tab-multi.js +0 -135
- data/vendor/assets/javascripts/ab_admin/bootstrap-timepicker.js +0 -377
- data/vendor/assets/javascripts/ab_admin/fileupload/admin-fileuploader.js.coffee +0 -111
- data/vendor/assets/javascripts/ab_admin/fileupload/fileuploader.js +0 -1301
- data/vendor/assets/javascripts/ab_admin/jquery.Jcrop.js +0 -1083
- data/vendor/assets/javascripts/ab_admin/jquery_nested_form.js.coffee +0 -66
- data/vendor/assets/javascripts/bootstrap-wysihtml5/locales/ru.js +0 -48
- data/vendor/assets/javascripts/handlebars.min.js +0 -1
- data/vendor/assets/javascripts/jquery.cookie.js +0 -42
- data/vendor/assets/javascripts/jquery.hotkeys.js +0 -106
- data/vendor/assets/javascripts/jquery.pjax.js +0 -688
- data/vendor/assets/javascripts/jquery.tmpl.min.js +0 -10
- data/vendor/assets/javascripts/jquery.ui.nestedSortable.js +0 -356
- data/vendor/assets/javascripts/jquery/jquery-ui.min.js +0 -15
- data/vendor/assets/javascripts/jquery/jquery.min.js +0 -4
- data/vendor/assets/javascripts/underscore.min.js +0 -5
- data/vendor/assets/stylesheets/ab_admin/bootstrap-datepicker.css.scss +0 -274
- data/vendor/assets/stylesheets/ab_admin/bootstrap-editable.scss +0 -461
- data/vendor/assets/stylesheets/ab_admin/bootstrap-timepicker.css.scss +0 -88
- data/vendor/assets/stylesheets/ab_admin/jquery.Jcrop.min.css.scss +0 -28
@@ -1,66 +0,0 @@
|
|
1
|
-
$ ->
|
2
|
-
$(document).on 'click', 'form a.add_nested_fields', ->
|
3
|
-
$el = $(this)
|
4
|
-
assoc = $el.attr("data-association")
|
5
|
-
content = $("#" + assoc + "_fields_blueprint").html()
|
6
|
-
context = ($el.closest('.fields').closestChild('input:not([id$="_destroy"]), textarea, select').eq(0).attr('name') || '').replace(new RegExp('\[[a-z_]+\]$'), '')
|
7
|
-
if context
|
8
|
-
parent_names = context.match(/[a-z_]+_attributes/g) or []
|
9
|
-
parent_ids = context.match(/(new_)?[0-9]+/g) or []
|
10
|
-
i = 0
|
11
|
-
|
12
|
-
while i < parent_names.length
|
13
|
-
if parent_ids[i]
|
14
|
-
content = content.replace(new RegExp("(_" + parent_names[i] + ")_.+?_", "g"), "$1_" + parent_ids[i] + "_")
|
15
|
-
content = content.replace(new RegExp("(\\[" + parent_names[i] + "\\])\\[.+?\\]", "g"), "$1[" + parent_ids[i] + "]")
|
16
|
-
i++
|
17
|
-
regexp = new RegExp("new_" + assoc, "g")
|
18
|
-
new_id = (new Date().getTime()).toString().substr(-10, 10)
|
19
|
-
content = content.replace(regexp, "new_" + new_id)
|
20
|
-
|
21
|
-
guid = $(content).find('[name$="[fileupload_guid]"]').val()
|
22
|
-
content = content.replace(new RegExp(guid, 'g'), new_id) if guid
|
23
|
-
|
24
|
-
if $el.data('container')
|
25
|
-
$cont = $($el.data('container'))
|
26
|
-
field = $(content).prependTo($cont)
|
27
|
-
else
|
28
|
-
$cont = $el
|
29
|
-
field = $(content).insertBefore($cont)
|
30
|
-
|
31
|
-
$el.closest("form").trigger
|
32
|
-
type: "nested:fieldAdded"
|
33
|
-
field: field
|
34
|
-
new_id: new_id
|
35
|
-
|
36
|
-
false
|
37
|
-
|
38
|
-
$(document).on 'click', 'form a.remove_nested_fields', ->
|
39
|
-
hidden_field = $(this).prev("input[type=hidden]")[0]
|
40
|
-
hidden_field.value = "1" if hidden_field
|
41
|
-
$fields = $(this).closest(".fields")
|
42
|
-
if $fields.find('input[type="hidden"]:last').prop('name')?.match(/\[id\]/)
|
43
|
-
$fields.hide()
|
44
|
-
else
|
45
|
-
$fields.remove()
|
46
|
-
|
47
|
-
$(this).closest("form").trigger "nested:fieldRemoved"
|
48
|
-
false
|
49
|
-
|
50
|
-
|
51
|
-
$.fn.closestChild = (selector) ->
|
52
|
-
# breadth first search for the first matched node
|
53
|
-
if selector and selector isnt ""
|
54
|
-
queue = []
|
55
|
-
queue.push this
|
56
|
-
while queue.length > 0
|
57
|
-
node = queue.shift()
|
58
|
-
children = node.children()
|
59
|
-
i = 0
|
60
|
-
|
61
|
-
while i < children.length
|
62
|
-
child = $(children[i])
|
63
|
-
return child if child.is(selector) #well, we found one
|
64
|
-
queue.push child
|
65
|
-
++i
|
66
|
-
$() #nothing found
|
@@ -1,48 +0,0 @@
|
|
1
|
-
(function ($) {
|
2
|
-
$.fn.wysihtml5.locale["ru"] = {
|
3
|
-
font_styles:{
|
4
|
-
normal:"Обычный",
|
5
|
-
h1:"Заголовок 1",
|
6
|
-
h2:"Заголовок 2",
|
7
|
-
h3:"Заголовок 3"
|
8
|
-
},
|
9
|
-
emphasis:{
|
10
|
-
bold:"Жирный",
|
11
|
-
italic:"Курсив",
|
12
|
-
underline:"Подчеркнутый"
|
13
|
-
// bold:"B",
|
14
|
-
// italic:"I",
|
15
|
-
// underline:"U"
|
16
|
-
},
|
17
|
-
lists:{
|
18
|
-
unordered:"Неупорядоченный список",
|
19
|
-
ordered:"Нумерованный список",
|
20
|
-
outdent:"Выступ",
|
21
|
-
indent:"Отступ"
|
22
|
-
},
|
23
|
-
link:{
|
24
|
-
insert:"Вставить ссылку",
|
25
|
-
cancel:"Отменить"
|
26
|
-
},
|
27
|
-
image:{
|
28
|
-
insert:"Вставить изображение",
|
29
|
-
cancel:"Отменить"
|
30
|
-
},
|
31
|
-
html:{
|
32
|
-
edit:"Изменить HTML"
|
33
|
-
},
|
34
|
-
colours:{
|
35
|
-
black:"Черный",
|
36
|
-
silver:"Серебро",
|
37
|
-
gray:"Серый",
|
38
|
-
maroon:"Бордовый",
|
39
|
-
red:"Красный",
|
40
|
-
purple:"Фиолетовый",
|
41
|
-
green:"Зеленый",
|
42
|
-
olive:"Оливковый",
|
43
|
-
navy:"Морской",
|
44
|
-
blue:"Синий",
|
45
|
-
orange:"Оранжевый"
|
46
|
-
}
|
47
|
-
}
|
48
|
-
}(jQuery));
|
@@ -1 +0,0 @@
|
|
1
|
-
var Handlebars={};Handlebars.VERSION="1.0.beta.6";Handlebars.helpers={};Handlebars.partials={};Handlebars.registerHelper=function(b,c,a){if(a){c.not=a}this.helpers[b]=c};Handlebars.registerPartial=function(a,b){this.partials[a]=b};Handlebars.registerHelper("helperMissing",function(a){if(arguments.length===2){return undefined}else{throw new Error("Could not find property '"+a+"'")}});var toString=Object.prototype.toString,functionType="[object Function]";Handlebars.registerHelper("blockHelperMissing",function(f,d){var a=d.inverse||function(){},h=d.fn;var c="";var g=toString.call(f);if(g===functionType){f=f.call(this)}if(f===true){return h(this)}else{if(f===false||f==null){return a(this)}else{if(g==="[object Array]"){if(f.length>0){for(var e=0,b=f.length;e<b;e++){c=c+h(f[e])}}else{c=a(this)}return c}else{return h(f)}}}});Handlebars.registerHelper("each",function(f,d){var g=d.fn,a=d.inverse;var c="";if(f&&f.length>0){for(var e=0,b=f.length;e<b;e++){c=c+g(f[e])}}else{c=a(this)}return c});Handlebars.registerHelper("if",function(b,a){var c=toString.call(b);if(c===functionType){b=b.call(this)}if(!b||Handlebars.Utils.isEmpty(b)){return a.inverse(this)}else{return a.fn(this)}});Handlebars.registerHelper("unless",function(c,b){var d=b.fn,a=b.inverse;b.fn=a;b.inverse=d;return Handlebars.helpers["if"].call(this,c,b)});Handlebars.registerHelper("with",function(b,a){return a.fn(b)});Handlebars.registerHelper("log",function(a){Handlebars.log(a)});var handlebars=(function(){var f={trace:function c(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,statements:6,simpleInverse:7,statement:8,openInverse:9,closeBlock:10,openBlock:11,mustache:12,partial:13,CONTENT:14,COMMENT:15,OPEN_BLOCK:16,inMustache:17,CLOSE:18,OPEN_INVERSE:19,OPEN_ENDBLOCK:20,path:21,OPEN:22,OPEN_UNESCAPED:23,OPEN_PARTIAL:24,params:25,hash:26,param:27,STRING:28,INTEGER:29,BOOLEAN:30,hashSegments:31,hashSegment:32,ID:33,EQUALS:34,pathSegments:35,SEP:36,"$accept":0,"$end":1},terminals_:{2:"error",5:"EOF",14:"CONTENT",15:"COMMENT",16:"OPEN_BLOCK",18:"CLOSE",19:"OPEN_INVERSE",20:"OPEN_ENDBLOCK",22:"OPEN",23:"OPEN_UNESCAPED",24:"OPEN_PARTIAL",28:"STRING",29:"INTEGER",30:"BOOLEAN",33:"ID",34:"EQUALS",36:"SEP"},productions_:[0,[3,2],[4,3],[4,1],[4,0],[6,1],[6,2],[8,3],[8,3],[8,1],[8,1],[8,1],[8,1],[11,3],[9,3],[10,3],[12,3],[12,3],[13,3],[13,4],[7,2],[17,3],[17,2],[17,2],[17,1],[25,2],[25,1],[27,1],[27,1],[27,1],[27,1],[26,1],[31,2],[31,1],[32,3],[32,3],[32,3],[32,3],[21,1],[35,3],[35,1]],performAction:function b(g,j,k,n,m,i,l){var h=i.length-1;switch(m){case 1:return i[h-1];break;case 2:this.$=new n.ProgramNode(i[h-2],i[h]);break;case 3:this.$=new n.ProgramNode(i[h]);break;case 4:this.$=new n.ProgramNode([]);break;case 5:this.$=[i[h]];break;case 6:i[h-1].push(i[h]);this.$=i[h-1];break;case 7:this.$=new n.InverseNode(i[h-2],i[h-1],i[h]);break;case 8:this.$=new n.BlockNode(i[h-2],i[h-1],i[h]);break;case 9:this.$=i[h];break;case 10:this.$=i[h];break;case 11:this.$=new n.ContentNode(i[h]);break;case 12:this.$=new n.CommentNode(i[h]);break;case 13:this.$=new n.MustacheNode(i[h-1][0],i[h-1][1]);break;case 14:this.$=new n.MustacheNode(i[h-1][0],i[h-1][1]);break;case 15:this.$=i[h-1];break;case 16:this.$=new n.MustacheNode(i[h-1][0],i[h-1][1]);break;case 17:this.$=new n.MustacheNode(i[h-1][0],i[h-1][1],true);break;case 18:this.$=new n.PartialNode(i[h-1]);break;case 19:this.$=new n.PartialNode(i[h-2],i[h-1]);break;case 20:break;case 21:this.$=[[i[h-2]].concat(i[h-1]),i[h]];break;case 22:this.$=[[i[h-1]].concat(i[h]),null];break;case 23:this.$=[[i[h-1]],i[h]];break;case 24:this.$=[[i[h]],null];break;case 25:i[h-1].push(i[h]);this.$=i[h-1];break;case 26:this.$=[i[h]];break;case 27:this.$=i[h];break;case 28:this.$=new n.StringNode(i[h]);break;case 29:this.$=new n.IntegerNode(i[h]);break;case 30:this.$=new n.BooleanNode(i[h]);break;case 31:this.$=new n.HashNode(i[h]);break;case 32:i[h-1].push(i[h]);this.$=i[h-1];break;case 33:this.$=[i[h]];break;case 34:this.$=[i[h-2],i[h]];break;case 35:this.$=[i[h-2],new n.StringNode(i[h])];break;case 36:this.$=[i[h-2],new n.IntegerNode(i[h])];break;case 37:this.$=[i[h-2],new n.BooleanNode(i[h])];break;case 38:this.$=new n.IdNode(i[h]);break;case 39:i[h-2].push(i[h]);this.$=i[h-2];break;case 40:this.$=[i[h]];break}},table:[{3:1,4:2,5:[2,4],6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],24:[1,15]},{1:[3]},{5:[1,16]},{5:[2,3],7:17,8:18,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,19],20:[2,3],22:[1,13],23:[1,14],24:[1,15]},{5:[2,5],14:[2,5],15:[2,5],16:[2,5],19:[2,5],20:[2,5],22:[2,5],23:[2,5],24:[2,5]},{4:20,6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],24:[1,15]},{4:21,6:3,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,4],22:[1,13],23:[1,14],24:[1,15]},{5:[2,9],14:[2,9],15:[2,9],16:[2,9],19:[2,9],20:[2,9],22:[2,9],23:[2,9],24:[2,9]},{5:[2,10],14:[2,10],15:[2,10],16:[2,10],19:[2,10],20:[2,10],22:[2,10],23:[2,10],24:[2,10]},{5:[2,11],14:[2,11],15:[2,11],16:[2,11],19:[2,11],20:[2,11],22:[2,11],23:[2,11],24:[2,11]},{5:[2,12],14:[2,12],15:[2,12],16:[2,12],19:[2,12],20:[2,12],22:[2,12],23:[2,12],24:[2,12]},{17:22,21:23,33:[1,25],35:24},{17:26,21:23,33:[1,25],35:24},{17:27,21:23,33:[1,25],35:24},{17:28,21:23,33:[1,25],35:24},{21:29,33:[1,25],35:24},{1:[2,1]},{6:30,8:4,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],22:[1,13],23:[1,14],24:[1,15]},{5:[2,6],14:[2,6],15:[2,6],16:[2,6],19:[2,6],20:[2,6],22:[2,6],23:[2,6],24:[2,6]},{17:22,18:[1,31],21:23,33:[1,25],35:24},{10:32,20:[1,33]},{10:34,20:[1,33]},{18:[1,35]},{18:[2,24],21:40,25:36,26:37,27:38,28:[1,41],29:[1,42],30:[1,43],31:39,32:44,33:[1,45],35:24},{18:[2,38],28:[2,38],29:[2,38],30:[2,38],33:[2,38],36:[1,46]},{18:[2,40],28:[2,40],29:[2,40],30:[2,40],33:[2,40],36:[2,40]},{18:[1,47]},{18:[1,48]},{18:[1,49]},{18:[1,50],21:51,33:[1,25],35:24},{5:[2,2],8:18,9:5,11:6,12:7,13:8,14:[1,9],15:[1,10],16:[1,12],19:[1,11],20:[2,2],22:[1,13],23:[1,14],24:[1,15]},{14:[2,20],15:[2,20],16:[2,20],19:[2,20],22:[2,20],23:[2,20],24:[2,20]},{5:[2,7],14:[2,7],15:[2,7],16:[2,7],19:[2,7],20:[2,7],22:[2,7],23:[2,7],24:[2,7]},{21:52,33:[1,25],35:24},{5:[2,8],14:[2,8],15:[2,8],16:[2,8],19:[2,8],20:[2,8],22:[2,8],23:[2,8],24:[2,8]},{14:[2,14],15:[2,14],16:[2,14],19:[2,14],20:[2,14],22:[2,14],23:[2,14],24:[2,14]},{18:[2,22],21:40,26:53,27:54,28:[1,41],29:[1,42],30:[1,43],31:39,32:44,33:[1,45],35:24},{18:[2,23]},{18:[2,26],28:[2,26],29:[2,26],30:[2,26],33:[2,26]},{18:[2,31],32:55,33:[1,56]},{18:[2,27],28:[2,27],29:[2,27],30:[2,27],33:[2,27]},{18:[2,28],28:[2,28],29:[2,28],30:[2,28],33:[2,28]},{18:[2,29],28:[2,29],29:[2,29],30:[2,29],33:[2,29]},{18:[2,30],28:[2,30],29:[2,30],30:[2,30],33:[2,30]},{18:[2,33],33:[2,33]},{18:[2,40],28:[2,40],29:[2,40],30:[2,40],33:[2,40],34:[1,57],36:[2,40]},{33:[1,58]},{14:[2,13],15:[2,13],16:[2,13],19:[2,13],20:[2,13],22:[2,13],23:[2,13],24:[2,13]},{5:[2,16],14:[2,16],15:[2,16],16:[2,16],19:[2,16],20:[2,16],22:[2,16],23:[2,16],24:[2,16]},{5:[2,17],14:[2,17],15:[2,17],16:[2,17],19:[2,17],20:[2,17],22:[2,17],23:[2,17],24:[2,17]},{5:[2,18],14:[2,18],15:[2,18],16:[2,18],19:[2,18],20:[2,18],22:[2,18],23:[2,18],24:[2,18]},{18:[1,59]},{18:[1,60]},{18:[2,21]},{18:[2,25],28:[2,25],29:[2,25],30:[2,25],33:[2,25]},{18:[2,32],33:[2,32]},{34:[1,57]},{21:61,28:[1,62],29:[1,63],30:[1,64],33:[1,25],35:24},{18:[2,39],28:[2,39],29:[2,39],30:[2,39],33:[2,39],36:[2,39]},{5:[2,19],14:[2,19],15:[2,19],16:[2,19],19:[2,19],20:[2,19],22:[2,19],23:[2,19],24:[2,19]},{5:[2,15],14:[2,15],15:[2,15],16:[2,15],19:[2,15],20:[2,15],22:[2,15],23:[2,15],24:[2,15]},{18:[2,34],33:[2,34]},{18:[2,35],33:[2,35]},{18:[2,36],33:[2,36]},{18:[2,37],33:[2,37]}],defaultActions:{16:[2,1],37:[2,23],53:[2,21]},parseError:function d(h,g){throw new Error(h)},parse:function e(o){var x=this,l=[0],G=[null],s=[],H=this.table,h="",q=0,E=0,j=0,n=2,u=1;this.lexer.setInput(o);this.lexer.yy=this.yy;this.yy.lexer=this.lexer;if(typeof this.lexer.yylloc=="undefined"){this.lexer.yylloc={}}var i=this.lexer.yylloc;s.push(i);if(typeof this.yy.parseError==="function"){this.parseError=this.yy.parseError}function w(p){l.length=l.length-2*p;G.length=G.length-p;s.length=s.length-p}function v(){var p;p=x.lexer.lex()||1;if(typeof p!=="number"){p=x.symbols_[p]||p}return p}var D,z,k,C,I,t,B={},y,F,g,m;while(true){k=l[l.length-1];if(this.defaultActions[k]){C=this.defaultActions[k]}else{if(D==null){D=v()}C=H[k]&&H[k][D]}if(typeof C==="undefined"||!C.length||!C[0]){if(!j){m=[];for(y in H[k]){if(this.terminals_[y]&&y>2){m.push("'"+this.terminals_[y]+"'")}}var A="";if(this.lexer.showPosition){A="Parse error on line "+(q+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+m.join(", ")+", got '"+this.terminals_[D]+"'"}else{A="Parse error on line "+(q+1)+": Unexpected "+(D==1?"end of input":"'"+(this.terminals_[D]||D)+"'")}this.parseError(A,{text:this.lexer.match,token:this.terminals_[D]||D,line:this.lexer.yylineno,loc:i,expected:m})}}if(C[0] instanceof Array&&C.length>1){throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+D)}switch(C[0]){case 1:l.push(D);G.push(this.lexer.yytext);s.push(this.lexer.yylloc);l.push(C[1]);D=null;if(!z){E=this.lexer.yyleng;h=this.lexer.yytext;q=this.lexer.yylineno;i=this.lexer.yylloc;if(j>0){j--}}else{D=z;z=null}break;case 2:F=this.productions_[C[1]][1];B.$=G[G.length-F];B._$={first_line:s[s.length-(F||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(F||1)].first_column,last_column:s[s.length-1].last_column};t=this.performAction.call(B,h,E,q,this.yy,C[1],G,s);if(typeof t!=="undefined"){return t}if(F){l=l.slice(0,-1*F*2);G=G.slice(0,-1*F);s=s.slice(0,-1*F)}l.push(this.productions_[C[1]][0]);G.push(B.$);s.push(B._$);g=H[l[l.length-2]][l[l.length-1]];l.push(g);break;case 3:return true}}return true}};var a=(function(){var j=({EOF:1,parseError:function l(o,n){if(this.yy.parseError){this.yy.parseError(o,n)}else{throw new Error(o)}},setInput:function(n){this._input=n;this._more=this._less=this.done=false;this.yylineno=this.yyleng=0;this.yytext=this.matched=this.match="";this.conditionStack=["INITIAL"];this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0};return this},input:function(){var o=this._input[0];this.yytext+=o;this.yyleng++;this.match+=o;this.matched+=o;var n=o.match(/\n/);if(n){this.yylineno++}this._input=this._input.slice(1);return o},unput:function(n){this._input=n+this._input;return this},more:function(){this._more=true;return this},pastInput:function(){var n=this.matched.substr(0,this.matched.length-this.match.length);return(n.length>20?"...":"")+n.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var n=this.match;if(n.length<20){n+=this._input.substr(0,20-n.length)}return(n.substr(0,20)+(n.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var n=this.pastInput();var o=new Array(n.length+1).join("-");return n+this.upcomingInput()+"\n"+o+"^"},next:function(){if(this.done){return this.EOF}if(!this._input){this.done=true}var r,p,o,n;if(!this._more){this.yytext="";this.match=""}var s=this._currentRules();for(var q=0;q<s.length;q++){p=this._input.match(this.rules[s[q]]);if(p){n=p[0].match(/\n.*/g);if(n){this.yylineno+=n.length}this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:n?n[n.length-1].length-1:this.yylloc.last_column+p[0].length};this.yytext+=p[0];this.match+=p[0];this.matches=p;this.yyleng=this.yytext.length;this._more=false;this._input=this._input.slice(p[0].length);this.matched+=p[0];r=this.performAction.call(this,this.yy,this,s[q],this.conditionStack[this.conditionStack.length-1]);if(r){return r}else{return}}}if(this._input===""){return this.EOF}else{this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}},lex:function g(){var n=this.next();if(typeof n!=="undefined"){return n}else{return this.lex()}},begin:function h(n){this.conditionStack.push(n)},popState:function m(){return this.conditionStack.pop()},_currentRules:function k(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function h(n){this.begin(n)}});j.performAction=function i(r,o,q,n){var p=n;switch(q){case 0:if(o.yytext.slice(-1)!=="\\"){this.begin("mu")}if(o.yytext.slice(-1)==="\\"){o.yytext=o.yytext.substr(0,o.yyleng-1),this.begin("emu")}if(o.yytext){return 14}break;case 1:return 14;break;case 2:this.popState();return 14;break;case 3:return 24;break;case 4:return 16;break;case 5:return 20;break;case 6:return 19;break;case 7:return 19;break;case 8:return 23;break;case 9:return 23;break;case 10:o.yytext=o.yytext.substr(3,o.yyleng-5);this.popState();return 15;break;case 11:return 22;break;case 12:return 34;break;case 13:return 33;break;case 14:return 33;break;case 15:return 36;break;case 16:break;case 17:this.popState();return 18;break;case 18:this.popState();return 18;break;case 19:o.yytext=o.yytext.substr(1,o.yyleng-2).replace(/\\"/g,'"');return 28;break;case 20:return 30;break;case 21:return 30;break;case 22:return 29;break;case 23:return 33;break;case 24:o.yytext=o.yytext.substr(1,o.yyleng-2);return 33;break;case 25:return"INVALID";break;case 26:return 5;break}};j.rules=[/^[^\x00]*?(?=(\{\{))/,/^[^\x00]+/,/^[^\x00]{2,}?(?=(\{\{))/,/^\{\{>/,/^\{\{#/,/^\{\{\//,/^\{\{\^/,/^\{\{\s*else\b/,/^\{\{\{/,/^\{\{&/,/^\{\{![\s\S]*?\}\}/,/^\{\{/,/^=/,/^\.(?=[} ])/,/^\.\./,/^[\/.]/,/^\s+/,/^\}\}\}/,/^\}\}/,/^"(\\["]|[^"])*"/,/^true(?=[}\s])/,/^false(?=[}\s])/,/^[0-9]+(?=[}\s])/,/^[a-zA-Z0-9_$-]+(?=[=}\s\/.])/,/^\[[^\]]*\]/,/^./,/^$/];j.conditions={mu:{rules:[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],inclusive:false},emu:{rules:[2],inclusive:false},INITIAL:{rules:[0,1,26],inclusive:true}};return j})();f.lexer=a;return f})();if(typeof require!=="undefined"&&typeof exports!=="undefined"){exports.parser=handlebars;exports.parse=function(){return handlebars.parse.apply(handlebars,arguments)};exports.main=function commonjsMain(a){if(!a[1]){throw new Error("Usage: "+a[0]+" FILE")}if(typeof process!=="undefined"){var c=require("fs").readFileSync(require("path").join(process.cwd(),a[1]),"utf8")}else{var b=require("file").path(require("file").cwd());var c=b.join(a[1]).read({charset:"utf-8"})}return exports.parser.parse(c)};if(typeof module!=="undefined"&&require.main===module){exports.main(typeof process!=="undefined"?process.argv.slice(1):require("system").args)}}Handlebars.Parser=handlebars;Handlebars.parse=function(a){Handlebars.Parser.yy=Handlebars.AST;return Handlebars.Parser.parse(a)};Handlebars.print=function(a){return new Handlebars.PrintVisitor().accept(a)};Handlebars.logger={DEBUG:0,INFO:1,WARN:2,ERROR:3,level:3,log:function(b,a){}};Handlebars.log=function(b,a){Handlebars.logger.log(b,a)};(function(){Handlebars.AST={};Handlebars.AST.ProgramNode=function(c,b){this.type="program";this.statements=c;if(b){this.inverse=new Handlebars.AST.ProgramNode(b)}};Handlebars.AST.MustacheNode=function(d,c,b){this.type="mustache";this.id=d[0];this.params=d.slice(1);this.hash=c;this.escaped=!b};Handlebars.AST.PartialNode=function(c,b){this.type="partial";this.id=c;this.context=b};var a=function(b,c){if(b.original!==c.original){throw new Handlebars.Exception(b.original+" doesn't match "+c.original)}};Handlebars.AST.BlockNode=function(c,b,d){a(c.id,d);this.type="block";this.mustache=c;this.program=b};Handlebars.AST.InverseNode=function(c,b,d){a(c.id,d);this.type="inverse";this.mustache=c;this.program=b};Handlebars.AST.ContentNode=function(b){this.type="content";this.string=b};Handlebars.AST.HashNode=function(b){this.type="hash";this.pairs=b};Handlebars.AST.IdNode=function(f){this.type="ID";this.original=f.join(".");var d=[],g=0;for(var e=0,b=f.length;e<b;e++){var c=f[e];if(c===".."){g++}else{if(c==="."||c==="this"){this.isScoped=true}else{d.push(c)}}}this.parts=d;this.string=d.join(".");this.depth=g;this.isSimple=(d.length===1)&&(g===0)};Handlebars.AST.StringNode=function(b){this.type="STRING";this.string=b};Handlebars.AST.IntegerNode=function(b){this.type="INTEGER";this.integer=b};Handlebars.AST.BooleanNode=function(b){this.type="BOOLEAN";this.bool=b};Handlebars.AST.CommentNode=function(b){this.type="comment";this.comment=b}})();Handlebars.Exception=function(b){var a=Error.prototype.constructor.apply(this,arguments);for(var c in a){if(a.hasOwnProperty(c)){this[c]=a[c]}}this.message=a.message};Handlebars.Exception.prototype=new Error;Handlebars.SafeString=function(a){this.string=a};Handlebars.SafeString.prototype.toString=function(){return this.string.toString()};(function(){var c={"<":"<",">":">",'"':""","'":"'","`":"`"};var d=/&(?!\w+;)|[<>"'`]/g;var b=/[&<>"'`]/;var a=function(e){return c[e]||"&"};Handlebars.Utils={escapeExpression:function(e){if(e instanceof Handlebars.SafeString){return e.toString()}else{if(e==null||e===false){return""}}if(!b.test(e)){return e}return e.replace(d,a)},isEmpty:function(e){if(typeof e==="undefined"){return true}else{if(e===null){return true}else{if(e===false){return true}else{if(Object.prototype.toString.call(e)==="[object Array]"&&e.length===0){return true}else{return false}}}}}}})();Handlebars.Compiler=function(){};Handlebars.JavaScriptCompiler=function(){};(function(f,e){f.OPCODE_MAP={appendContent:1,getContext:2,lookupWithHelpers:3,lookup:4,append:5,invokeMustache:6,appendEscaped:7,pushString:8,truthyOrFallback:9,functionOrFallback:10,invokeProgram:11,invokePartial:12,push:13,assignToHash:15,pushStringParam:16};f.MULTI_PARAM_OPCODES={appendContent:1,getContext:1,lookupWithHelpers:2,lookup:1,invokeMustache:3,pushString:1,truthyOrFallback:1,functionOrFallback:1,invokeProgram:3,invokePartial:1,push:1,assignToHash:1,pushStringParam:1};f.DISASSEMBLE_MAP={};for(var h in f.OPCODE_MAP){var g=f.OPCODE_MAP[h];f.DISASSEMBLE_MAP[g]=h}f.multiParamSize=function(i){return f.MULTI_PARAM_OPCODES[f.DISASSEMBLE_MAP[i]]};f.prototype={compiler:f,disassemble:function(){var t=this.opcodes,r,n;var q=[],v,m,w;for(var s=0,o=t.length;s<o;s++){r=t[s];if(r==="DECLARE"){m=t[++s];w=t[++s];q.push("DECLARE "+m+" = "+w)}else{v=f.DISASSEMBLE_MAP[r];var u=f.multiParamSize(r);var k=[];for(var p=0;p<u;p++){n=t[++s];if(typeof n==="string"){n='"'+n.replace("\n","\\n")+'"'}k.push(n)}v=v+" "+k.join(" ");q.push(v)}}return q.join("\n")},guid:0,compile:function(i,k){this.children=[];this.depths={list:[]};this.options=k;var l=this.options.knownHelpers;this.options.knownHelpers={helperMissing:true,blockHelperMissing:true,each:true,"if":true,unless:true,"with":true,log:true};if(l){for(var j in l){this.options.knownHelpers[j]=l[j]}}return this.program(i)},accept:function(i){return this[i.type](i)},program:function(m){var k=m.statements,o;this.opcodes=[];for(var n=0,j=k.length;n<j;n++){o=k[n];this[o.type](o)}this.isSimple=j===1;this.depths.list=this.depths.list.sort(function(l,i){return l-i});return this},compileProgram:function(m){var j=new this.compiler().compile(m,this.options);var n=this.guid++;this.usePartial=this.usePartial||j.usePartial;this.children[n]=j;for(var o=0,k=j.depths.list.length;o<k;o++){depth=j.depths.list[o];if(depth<2){continue}else{this.addDepth(depth-1)}}return n},block:function(o){var l=o.mustache;var n,p,j,k;var m=this.setupStackForMustache(l);var i=this.compileProgram(o.program);if(o.program.inverse){k=this.compileProgram(o.program.inverse);this.declare("inverse",k)}this.opcode("invokeProgram",i,m.length,!!l.hash);this.declare("inverse",null);this.opcode("append")},inverse:function(k){var j=this.setupStackForMustache(k.mustache);var i=this.compileProgram(k.program);this.declare("inverse",i);this.opcode("invokeProgram",null,j.length,!!k.mustache.hash);this.declare("inverse",null);this.opcode("append")},hash:function(n){var m=n.pairs,p,o;this.opcode("push","{}");for(var k=0,j=m.length;k<j;k++){p=m[k];o=p[1];this.accept(o);this.opcode("assignToHash",p[0])}},partial:function(i){var j=i.id;this.usePartial=true;if(i.context){this.ID(i.context)}else{this.opcode("push","depth0")}this.opcode("invokePartial",j.original);this.opcode("append")},content:function(i){this.opcode("appendContent",i.string)},mustache:function(i){var j=this.setupStackForMustache(i);this.opcode("invokeMustache",j.length,i.id.original,!!i.hash);if(i.escaped&&!this.options.noEscape){this.opcode("appendEscaped")}else{this.opcode("append")}},ID:function(m){this.addDepth(m.depth);this.opcode("getContext",m.depth);this.opcode("lookupWithHelpers",m.parts[0]||null,m.isScoped||false);for(var k=1,j=m.parts.length;k<j;k++){this.opcode("lookup",m.parts[k])}},STRING:function(i){this.opcode("pushString",i.string)},INTEGER:function(i){this.opcode("push",i.integer)},BOOLEAN:function(i){this.opcode("push",i.bool)},comment:function(){},pushParams:function(l){var j=l.length,k;while(j--){k=l[j];if(this.options.stringParams){if(k.depth){this.addDepth(k.depth)}this.opcode("getContext",k.depth||0);this.opcode("pushStringParam",k.string)}else{this[k.type](k)}}},opcode:function(i,l,k,j){this.opcodes.push(f.OPCODE_MAP[i]);if(l!==undefined){this.opcodes.push(l)}if(k!==undefined){this.opcodes.push(k)}if(j!==undefined){this.opcodes.push(j)}},declare:function(i,j){this.opcodes.push("DECLARE");this.opcodes.push(i);this.opcodes.push(j)},addDepth:function(i){if(i===0){return}if(!this.depths[i]){this.depths[i]=true;this.depths.list.push(i)}},setupStackForMustache:function(i){var j=i.params;this.pushParams(j);if(i.hash){this.hash(i.hash)}this.ID(i.id);return j}};e.prototype={nameLookup:function(k,i,j){if(/^[0-9]+$/.test(i)){return k+"["+i+"]"}else{if(e.isValidJavaScriptVariableName(i)){return k+"."+i}else{return k+"['"+i+"']"}}},appendToBuffer:function(i){if(this.environment.isSimple){return"return "+i+";"}else{return"buffer += "+i+";"}},initializeBuffer:function(){return this.quotedString("")},namespace:"Handlebars",compile:function(i,j,l,k){this.environment=i;this.options=j||{};this.name=this.environment.name;this.isChild=!!l;this.context=l||{programs:[],aliases:{self:"this"},registers:{list:[]}};this.preamble();this.stackSlot=0;this.stackVars=[];this.compileChildren(i,j);var n=i.opcodes,m;this.i=0;for(b=n.length;this.i<b;this.i++){m=this.nextOpcode(0);if(m[0]==="DECLARE"){this.i=this.i+2;this[m[1]]=m[2]}else{this.i=this.i+m[1].length;this[m[0]].apply(this,m[1])}}return this.createFunctionContext(k)},nextOpcode:function(r){var o=this.environment.opcodes,m=o[this.i+r],l,p;var q,i;if(m==="DECLARE"){l=o[this.i+1];p=o[this.i+2];return["DECLARE",l,p]}else{l=f.DISASSEMBLE_MAP[m];q=f.multiParamSize(m);i=[];for(var k=0;k<q;k++){i.push(o[this.i+k+1+r])}return[l,i]}},eat:function(i){this.i=this.i+i.length},preamble:function(){var i=[];this.useRegister("foundHelper");if(!this.isChild){var j=this.namespace;var k="helpers = helpers || "+j+".helpers;";if(this.environment.usePartial){k=k+" partials = partials || "+j+".partials;"}i.push(k)}else{i.push("")}if(!this.environment.isSimple){i.push(", buffer = "+this.initializeBuffer())}else{i.push("")}this.lastContext=0;this.source=i},createFunctionContext:function(p){var q=this.stackVars;if(!this.isChild){q=q.concat(this.context.registers.list)}if(q.length>0){this.source[1]=this.source[1]+", "+q.join(", ")}if(!this.isChild){var k=[];for(var o in this.context.aliases){this.source[1]=this.source[1]+", "+o+"="+this.context.aliases[o]}}if(this.source[1]){this.source[1]="var "+this.source[1].substring(2)+";"}if(!this.isChild){this.source[1]+="\n"+this.context.programs.join("\n")+"\n"}if(!this.environment.isSimple){this.source.push("return buffer;")}var r=this.isChild?["depth0","data"]:["Handlebars","depth0","helpers","partials","data"];for(var n=0,j=this.environment.depths.list.length;n<j;n++){r.push("depth"+this.environment.depths.list[n])}if(p){r.push(this.source.join("\n "));return Function.apply(this,r)}else{var m="function "+(this.name||"")+"("+r.join(",")+") {\n "+this.source.join("\n ")+"}";Handlebars.log(Handlebars.logger.DEBUG,m+"\n\n");return m}},appendContent:function(i){this.source.push(this.appendToBuffer(this.quotedString(i)))},append:function(){var i=this.popStack();this.source.push("if("+i+" || "+i+" === 0) { "+this.appendToBuffer(i)+" }");if(this.environment.isSimple){this.source.push("else { "+this.appendToBuffer("''")+" }")}},appendEscaped:function(){var j=this.nextOpcode(1),i="";this.context.aliases.escapeExpression="this.escapeExpression";if(j[0]==="appendContent"){i=" + "+this.quotedString(j[1][0]);this.eat(j)}this.source.push(this.appendToBuffer("escapeExpression("+this.popStack()+")"+i))},getContext:function(i){if(this.lastContext!==i){this.lastContext=i}},lookupWithHelpers:function(k,l){if(k){var i=this.nextStack();this.usingKnownHelper=false;var j;if(!l&&this.options.knownHelpers[k]){j=i+" = "+this.nameLookup("helpers",k,"helper");this.usingKnownHelper=true}else{if(l||this.options.knownHelpersOnly){j=i+" = "+this.nameLookup("depth"+this.lastContext,k,"context")}else{this.register("foundHelper",this.nameLookup("helpers",k,"helper"));j=i+" = foundHelper || "+this.nameLookup("depth"+this.lastContext,k,"context")}}j+=";";this.source.push(j)}else{this.pushStack("depth"+this.lastContext)}},lookup:function(j){var i=this.topStack();this.source.push(i+" = ("+i+" === null || "+i+" === undefined || "+i+" === false ? "+i+" : "+this.nameLookup(i,j,"context")+");")},pushStringParam:function(i){this.pushStack("depth"+this.lastContext);this.pushString(i)},pushString:function(i){this.pushStack(this.quotedString(i))},push:function(i){this.pushStack(i)},invokeMustache:function(k,j,i){this.populateParams(k,this.quotedString(j),"{}",null,i,function(l,n,m){if(!this.usingKnownHelper){this.context.aliases.helperMissing="helpers.helperMissing";this.context.aliases.undef="void 0";this.source.push("else if("+m+"=== undef) { "+l+" = helperMissing.call("+n+"); }");if(l!==m){this.source.push("else { "+l+" = "+m+"; }")}}})},invokeProgram:function(k,l,j){var i=this.programExpression(this.inverse);var m=this.programExpression(k);this.populateParams(l,null,m,i,j,function(n,p,o){if(!this.usingKnownHelper){this.context.aliases.blockHelperMissing="helpers.blockHelperMissing";this.source.push("else { "+n+" = blockHelperMissing.call("+p+"); }")}})},populateParams:function(p,k,t,q,x,w){var l=x||this.options.stringParams||q||this.options.data;var j=this.popStack(),v;var n=[],m,o,u;if(l){this.register("tmp1",t);u="tmp1"}else{u="{ hash: {} }"}if(l){var s=(x?this.popStack():"{}");this.source.push("tmp1.hash = "+s+";")}if(this.options.stringParams){this.source.push("tmp1.contexts = [];")}for(var r=0;r<p;r++){m=this.popStack();n.push(m);if(this.options.stringParams){this.source.push("tmp1.contexts.push("+this.popStack()+");")}}if(q){this.source.push("tmp1.fn = tmp1;");this.source.push("tmp1.inverse = "+q+";")}if(this.options.data){this.source.push("tmp1.data = data;")}n.push(u);this.populateCall(n,j,k||j,w,t!=="{}")},populateCall:function(n,j,k,q,o){var m=["depth0"].concat(n).join(", ");var i=["depth0"].concat(k).concat(n).join(", ");var p=this.nextStack();if(this.usingKnownHelper){this.source.push(p+" = "+j+".call("+m+");")}else{this.context.aliases.functionType='"function"';var l=o?"foundHelper && ":"";this.source.push("if("+l+"typeof "+j+" === functionType) { "+p+" = "+j+".call("+m+"); }")}q.call(this,p,i,j);this.usingKnownHelper=false},invokePartial:function(i){params=[this.nameLookup("partials",i,"partial"),"'"+i+"'",this.popStack(),"helpers","partials"];if(this.options.data){params.push("data")}this.pushStack("self.invokePartial("+params.join(", ")+");")},assignToHash:function(i){var j=this.popStack();var k=this.topStack();this.source.push(k+"['"+i+"'] = "+j+";")},compiler:e,compileChildren:function(j,n){var p=j.children,r,q;for(var o=0,k=p.length;o<k;o++){r=p[o];q=new this.compiler();this.context.programs.push("");var m=this.context.programs.length;r.index=m;r.name="program"+m;this.context.programs[m]=q.compile(r,n,this.context)}},programExpression:function(k){if(k==null){return"self.noop"}var p=this.environment.children[k],o=p.depths.list;var n=[p.index,p.name,"data"];for(var m=0,j=o.length;m<j;m++){depth=o[m];if(depth===1){n.push("depth0")}else{n.push("depth"+(depth-1))}}if(o.length===0){return"self.program("+n.join(", ")+")"}else{n.shift();return"self.programWithDepth("+n.join(", ")+")"}},register:function(i,j){this.useRegister(i);this.source.push(i+" = "+j+";")},useRegister:function(i){if(!this.context.registers[i]){this.context.registers[i]=true;this.context.registers.list.push(i)}},pushStack:function(i){this.source.push(this.nextStack()+" = "+i+";");return"stack"+this.stackSlot},nextStack:function(){this.stackSlot++;if(this.stackSlot>this.stackVars.length){this.stackVars.push("stack"+this.stackSlot)}return"stack"+this.stackSlot},popStack:function(){return"stack"+this.stackSlot--},topStack:function(){return"stack"+this.stackSlot},quotedString:function(i){return'"'+i.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r")+'"'}};var a=("break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield").split(" ");var d=e.RESERVED_WORDS={};for(var c=0,b=a.length;c<b;c++){d[a[c]]=true}e.isValidJavaScriptVariableName=function(i){if(!e.RESERVED_WORDS[i]&&/^[a-zA-Z_$][0-9a-zA-Z_$]+$/.test(i)){return true}return false}})(Handlebars.Compiler,Handlebars.JavaScriptCompiler);Handlebars.precompile=function(d,c){c=c||{};var b=Handlebars.parse(d);var a=new Handlebars.Compiler().compile(b,c);return new Handlebars.JavaScriptCompiler().compile(a,c)};Handlebars.compile=function(b,a){a=a||{};var d;function c(){var g=Handlebars.parse(b);var f=new Handlebars.Compiler().compile(g,a);var e=new Handlebars.JavaScriptCompiler().compile(f,a,undefined,true);return Handlebars.template(e)}return function(f,e){if(!d){d=c()}return d.call(this,f,e)}};Handlebars.VM={template:function(a){var b={escapeExpression:Handlebars.Utils.escapeExpression,invokePartial:Handlebars.VM.invokePartial,programs:[],program:function(d,e,f){var c=this.programs[d];if(f){return Handlebars.VM.program(e,f)}else{if(c){return c}else{c=this.programs[d]=Handlebars.VM.program(e);return c}}},programWithDepth:Handlebars.VM.programWithDepth,noop:Handlebars.VM.noop};return function(d,c){c=c||{};return a.call(b,Handlebars,d,c.helpers,c.partials,c.data)}},programWithDepth:function(b,d,c){var a=Array.prototype.slice.call(arguments,2);return function(f,e){e=e||{};return b.apply(this,[f,e.data||d].concat(a))}},program:function(a,b){return function(d,c){c=c||{};return a(d,c.data||b)}},noop:function(){return""},invokePartial:function(a,b,d,e,c,f){options={helpers:e,partials:c,data:f};if(a===undefined){throw new Handlebars.Exception("The partial "+b+" could not be found")}else{if(a instanceof Function){return a(d,options)}else{if(!Handlebars.compile){throw new Handlebars.Exception("The partial "+b+" could not be compiled when running in runtime-only mode")}else{c[b]=Handlebars.compile(a);return c[b](d,options)}}}}};Handlebars.template=Handlebars.VM.template;
|
@@ -1,42 +0,0 @@
|
|
1
|
-
jQuery.cookie = function(name, value, options) {
|
2
|
-
if (typeof value != 'undefined') { // name and value given, set cookie
|
3
|
-
options = options || {};
|
4
|
-
if (value === null) {
|
5
|
-
value = '';
|
6
|
-
options.expires = -1;
|
7
|
-
}
|
8
|
-
var expires = '';
|
9
|
-
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
|
10
|
-
var date;
|
11
|
-
if (typeof options.expires == 'number') {
|
12
|
-
date = new Date();
|
13
|
-
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
|
14
|
-
} else {
|
15
|
-
date = options.expires;
|
16
|
-
}
|
17
|
-
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
|
18
|
-
}
|
19
|
-
// CAUTION: Needed to parenthesize options.path and options.domain
|
20
|
-
// in the following expressions, otherwise they evaluate to undefined
|
21
|
-
// in the packed version for some reason...
|
22
|
-
var path = options.path ? '; path=' + (options.path) : '';
|
23
|
-
var domain = options.domain ? '; domain=' + (options.domain) : '';
|
24
|
-
var secure = options.secure ? '; secure' : '';
|
25
|
-
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
|
26
|
-
} else { // only name given, get cookie
|
27
|
-
var cookieValue = null;
|
28
|
-
if (document.cookie && document.cookie != '') {
|
29
|
-
var cookies = document.cookie.split(';');
|
30
|
-
for (var i = 0; i < cookies.length; i++) {
|
31
|
-
var cookie = jQuery.trim(cookies[i]);
|
32
|
-
// Does this cookie string begin with the name we want?
|
33
|
-
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
34
|
-
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
35
|
-
break;
|
36
|
-
}
|
37
|
-
}
|
38
|
-
}
|
39
|
-
return cookieValue;
|
40
|
-
}
|
41
|
-
};
|
42
|
-
|
@@ -1,106 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
* jQuery Hotkeys Plugin
|
3
|
-
* Copyright 2010, John Resig
|
4
|
-
* Dual licensed under the MIT or GPL Version 2 licenses.
|
5
|
-
*
|
6
|
-
* Based upon the plugin by Tzury Bar Yochay:
|
7
|
-
* http://github.com/tzuryby/hotkeys
|
8
|
-
*
|
9
|
-
* Original idea by:
|
10
|
-
* Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
|
11
|
-
*/
|
12
|
-
|
13
|
-
(function(jQuery){
|
14
|
-
|
15
|
-
jQuery.hotkeys = {
|
16
|
-
version: "0.8+",
|
17
|
-
|
18
|
-
specialKeys: {
|
19
|
-
8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
|
20
|
-
20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
|
21
|
-
37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del",
|
22
|
-
96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
|
23
|
-
104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/",
|
24
|
-
112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8",
|
25
|
-
120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 188: ",", 190: ".",
|
26
|
-
191: "/", 224: "meta"
|
27
|
-
},
|
28
|
-
|
29
|
-
shiftNums: {
|
30
|
-
"`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&",
|
31
|
-
"8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<",
|
32
|
-
".": ">", "/": "?", "\\": "|"
|
33
|
-
}
|
34
|
-
};
|
35
|
-
|
36
|
-
function keyHandler( handleObj ) {
|
37
|
-
|
38
|
-
var origHandler = handleObj.handler,
|
39
|
-
//use namespace as keys so it works with event delegation as well
|
40
|
-
//will also allow removing listeners of a specific key combination
|
41
|
-
//and support data objects
|
42
|
-
keys = (handleObj.namespace || "").toLowerCase().split(" ");
|
43
|
-
keys = jQuery.map(keys, function(key) { return key.split("."); });
|
44
|
-
|
45
|
-
//no need to modify handler if no keys specified
|
46
|
-
if (keys.length === 1 && (keys[0] === "" || keys[0] === "autocomplete")) {
|
47
|
-
return;
|
48
|
-
}
|
49
|
-
|
50
|
-
handleObj.handler = function( event ) {
|
51
|
-
// Don't fire in text-accepting inputs that we didn't directly bind to
|
52
|
-
// important to note that $.fn.prop is only available on jquery 1.6+
|
53
|
-
if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
|
54
|
-
event.target.type === "text" || $(event.target).prop('contenteditable') == 'true' )) {
|
55
|
-
return;
|
56
|
-
}
|
57
|
-
|
58
|
-
// Keypress represents characters, not special keys
|
59
|
-
var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
|
60
|
-
character = String.fromCharCode( event.which ).toLowerCase(),
|
61
|
-
key, modif = "", possible = {};
|
62
|
-
|
63
|
-
// check combinations (alt|ctrl|shift+anything)
|
64
|
-
if ( event.altKey && special !== "alt" ) {
|
65
|
-
modif += "alt_";
|
66
|
-
}
|
67
|
-
|
68
|
-
if ( event.ctrlKey && special !== "ctrl" ) {
|
69
|
-
modif += "ctrl_";
|
70
|
-
}
|
71
|
-
|
72
|
-
// TODO: Need to make sure this works consistently across platforms
|
73
|
-
if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
|
74
|
-
modif += "meta_";
|
75
|
-
}
|
76
|
-
|
77
|
-
if ( event.shiftKey && special !== "shift" ) {
|
78
|
-
modif += "shift_";
|
79
|
-
}
|
80
|
-
|
81
|
-
if ( special ) {
|
82
|
-
possible[ modif + special ] = true;
|
83
|
-
|
84
|
-
} else {
|
85
|
-
possible[ modif + character ] = true;
|
86
|
-
possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
|
87
|
-
|
88
|
-
// "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
|
89
|
-
if ( modif === "shift_" ) {
|
90
|
-
possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
|
91
|
-
}
|
92
|
-
}
|
93
|
-
|
94
|
-
for ( var i = 0, l = keys.length; i < l; i++ ) {
|
95
|
-
if ( possible[ keys[i] ] ) {
|
96
|
-
return origHandler.apply( this, arguments );
|
97
|
-
}
|
98
|
-
}
|
99
|
-
};
|
100
|
-
}
|
101
|
-
|
102
|
-
jQuery.each([ "keydown", "keyup", "keypress" ], function() {
|
103
|
-
jQuery.event.special[ this ] = { add: keyHandler };
|
104
|
-
});
|
105
|
-
|
106
|
-
})( jQuery );
|
@@ -1,688 +0,0 @@
|
|
1
|
-
// jquery.pjax.js
|
2
|
-
// copyright chris wanstrath
|
3
|
-
// https://github.com/defunkt/jquery-pjax
|
4
|
-
|
5
|
-
(function($){
|
6
|
-
|
7
|
-
// When called on a link, fetches the href with ajax into the
|
8
|
-
// container specified as the first parameter or with the data-pjax
|
9
|
-
// attribute on the link itself.
|
10
|
-
//
|
11
|
-
// Tries to make sure the back button and ctrl+click work the way
|
12
|
-
// you'd expect.
|
13
|
-
//
|
14
|
-
// Accepts a jQuery ajax options object that may include these
|
15
|
-
// pjax specific options:
|
16
|
-
//
|
17
|
-
// container - Where to stick the response body. Usually a String selector.
|
18
|
-
// $(container).html(xhr.responseBody)
|
19
|
-
// push - Whether to pushState the URL. Defaults to true (of course).
|
20
|
-
// replace - Want to use replaceState instead? That's cool.
|
21
|
-
//
|
22
|
-
// For convenience the first parameter can be either the container or
|
23
|
-
// the options object.
|
24
|
-
//
|
25
|
-
// Returns the jQuery object
|
26
|
-
$.fn.pjax = function( container, options ) {
|
27
|
-
return this.live('click.pjax', function(event){
|
28
|
-
handleClick(event, container, options)
|
29
|
-
})
|
30
|
-
}
|
31
|
-
|
32
|
-
// Public: pjax on click handler
|
33
|
-
//
|
34
|
-
// Exported as $.pjax.click.
|
35
|
-
//
|
36
|
-
// event - "click" jQuery.Event
|
37
|
-
// options - pjax options
|
38
|
-
//
|
39
|
-
// Examples
|
40
|
-
//
|
41
|
-
// $('a').live('click', $.pjax.click)
|
42
|
-
// // is the same as
|
43
|
-
// $('a').pjax()
|
44
|
-
//
|
45
|
-
// $(document).on('click', 'a', function(event) {
|
46
|
-
// var container = $(this).closest('[data-pjax-container]')
|
47
|
-
// return $.pjax.click(event, container)
|
48
|
-
// })
|
49
|
-
//
|
50
|
-
// Returns false if pjax runs, otherwise nothing.
|
51
|
-
function handleClick(event, container, options) {
|
52
|
-
options = optionsFor(container, options)
|
53
|
-
|
54
|
-
var link = event.currentTarget
|
55
|
-
|
56
|
-
if (link.tagName.toUpperCase() !== 'A')
|
57
|
-
throw "$.fn.pjax or $.pjax.click requires an anchor element"
|
58
|
-
|
59
|
-
// Middle click, cmd click, and ctrl click should open
|
60
|
-
// links in a new tab as normal.
|
61
|
-
if ( event.which > 1 || event.metaKey || event.ctrlKey )
|
62
|
-
return
|
63
|
-
|
64
|
-
// Ignore cross origin links
|
65
|
-
if ( location.protocol !== link.protocol || location.host !== link.host )
|
66
|
-
return
|
67
|
-
|
68
|
-
// Ignore anchors on the same page
|
69
|
-
if ( link.hash && link.href.replace(link.hash, '') ===
|
70
|
-
location.href.replace(location.hash, '') )
|
71
|
-
return
|
72
|
-
|
73
|
-
var defaults = {
|
74
|
-
url: link.href,
|
75
|
-
container: $(link).attr('data-pjax'),
|
76
|
-
target: link,
|
77
|
-
clickedElement: $(link), // DEPRECATED: use target
|
78
|
-
fragment: null
|
79
|
-
}
|
80
|
-
|
81
|
-
$.pjax($.extend({}, defaults, options))
|
82
|
-
|
83
|
-
event.preventDefault()
|
84
|
-
}
|
85
|
-
|
86
|
-
|
87
|
-
// Loads a URL with ajax, puts the response body inside a container,
|
88
|
-
// then pushState()'s the loaded URL.
|
89
|
-
//
|
90
|
-
// Works just like $.ajax in that it accepts a jQuery ajax
|
91
|
-
// settings object (with keys like url, type, data, etc).
|
92
|
-
//
|
93
|
-
// Accepts these extra keys:
|
94
|
-
//
|
95
|
-
// container - Where to stick the response body.
|
96
|
-
// $(container).html(xhr.responseBody)
|
97
|
-
// push - Whether to pushState the URL. Defaults to true (of course).
|
98
|
-
// replace - Want to use replaceState instead? That's cool.
|
99
|
-
//
|
100
|
-
// Use it just like $.ajax:
|
101
|
-
//
|
102
|
-
// var xhr = $.pjax({ url: this.href, container: '#main' })
|
103
|
-
// console.log( xhr.readyState )
|
104
|
-
//
|
105
|
-
// Returns whatever $.ajax returns.
|
106
|
-
var pjax = $.pjax = function( options ) {
|
107
|
-
options = $.extend(true, {}, $.ajaxSettings, pjax.defaults, options)
|
108
|
-
|
109
|
-
if ($.isFunction(options.url)) {
|
110
|
-
options.url = options.url()
|
111
|
-
}
|
112
|
-
|
113
|
-
var target = options.target
|
114
|
-
|
115
|
-
// DEPRECATED: use options.target
|
116
|
-
if (!target && options.clickedElement) target = options.clickedElement[0]
|
117
|
-
|
118
|
-
var hash = parseURL(options.url).hash
|
119
|
-
|
120
|
-
// DEPRECATED: Save references to original event callbacks. However,
|
121
|
-
// listening for custom pjax:* events is prefered.
|
122
|
-
var oldBeforeSend = options.beforeSend,
|
123
|
-
oldComplete = options.complete,
|
124
|
-
oldSuccess = options.success,
|
125
|
-
oldError = options.error
|
126
|
-
|
127
|
-
var context = options.context = findContainerFor(options.container)
|
128
|
-
|
129
|
-
// We want the browser to maintain two separate internal caches: one
|
130
|
-
// for pjax'd partial page loads and one for normal page loads.
|
131
|
-
// Without adding this secret parameter, some browsers will often
|
132
|
-
// confuse the two.
|
133
|
-
if (!options.data) options.data = {}
|
134
|
-
options.data._pjax = context.selector
|
135
|
-
|
136
|
-
function fire(type, args) {
|
137
|
-
var event = $.Event(type, { relatedTarget: target })
|
138
|
-
context.trigger(event, args)
|
139
|
-
return !event.isDefaultPrevented()
|
140
|
-
}
|
141
|
-
|
142
|
-
var timeoutTimer
|
143
|
-
|
144
|
-
options.beforeSend = function(xhr, settings) {
|
145
|
-
if (settings.timeout > 0) {
|
146
|
-
timeoutTimer = setTimeout(function() {
|
147
|
-
if (fire('pjax:timeout', [xhr, options]))
|
148
|
-
xhr.abort('timeout')
|
149
|
-
}, settings.timeout)
|
150
|
-
|
151
|
-
// Clear timeout setting so jquerys internal timeout isn't invoked
|
152
|
-
settings.timeout = 0
|
153
|
-
}
|
154
|
-
|
155
|
-
xhr.setRequestHeader('X-PJAX', 'true')
|
156
|
-
xhr.setRequestHeader('X-PJAX-Container', context.selector)
|
157
|
-
|
158
|
-
var result
|
159
|
-
|
160
|
-
// DEPRECATED: Invoke original `beforeSend` handler
|
161
|
-
if (oldBeforeSend) {
|
162
|
-
result = oldBeforeSend.apply(this, arguments)
|
163
|
-
if (result === false) return false
|
164
|
-
}
|
165
|
-
|
166
|
-
if (!fire('pjax:beforeSend', [xhr, settings]))
|
167
|
-
return false
|
168
|
-
|
169
|
-
options.requestUrl = parseURL(settings.url).href
|
170
|
-
}
|
171
|
-
|
172
|
-
options.complete = function(xhr, textStatus) {
|
173
|
-
if (timeoutTimer)
|
174
|
-
clearTimeout(timeoutTimer)
|
175
|
-
|
176
|
-
// DEPRECATED: Invoke original `complete` handler
|
177
|
-
if (oldComplete) oldComplete.apply(this, arguments)
|
178
|
-
|
179
|
-
fire('pjax:complete', [xhr, textStatus, options])
|
180
|
-
|
181
|
-
fire('pjax:end', [xhr, options])
|
182
|
-
// end.pjax is deprecated
|
183
|
-
fire('end.pjax', [xhr, options])
|
184
|
-
}
|
185
|
-
|
186
|
-
options.error = function(xhr, textStatus, errorThrown) {
|
187
|
-
var container = extractContainer("", xhr, options)
|
188
|
-
|
189
|
-
// DEPRECATED: Invoke original `error` handler
|
190
|
-
if (oldError) oldError.apply(this, arguments)
|
191
|
-
|
192
|
-
var allowed = fire('pjax:error', [xhr, textStatus, errorThrown, options])
|
193
|
-
if (textStatus !== 'abort' && allowed)
|
194
|
-
window.location = container.url
|
195
|
-
}
|
196
|
-
|
197
|
-
options.success = function(data, status, xhr) {
|
198
|
-
var container = extractContainer(data, xhr, options)
|
199
|
-
|
200
|
-
if (!container.contents) {
|
201
|
-
window.location = container.url
|
202
|
-
return
|
203
|
-
}
|
204
|
-
|
205
|
-
pjax.state = {
|
206
|
-
id: options.id || uniqueId(),
|
207
|
-
url: container.url,
|
208
|
-
title: container.title,
|
209
|
-
container: context.selector,
|
210
|
-
fragment: options.fragment,
|
211
|
-
timeout: options.timeout
|
212
|
-
}
|
213
|
-
|
214
|
-
if (options.push || options.replace) {
|
215
|
-
window.history.replaceState(pjax.state, container.title, container.url)
|
216
|
-
}
|
217
|
-
|
218
|
-
if (container.title) document.title = container.title
|
219
|
-
context.html(container.contents)
|
220
|
-
|
221
|
-
// Scroll to top by default
|
222
|
-
if (typeof options.scrollTo === 'number')
|
223
|
-
$(window).scrollTop(options.scrollTo)
|
224
|
-
|
225
|
-
// Google Analytics support
|
226
|
-
if ( (options.replace || options.push) && window._gaq )
|
227
|
-
_gaq.push(['_trackPageview'])
|
228
|
-
|
229
|
-
// If the URL has a hash in it, make sure the browser
|
230
|
-
// knows to navigate to the hash.
|
231
|
-
if ( hash !== '' ) {
|
232
|
-
window.location.href = hash
|
233
|
-
}
|
234
|
-
|
235
|
-
// DEPRECATED: Invoke original `success` handler
|
236
|
-
if (oldSuccess) oldSuccess.apply(this, arguments)
|
237
|
-
|
238
|
-
fire('pjax:success', [data, status, xhr, options])
|
239
|
-
}
|
240
|
-
|
241
|
-
|
242
|
-
// Initialize pjax.state for the initial page load. Assume we're
|
243
|
-
// using the container and options of the link we're loading for the
|
244
|
-
// back button to the initial page. This ensures good back button
|
245
|
-
// behavior.
|
246
|
-
if (!pjax.state) {
|
247
|
-
pjax.state = {
|
248
|
-
id: uniqueId(),
|
249
|
-
url: window.location.href,
|
250
|
-
title: document.title,
|
251
|
-
container: context.selector,
|
252
|
-
fragment: options.fragment,
|
253
|
-
timeout: options.timeout
|
254
|
-
}
|
255
|
-
window.history.replaceState(pjax.state, document.title)
|
256
|
-
}
|
257
|
-
|
258
|
-
// Cancel the current request if we're already pjaxing
|
259
|
-
var xhr = pjax.xhr
|
260
|
-
if ( xhr && xhr.readyState < 4) {
|
261
|
-
xhr.onreadystatechange = $.noop
|
262
|
-
xhr.abort()
|
263
|
-
}
|
264
|
-
|
265
|
-
pjax.options = options
|
266
|
-
var xhr = pjax.xhr = $.ajax(options)
|
267
|
-
|
268
|
-
if (xhr.readyState > 0) {
|
269
|
-
// pjax event is deprecated
|
270
|
-
$(document).trigger('pjax', [xhr, options])
|
271
|
-
|
272
|
-
if (options.push && !options.replace) {
|
273
|
-
// Cache current container element before replacing it
|
274
|
-
containerCache.push(pjax.state.id, context.clone(true, true).contents())
|
275
|
-
|
276
|
-
window.history.pushState(null, "", options.url)
|
277
|
-
}
|
278
|
-
|
279
|
-
fire('pjax:start', [xhr, options])
|
280
|
-
// start.pjax is deprecated
|
281
|
-
fire('start.pjax', [xhr, options])
|
282
|
-
|
283
|
-
fire('pjax:send', [xhr, options])
|
284
|
-
}
|
285
|
-
|
286
|
-
return pjax.xhr
|
287
|
-
}
|
288
|
-
|
289
|
-
|
290
|
-
// Internal: Generate unique id for state object.
|
291
|
-
//
|
292
|
-
// Use a timestamp instead of a counter since ids should still be
|
293
|
-
// unique across page loads.
|
294
|
-
//
|
295
|
-
// Returns Number.
|
296
|
-
function uniqueId() {
|
297
|
-
return (new Date).getTime()
|
298
|
-
}
|
299
|
-
|
300
|
-
// Internal: Strips _pjax param from url
|
301
|
-
//
|
302
|
-
// url - String
|
303
|
-
//
|
304
|
-
// Returns String.
|
305
|
-
function stripPjaxParam(url) {
|
306
|
-
return url
|
307
|
-
.replace(/\?_pjax=[^&]+&?/, '?')
|
308
|
-
.replace(/_pjax=[^&]+&?/, '')
|
309
|
-
.replace(/[\?&]$/, '')
|
310
|
-
}
|
311
|
-
|
312
|
-
// Internal: Parse URL components and returns a Locationish object.
|
313
|
-
//
|
314
|
-
// url - String URL
|
315
|
-
//
|
316
|
-
// Returns HTMLAnchorElement that acts like Location.
|
317
|
-
function parseURL(url) {
|
318
|
-
var a = document.createElement('a')
|
319
|
-
a.href = url
|
320
|
-
return a
|
321
|
-
}
|
322
|
-
|
323
|
-
// Internal: Build options Object for arguments.
|
324
|
-
//
|
325
|
-
// For convenience the first parameter can be either the container or
|
326
|
-
// the options object.
|
327
|
-
//
|
328
|
-
// Examples
|
329
|
-
//
|
330
|
-
// optionsFor('#container')
|
331
|
-
// // => {container: '#container'}
|
332
|
-
//
|
333
|
-
// optionsFor('#container', {push: true})
|
334
|
-
// // => {container: '#container', push: true}
|
335
|
-
//
|
336
|
-
// optionsFor({container: '#container', push: true})
|
337
|
-
// // => {container: '#container', push: true}
|
338
|
-
//
|
339
|
-
// Returns options Object.
|
340
|
-
function optionsFor(container, options) {
|
341
|
-
// Both container and options
|
342
|
-
if ( container && options )
|
343
|
-
options.container = container
|
344
|
-
|
345
|
-
// First argument is options Object
|
346
|
-
else if ( $.isPlainObject(container) )
|
347
|
-
options = container
|
348
|
-
|
349
|
-
// Only container
|
350
|
-
else
|
351
|
-
options = {container: container}
|
352
|
-
|
353
|
-
// Find and validate container
|
354
|
-
if (options.container)
|
355
|
-
options.container = findContainerFor(options.container)
|
356
|
-
|
357
|
-
return options
|
358
|
-
}
|
359
|
-
|
360
|
-
// Internal: Find container element for a variety of inputs.
|
361
|
-
//
|
362
|
-
// Because we can't persist elements using the history API, we must be
|
363
|
-
// able to find a String selector that will consistently find the Element.
|
364
|
-
//
|
365
|
-
// container - A selector String, jQuery object, or DOM Element.
|
366
|
-
//
|
367
|
-
// Returns a jQuery object whose context is `document` and has a selector.
|
368
|
-
function findContainerFor(container) {
|
369
|
-
container = $(container)
|
370
|
-
|
371
|
-
if ( !container.length ) {
|
372
|
-
throw "no pjax container for " + container.selector
|
373
|
-
} else if ( container.selector !== '' && container.context === document ) {
|
374
|
-
return container
|
375
|
-
} else if ( container.attr('id') ) {
|
376
|
-
return $('#' + container.attr('id'))
|
377
|
-
} else {
|
378
|
-
throw "cant get selector for pjax container!"
|
379
|
-
}
|
380
|
-
}
|
381
|
-
|
382
|
-
// Internal: Filter and find all elements matching the selector.
|
383
|
-
//
|
384
|
-
// Where $.fn.find only matches descendants, findAll will test all the
|
385
|
-
// top level elements in the jQuery object as well.
|
386
|
-
//
|
387
|
-
// elems - jQuery object of Elements
|
388
|
-
// selector - String selector to match
|
389
|
-
//
|
390
|
-
// Returns a jQuery object.
|
391
|
-
function findAll(elems, selector) {
|
392
|
-
var results = $()
|
393
|
-
elems.each(function() {
|
394
|
-
if ($(this).is(selector))
|
395
|
-
results = results.add(this)
|
396
|
-
results = results.add(selector, this)
|
397
|
-
})
|
398
|
-
return results
|
399
|
-
}
|
400
|
-
|
401
|
-
// Internal: Extracts container and metadata from response.
|
402
|
-
//
|
403
|
-
// 1. Extracts X-PJAX-URL header if set
|
404
|
-
// 2. Extracts inline <title> tags
|
405
|
-
// 3. Builds response Element and extracts fragment if set
|
406
|
-
//
|
407
|
-
// data - String response data
|
408
|
-
// xhr - XHR response
|
409
|
-
// options - pjax options Object
|
410
|
-
//
|
411
|
-
// Returns an Object with url, title, and contents keys.
|
412
|
-
function extractContainer(data, xhr, options) {
|
413
|
-
var obj = {}
|
414
|
-
|
415
|
-
// Prefer X-PJAX-URL header if it was set, otherwise fallback to
|
416
|
-
// using the original requested url.
|
417
|
-
obj.url = stripPjaxParam(xhr.getResponseHeader('X-PJAX-URL') || options.requestUrl)
|
418
|
-
|
419
|
-
// Attempt to parse response html into elements
|
420
|
-
var $data = $(data)
|
421
|
-
|
422
|
-
// If response data is empty, return fast
|
423
|
-
if ($data.length === 0)
|
424
|
-
return obj
|
425
|
-
|
426
|
-
// If there's a <title> tag in the response, use it as
|
427
|
-
// the page's title.
|
428
|
-
obj.title = findAll($data, 'title').last().text()
|
429
|
-
|
430
|
-
if (options.fragment) {
|
431
|
-
// If they specified a fragment, look for it in the response
|
432
|
-
// and pull it out.
|
433
|
-
var $fragment = findAll($data, options.fragment).first()
|
434
|
-
|
435
|
-
if ($fragment.length) {
|
436
|
-
obj.contents = $fragment.contents()
|
437
|
-
|
438
|
-
// If there's no title, look for data-title and title attributes
|
439
|
-
// on the fragment
|
440
|
-
if (!obj.title)
|
441
|
-
obj.title = $fragment.attr('title') || $fragment.data('title')
|
442
|
-
}
|
443
|
-
|
444
|
-
} else if (!/<html/i.test(data)) {
|
445
|
-
obj.contents = $data
|
446
|
-
}
|
447
|
-
|
448
|
-
// Clean up any <title> tags
|
449
|
-
if (obj.contents) {
|
450
|
-
// Remove any parent title elements
|
451
|
-
obj.contents = obj.contents.not('title')
|
452
|
-
|
453
|
-
// Then scrub any titles from their descendents
|
454
|
-
obj.contents.find('title').remove()
|
455
|
-
}
|
456
|
-
|
457
|
-
// Trim any whitespace off the title
|
458
|
-
if (obj.title) obj.title = $.trim(obj.title)
|
459
|
-
|
460
|
-
return obj
|
461
|
-
}
|
462
|
-
|
463
|
-
// Public: Reload current page with pjax.
|
464
|
-
//
|
465
|
-
// Returns whatever $.pjax returns.
|
466
|
-
pjax.reload = function(container, options) {
|
467
|
-
var defaults = {
|
468
|
-
url: window.location.href,
|
469
|
-
push: false,
|
470
|
-
replace: true,
|
471
|
-
scrollTo: false
|
472
|
-
}
|
473
|
-
|
474
|
-
return $.pjax($.extend(defaults, optionsFor(container, options)))
|
475
|
-
}
|
476
|
-
|
477
|
-
|
478
|
-
pjax.defaults = {
|
479
|
-
timeout: 650,
|
480
|
-
push: true,
|
481
|
-
replace: false,
|
482
|
-
type: 'GET',
|
483
|
-
dataType: 'html',
|
484
|
-
scrollTo: 0,
|
485
|
-
maxCacheLength: 20
|
486
|
-
}
|
487
|
-
|
488
|
-
// Internal: History DOM caching class.
|
489
|
-
function Cache() {
|
490
|
-
this.mapping = {}
|
491
|
-
this.forwardStack = []
|
492
|
-
this.backStack = []
|
493
|
-
}
|
494
|
-
// Push previous state id and container contents into the history
|
495
|
-
// cache. Should be called in conjunction with `pushState` to save the
|
496
|
-
// previous container contents.
|
497
|
-
//
|
498
|
-
// id - State ID Number
|
499
|
-
// value - DOM Element to cache
|
500
|
-
//
|
501
|
-
// Returns nothing.
|
502
|
-
Cache.prototype.push = function(id, value) {
|
503
|
-
this.mapping[id] = value
|
504
|
-
this.backStack.push(id)
|
505
|
-
|
506
|
-
// Remove all entires in forward history stack after pushing
|
507
|
-
// a new page.
|
508
|
-
while (this.forwardStack.length)
|
509
|
-
delete this.mapping[this.forwardStack.shift()]
|
510
|
-
|
511
|
-
// Trim back history stack to max cache length.
|
512
|
-
while (this.backStack.length > pjax.defaults.maxCacheLength)
|
513
|
-
delete this.mapping[this.backStack.shift()]
|
514
|
-
}
|
515
|
-
// Retrieve cached DOM Element for state id.
|
516
|
-
//
|
517
|
-
// id - State ID Number
|
518
|
-
//
|
519
|
-
// Returns DOM Element(s) or undefined if cache miss.
|
520
|
-
Cache.prototype.get = function(id) {
|
521
|
-
return this.mapping[id]
|
522
|
-
}
|
523
|
-
// Shifts cache from forward history cache to back stack. Should be
|
524
|
-
// called on `popstate` with the previous state id and container
|
525
|
-
// contents.
|
526
|
-
//
|
527
|
-
// id - State ID Number
|
528
|
-
// value - DOM Element to cache
|
529
|
-
//
|
530
|
-
// Returns nothing.
|
531
|
-
Cache.prototype.forward = function(id, value) {
|
532
|
-
this.mapping[id] = value
|
533
|
-
this.backStack.push(id)
|
534
|
-
|
535
|
-
if (id = this.forwardStack.pop())
|
536
|
-
delete this.mapping[id]
|
537
|
-
}
|
538
|
-
// Shifts cache from back history cache to forward stack. Should be
|
539
|
-
// called on `popstate` with the previous state id and container
|
540
|
-
// contents.
|
541
|
-
//
|
542
|
-
// id - State ID Number
|
543
|
-
// value - DOM Element to cache
|
544
|
-
//
|
545
|
-
// Returns nothing.
|
546
|
-
Cache.prototype.back = function(id, value) {
|
547
|
-
this.mapping[id] = value
|
548
|
-
this.forwardStack.push(id)
|
549
|
-
|
550
|
-
if (id = this.backStack.pop())
|
551
|
-
delete this.mapping[id]
|
552
|
-
}
|
553
|
-
|
554
|
-
var containerCache = new Cache
|
555
|
-
|
556
|
-
|
557
|
-
// Export $.pjax.click
|
558
|
-
pjax.click = handleClick
|
559
|
-
|
560
|
-
|
561
|
-
// Used to detect initial (useless) popstate.
|
562
|
-
// If history.state exists, assume browser isn't going to fire initial popstate.
|
563
|
-
var popped = ('state' in window.history), initialURL = location.href
|
564
|
-
|
565
|
-
|
566
|
-
// popstate handler takes care of the back and forward buttons
|
567
|
-
//
|
568
|
-
// You probably shouldn't use pjax on pages with other pushState
|
569
|
-
// stuff yet.
|
570
|
-
$(window).bind('popstate', function(event){
|
571
|
-
// Ignore inital popstate that some browsers fire on page load
|
572
|
-
var initialPop = !popped && location.href == initialURL
|
573
|
-
popped = true
|
574
|
-
if ( initialPop ) return
|
575
|
-
|
576
|
-
var state = event.state
|
577
|
-
|
578
|
-
if (state && state.container) {
|
579
|
-
var container = $(state.container)
|
580
|
-
if (container.length) {
|
581
|
-
var contents = containerCache.get(state.id)
|
582
|
-
|
583
|
-
if (pjax.state) {
|
584
|
-
// Since state ids always increase, we can deduce the history
|
585
|
-
// direction from the previous state.
|
586
|
-
var direction = pjax.state.id < state.id ? 'forward' : 'back'
|
587
|
-
|
588
|
-
// Cache current container before replacement and inform the
|
589
|
-
// cache which direction the history shifted.
|
590
|
-
containerCache[direction](pjax.state.id, container.clone(true, true).contents())
|
591
|
-
}
|
592
|
-
|
593
|
-
var popstateEvent = $.Event('pjax:popstate', {
|
594
|
-
state: state,
|
595
|
-
direction: direction
|
596
|
-
})
|
597
|
-
container.trigger(popstateEvent)
|
598
|
-
|
599
|
-
var options = {
|
600
|
-
id: state.id,
|
601
|
-
url: state.url,
|
602
|
-
container: container,
|
603
|
-
push: false,
|
604
|
-
fragment: state.fragment,
|
605
|
-
timeout: state.timeout,
|
606
|
-
scrollTo: false
|
607
|
-
}
|
608
|
-
|
609
|
-
if (contents) {
|
610
|
-
// pjax event is deprecated
|
611
|
-
$(document).trigger('pjax', [null, options])
|
612
|
-
container.trigger('pjax:start', [null, options])
|
613
|
-
// end.pjax event is deprecated
|
614
|
-
container.trigger('start.pjax', [null, options])
|
615
|
-
|
616
|
-
if (state.title) document.title = state.title
|
617
|
-
container.html(contents)
|
618
|
-
pjax.state = state
|
619
|
-
|
620
|
-
container.trigger('pjax:end', [null, options])
|
621
|
-
// end.pjax event is deprecated
|
622
|
-
container.trigger('end.pjax', [null, options])
|
623
|
-
} else {
|
624
|
-
$.pjax(options)
|
625
|
-
}
|
626
|
-
|
627
|
-
// Force reflow/relayout before the browser tries to restore the
|
628
|
-
// scroll position.
|
629
|
-
container[0].offsetHeight
|
630
|
-
} else {
|
631
|
-
window.location = location.href
|
632
|
-
}
|
633
|
-
}
|
634
|
-
})
|
635
|
-
|
636
|
-
|
637
|
-
// Add the state property to jQuery's event object so we can use it in
|
638
|
-
// $(window).bind('popstate')
|
639
|
-
if ( $.inArray('state', $.event.props) < 0 )
|
640
|
-
$.event.props.push('state')
|
641
|
-
|
642
|
-
|
643
|
-
// Is pjax supported by this browser?
|
644
|
-
$.support.pjax =
|
645
|
-
window.history && window.history.pushState && window.history.replaceState
|
646
|
-
// pushState isn't reliable on iOS until 5.
|
647
|
-
&& !navigator.userAgent.match(/((iPod|iPhone|iPad).+\bOS\s+[1-4]|WebApps\/.+CFNetwork)/)
|
648
|
-
|
649
|
-
// Fall back to normalcy for older browsers.
|
650
|
-
if ( !$.support.pjax ) {
|
651
|
-
$.pjax = function( options ) {
|
652
|
-
var url = $.isFunction(options.url) ? options.url() : options.url,
|
653
|
-
method = options.type ? options.type.toUpperCase() : 'GET'
|
654
|
-
|
655
|
-
var form = $('<form>', {
|
656
|
-
method: method === 'GET' ? 'GET' : 'POST',
|
657
|
-
action: url,
|
658
|
-
style: 'display:none'
|
659
|
-
})
|
660
|
-
|
661
|
-
if (method !== 'GET' && method !== 'POST') {
|
662
|
-
form.append($('<input>', {
|
663
|
-
type: 'hidden',
|
664
|
-
name: '_method',
|
665
|
-
value: method.toLowerCase()
|
666
|
-
}))
|
667
|
-
}
|
668
|
-
|
669
|
-
var data = options.data
|
670
|
-
if (typeof data === 'string') {
|
671
|
-
$.each(data.split('&'), function(index, value) {
|
672
|
-
var pair = value.split('=')
|
673
|
-
form.append($('<input>', {type: 'hidden', name: pair[0], value: pair[1]}))
|
674
|
-
})
|
675
|
-
} else if (typeof data === 'object') {
|
676
|
-
for (key in data)
|
677
|
-
form.append($('<input>', {type: 'hidden', name: key, value: data[key]}))
|
678
|
-
}
|
679
|
-
|
680
|
-
$(document.body).append(form)
|
681
|
-
form.submit()
|
682
|
-
}
|
683
|
-
$.pjax.click = $.noop
|
684
|
-
$.pjax.reload = window.location.reload
|
685
|
-
$.fn.pjax = function() { return this }
|
686
|
-
}
|
687
|
-
|
688
|
-
})(jQuery);
|