skylinecms 3.0.8 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +131 -10
- data/README.md +1 -2
- data/Rakefile +3 -3
- data/app/controllers/skyline/application_controller.rb +40 -4
- data/app/controllers/skyline/articles_controller.rb +4 -4
- data/app/controllers/skyline/browser/tabs/media_library/media_files_controller.rb +1 -1
- data/app/controllers/skyline/content_controller.rb +4 -3
- data/app/controllers/skyline/{media_files_data_controller.rb → media/data_controller.rb} +61 -59
- data/app/controllers/skyline/media/dirs_controller.rb +83 -0
- data/app/controllers/skyline/media/files_controller.rb +80 -0
- data/app/controllers/skyline/sections_controller.rb +10 -3
- data/app/controllers/skyline/settings_controller.rb +4 -2
- data/app/controllers/skyline/user_preferences_controller.rb +18 -0
- data/app/controllers/skyline/users_controller.rb +1 -1
- data/app/controllers/skyline/variant_current_editor_controller.rb +2 -0
- data/app/helpers/skyline/application_helper.rb +39 -35
- data/app/helpers/skyline/dialog_helper.rb +11 -10
- data/app/helpers/skyline/editors/boolean.rb +2 -2
- data/app/helpers/skyline/editors/page_browser.rb +2 -0
- data/app/helpers/skyline/editors/wysiwyg.rb +1 -1
- data/app/helpers/skyline/js_layout_helper.rb +19 -0
- data/app/helpers/skyline/media/dirs_helper.rb +2 -0
- data/app/helpers/skyline/media/files_helper.rb +6 -0
- data/app/helpers/skyline/media_files_helper.rb +2 -2
- data/app/helpers/skyline/menu_helper.rb +33 -0
- data/app/helpers/skyline/message_generator.rb +5 -1
- data/app/helpers/skyline/notification_generator.rb +6 -0
- data/app/helpers/skyline/plugin_helper.rb +21 -0
- data/app/helpers/skyline/presenters/presenter.rb +4 -13
- data/app/helpers/skyline/presenters/table.rb +0 -27
- data/app/helpers/skyline/ref_object_helper.rb +2 -2
- data/app/helpers/skyline/tree_helper.rb +74 -5
- data/app/models/skyline/article.rb +18 -6
- data/app/models/skyline/article_version.rb +1 -1
- data/app/models/skyline/image_ref.rb +9 -5
- data/app/models/skyline/inline_ref.rb +3 -2
- data/app/models/skyline/link_section_link.rb +2 -2
- data/app/models/skyline/media_file.rb +33 -10
- data/app/models/skyline/page.rb +10 -9
- data/app/models/skyline/section.rb +1 -1
- data/app/models/skyline/sections/content_collection_section.rb +1 -1
- data/app/models/skyline/sections/content_item_section.rb +1 -1
- data/app/models/skyline/sections/heading_section.rb +1 -1
- data/app/models/skyline/sections/iframe_section.rb +2 -2
- data/app/models/skyline/sections/link_section.rb +1 -1
- data/app/models/skyline/sections/media_section.rb +32 -5
- data/app/models/skyline/sections/page_fragment_section.rb +1 -1
- data/app/models/skyline/sections/raw_section.rb +1 -1
- data/app/models/skyline/sections/redirect_section.rb +4 -4
- data/app/models/skyline/sections/rss_section.rb +7 -2
- data/app/models/skyline/sections/splitter_section.rb +1 -1
- data/app/models/skyline/sections/wysiwyg_section.rb +3 -3
- data/app/models/skyline/site.rb +1 -1
- data/app/models/skyline/user.rb +1 -1
- data/app/models/skyline/user_preference.rb +69 -0
- data/app/models/skyline/variant.rb +1 -1
- data/app/templates/skyline/sections/content_item_section/default/index.html.erb +1 -1
- data/app/templates/skyline/sections/media_section/default/index.html.erb +9 -9
- data/app/views/skyline/articles/_list.html.erb +34 -0
- data/app/views/skyline/articles/edit.html.erb +13 -6
- data/app/views/skyline/articles/index.html.erb +12 -43
- data/app/views/skyline/articles/page/_index.html.erb +13 -11
- data/app/views/skyline/authentications/new.html.erb +2 -2
- data/app/views/skyline/browser/links/_index.html.erb +4 -2
- data/app/views/skyline/browser/tabs/media_library/_index.html.erb +12 -13
- data/app/views/skyline/browser/tabs/media_library/media_files/_index.html.erb +122 -51
- data/app/views/skyline/browser/tabs/media_library/media_files/_show.html.erb +7 -7
- data/app/views/skyline/content/list.rhtml +1 -3
- data/app/views/skyline/content/presenters/_table.html.erb +45 -0
- data/app/views/skyline/layouts/content.html.erb +1 -1
- data/app/views/skyline/layouts/media.html.erb +2 -1
- data/app/views/skyline/layouts/pages.html.erb +10 -0
- data/app/views/skyline/link_section_links/_form.html.erb +0 -1
- data/app/views/skyline/locales/show.js.erb +2 -2
- data/app/views/skyline/media/dirs/_edit.html.erb +42 -0
- data/app/views/skyline/media/dirs/_index.html.erb +14 -0
- data/app/views/skyline/media/dirs/_show.html.erb +34 -0
- data/app/views/skyline/media/dirs/index.html.erb +36 -0
- data/app/views/skyline/media/files/_edit.html.erb +101 -0
- data/app/views/skyline/media/files/_index.html.erb +68 -0
- data/app/views/skyline/media/files/_new.html.erb +45 -0
- data/app/views/skyline/publications/_index.html.erb +2 -2
- data/app/views/skyline/sections/_media_section.html.erb +12 -2
- data/app/views/skyline/sections/_wysiwyg_section.html.erb +2 -3
- data/app/views/skyline/settings/index.html +14 -0
- data/app/views/skyline/shared/_head.html.erb +2 -0
- data/app/views/skyline/shared/_header_area.html.erb +7 -5
- data/app/views/skyline/users/index.html.erb +31 -16
- data/config/initializers/dependencies.rb +6 -1
- data/config/initializers/observers.rb +1 -2
- data/config/initializers/rails_defaults.rb +1 -1
- data/config/locales/en-US.yml +110 -68
- data/config/locales/nl-NL.yml +117 -77
- data/config/routes.rb +36 -32
- data/db/fixtures/roles_and_rights.rb +65 -40
- data/db/migrate/20090302102548_add_media_nodes.rb +2 -2
- data/db/migrate/20090309133933_add_description_to_media_nodes.rb +2 -2
- data/db/migrate/20090309134731_add_tags.rb +2 -2
- data/db/migrate/20090309135746_create_media_files_tags.rb +2 -2
- data/db/migrate/20090319091342_create_media_caches.rb +2 -2
- data/db/migrate/20090327083240_create_users.rb +2 -2
- data/db/migrate/20090327084656_create_roles.rb +2 -2
- data/db/migrate/20090327084719_create_rights.rb +2 -2
- data/db/migrate/20090327084739_create_grants.rb +2 -2
- data/db/migrate/20090327090918_create_rights_roles.rb +2 -2
- data/db/migrate/20090408115155_create_ref_objects.rb +2 -2
- data/db/migrate/20090504140044_create_test_sections.rb +2 -2
- data/db/migrate/20090506083107_add_refering_column_name_to_ref_objects.rb +2 -2
- data/db/migrate/20090706124019_add_skyline_media_node_title.rb +1 -1
- data/db/migrate/20090904121447_create_skyline_referable_uris.rb +6 -6
- data/db/migrate/20091221145204_add_skyline_media_section_link.rb +11 -0
- data/db/migrate/20100109145958_add_associated_tags_index.rb +9 -0
- data/db/migrate/20100115111440_create_skyline_user_preferences.rb +14 -0
- data/db/migrate/20100120113953_remove_unused_articles_index.rb +9 -0
- data/db/migrate/20100409073447_change_referable_uri_to_text.rb +9 -0
- data/doc/Bundler.md +33 -28
- data/doc/MIGRATION.md +48 -0
- data/lib/skyline/{content_item.rb → belongs_to_referable.rb} +57 -88
- data/lib/skyline/configuration.rb +14 -15
- data/lib/skyline/content/content.rb +14 -2
- data/lib/skyline/deprecated/version3_0_8.rb +106 -0
- data/lib/skyline/{form_builder_with_errors.rb → form_builder.rb} +5 -5
- data/lib/skyline/{referable.rb → has_many_referables_in.rb} +22 -12
- data/lib/skyline/javascript_generator_methods.rb +1 -1
- data/lib/skyline/plugins_manager.rb +135 -14
- data/lib/skyline/rendering/helpers/renderer_helper.rb +14 -9
- data/lib/skyline/{renderer.rb → rendering/renderer.rb} +3 -4
- data/lib/skyline/{renderable_scope_interface.rb → rendering/scopes/interface.rb} +1 -1
- data/lib/skyline/{wildcard_renderable_scope.rb → rendering/scopes/wildcard.rb} +3 -3
- data/lib/skyline/{section_item.rb → sections/interface.rb} +17 -10
- data/lib/skyline/settings.rb +29 -19
- data/lib/skyline/taggable.rb +3 -3
- data/lib/skyline/version.rb +2 -2
- data/{tasks → lib/tasks}/database.rake +14 -2
- data/{tasks → lib/tasks}/implementation.rake +0 -0
- data/lib/tasks/testing.rake +41 -0
- data/public/skyline/images/backgrounds/panel-dt.gif +0 -0
- data/public/skyline/javascripts/src/application.js +114 -120
- data/public/skyline/javascripts/src/browser.js +22 -4
- data/public/skyline/javascripts/src/library_uploader.js +13 -3
- data/public/skyline/javascripts/src/sections.js +57 -6
- data/public/skyline/javascripts/src/skyline/src/dialog.js +6 -0
- data/public/skyline/javascripts/src/skyline/src/drag.js +6 -0
- data/public/skyline/javascripts/src/skyline/src/events.js +50 -0
- data/public/skyline/javascripts/src/skyline/src/field_replicator.js +12 -11
- data/public/skyline/javascripts/src/skyline/src/layout.js +172 -30
- data/public/skyline/javascripts/src/skyline/src/menu.js +3 -0
- data/public/skyline/javascripts/src/skyline/src/menubutton.js +3 -0
- data/public/skyline/javascripts/src/skyline/src/skyline.js +3 -0
- data/public/skyline/javascripts/src/skyline/src/table.js +398 -0
- data/public/skyline/javascripts/src/skyline/src/tabs.js +2 -2
- data/public/skyline/javascripts/src/skyline/src/tag_selector.js +34 -26
- data/public/skyline/javascripts/src/skyline/src/tree.js +3 -0
- data/public/skyline/javascripts/src/skyline/src/uploader.js +2 -2
- data/public/skyline/javascripts/src/skyline/src/utils.js +3 -0
- data/public/skyline/javascripts/src/skyline/test/_dynamic_right.html +24 -0
- data/public/skyline/javascripts/src/skyline/test/_right_content.html +1 -0
- data/public/skyline/javascripts/src/skyline/test/basic_layout.html +190 -0
- data/public/skyline/javascripts/src/skyline/test/dialog.html +101 -0
- data/public/skyline/javascripts/src/skyline/test/draggablefiles.html +196 -0
- data/public/skyline/javascripts/src/skyline/test/dynamic_layout.html +89 -0
- data/public/skyline/javascripts/src/skyline/test/field_replicator.html +60 -0
- data/public/skyline/javascripts/src/skyline/test/last-closed.gif +0 -0
- data/public/skyline/javascripts/src/skyline/test/last-open.gif +0 -0
- data/public/skyline/javascripts/src/skyline/test/menubutton.html +81 -0
- data/public/skyline/javascripts/src/skyline/test/middle.gif +0 -0
- data/public/skyline/javascripts/src/skyline/test/sortable.html +121 -0
- data/public/skyline/javascripts/src/skyline/test/table.html +521 -0
- data/public/skyline/javascripts/src/skyline/test/tagselector.html +72 -0
- data/public/skyline/javascripts/src/skyline/test/toggle.html +95 -0
- data/public/skyline/javascripts/src/skyline/test/tree.html +310 -0
- data/public/skyline/javascripts/src/skyline/test/tree.png +0 -0
- data/public/skyline/javascripts/src/skyline/test/undohtml.css +27 -0
- data/public/skyline/javascripts/src/skyline/vendor/fancyupload/Swiff.Uploader.js +2 -2
- data/public/skyline/javascripts/src/skyline/vendor/mootools/mootools-core.js +1 -354
- data/public/skyline/javascripts/src/skyline/vendor/mootools/mootools-more.js +64 -52
- data/public/skyline/javascripts/src/skyline.editor/assets/content.css +1 -1
- data/public/skyline/javascripts/src/skyline.editor/src/script_loader.js +156 -75
- data/public/skyline/javascripts/src/skyline.editor/src/skyline.editor.js +14 -4
- data/public/skyline/javascripts/src/skyline.editor/src/theme.js +8 -0
- data/public/skyline/javascripts/src/skyline.editor/test/dialog.html +28 -0
- data/public/skyline/javascripts/src/skyline.editor/test/lorem.html +7 -0
- data/public/skyline/javascripts/src/skyline.editor/test/multiple_editors.html +87 -0
- data/public/skyline/javascripts/src/skyline.editor/test/undohtml.css +27 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/changelog.txt +205 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/examples/css/content.css +54 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/examples/custom_formats.html +111 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/examples/full.html +19 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/examples/menu.html +1 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/examples/simple.html +6 -2
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/examples/skins.html +14 -10
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/examples/translate.html +7 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/examples/word.html +8 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/langs/en.js +18 -2
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin.js +1 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js +154 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js +52 -44
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js +388 -17
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/autosave/langs/en.js +4 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js +58 -6
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js +8 -5
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/example/dialog.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js +10 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js +18 -8
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js +12 -6
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm +0 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js +1 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js +136 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin_src.js +18 -9
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/media/media.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js +7 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js +564 -124
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/paste/pastetext.htm +2 -8
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/paste/pasteword.htm +2 -8
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js +7 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js +4 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm +4 -9
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js +106 -27
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin_src.js +6 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/style/props.htm +4 -11
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js +7 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/cell.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js +921 -918
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js +41 -24
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/js/merge_cells.js +18 -20
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/js/row.js +48 -23
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/js/table.js +24 -15
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/merge_cells.htm +3 -8
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/row.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/table/table.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin_src.js +10 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/template/template.htm +2 -9
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js +26 -16
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js +1 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js +98 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm +3 -10
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm +3 -10
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm +3 -10
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm +3 -11
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js +11 -15
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm +3 -11
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js +8 -5
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js +7 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js +7 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js +7 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js +7 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js +8 -8
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js +7 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/about.htm +1 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/anchor.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm +0 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm +2 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js +252 -188
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/image.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif +0 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js +7 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js +10 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js +2 -2
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js +4 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/link.htm +2 -7
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css +7 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css +4 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css +5 -6
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css +7 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +3 -2
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +4 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm +2 -8
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js +5 -5
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/tiny_mce.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/tiny_mce_popup.js +1 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/tiny_mce_src.js +5492 -4341
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/utils/editable_selects.js +5 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/utils/form_utils.js +6 -5
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/utils/mctabs.js +5 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/utils/validate.js +5 -4
- data/public/skyline/javascripts/src/skyline.js +3 -1
- data/public/skyline/javascripts/src/user_preferences.js +49 -0
- data/public/skyline/stylesheets/general.css +149 -47
- data/rails/init.rb +3 -3
- data/test/factories.rb +28 -0
- data/test/integration/media_browser_super_access_test.rb +52 -0
- data/test/integration/media_browser_user_access_test.rb +50 -0
- data/test/integration/user_preferences_test.rb +73 -0
- data/test/mocks/test_content_object.rb +32 -0
- data/test/mocks/test_section.rb +22 -0
- data/test/test_helper.rb +60 -0
- data/test/unit/inline_ref_test.rb +195 -0
- data/test/unit/locales_test.rb +82 -0
- data/test/unit/page_test.rb +204 -0
- data/test/unit/test_content_object_test.rb +69 -0
- data/test/unit/test_section_test.rb +247 -0
- data/test/unit/user_preference_test.rb +123 -0
- data/test/unit/user_test.rb +74 -0
- data/test/user_access_helper.rb +36 -0
- data/vendor/digitpaint/personify/test/fixtures/multiple_tags.txt +8 -0
- data/vendor/digitpaint/personify/test/parse_runner.rb +25 -0
- data/vendor/digitpaint/personify/test/parser_test.rb +109 -0
- data/vendor/digitpaint/personify/test/test_helper.rb +16 -0
- data/vendor/digitpaint/personify/vendor/treetop/.gitignore +5 -0
- data/vendor/mootools-on-rails/lib/mootools_on_rails/mootools_helper.rb +13 -4
- data/vendor/mootools-on-rails/test/mootools_helper_test.rb +138 -0
- data/vendor/mootools-on-rails/test/test_helper.rb +5 -0
- data/vendor/weppos/url_validation.rb +76 -0
- metadata +384 -189
- data/app/controllers/skyline/media_dirs_controller.rb +0 -56
- data/app/controllers/skyline/media_files_controller.rb +0 -87
- data/app/helpers/skyline/presenters/article_list.rb +0 -139
- data/app/observers/skyline/media_file_observer.rb +0 -32
- data/app/views/skyline/media_dirs/_edit.html.erb +0 -25
- data/app/views/skyline/media_dirs/_index.html.erb +0 -14
- data/app/views/skyline/media_dirs/index.html.erb +0 -42
- data/app/views/skyline/media_files/_edit.html.erb +0 -75
- data/app/views/skyline/media_files/_header.html.erb +0 -3
- data/app/views/skyline/media_files/_index.html.erb +0 -51
- data/app/views/skyline/media_files/_new.html.erb +0 -50
- data/db/migrate/20090603104115_prefix_tables_for_skyline.rb +0 -30
- data/lib/skyline/indexer.rb +0 -36
- data/lib/skyline/renderable_scope.rb +0 -27
- data/lib/skyline/rendering/helpers/settings_helper.rb +0 -26
- data/lib/skyline/searchable_item.rb +0 -132
- data/lib/skyline/url_validation.rb +0 -66
- data/public/skyline/images/backgrounds/splitter.gif +0 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/build.bat +0 -2
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/build.xml +0 -364
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/examples/full_jquery.html +0 -94
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/AddOnManager.js +0 -95
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/CommandManager.js +0 -54
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ControlManager.js +0 -489
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/Developer.js +0 -91
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/Editor.js +0 -2295
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/EditorCommands.js +0 -934
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/EditorManager.js +0 -453
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ForceBlocks.js +0 -644
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/Popup.js +0 -412
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/UndoManager.js +0 -183
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/WindowManager.js +0 -169
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/adapter/jquery/adapter.js +0 -240
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/adapter/jquery/jquery.tinymce.js +0 -179
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/adapter/prototype/adapter.js +0 -38
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/commands/BlockQuote.js +0 -135
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/commands/CutCopyPaste.js +0 -24
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/commands/InsertHorizontalRule.js +0 -15
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/commands/RemoveFormat.js +0 -173
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/commands/UndoRedo.js +0 -38
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/DOMUtils.js +0 -1823
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/Element.js +0 -199
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/EventUtils.js +0 -349
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/Range.js +0 -721
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/ScriptLoader.js +0 -351
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/Selection.js +0 -747
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/Serializer.js +0 -979
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/Sizzle.js +0 -975
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/StringWriter.js +0 -200
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/TridentSelection.js +0 -273
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/dom/XMLWriter.js +0 -155
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/firebug/firebug-lite.js +0 -2518
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/tinymce.js +0 -549
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/Button.js +0 -68
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/ColorSplitButton.js +0 -212
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/Container.js +0 -56
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/Control.js +0 -182
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/DropMenu.js +0 -397
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/ListBox.js +0 -320
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/Menu.js +0 -175
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/MenuButton.js +0 -128
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/MenuItem.js +0 -69
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/NativeListBox.js +0 -198
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/Separator.js +0 -34
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/SplitButton.js +0 -99
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/ui/Toolbar.js +0 -86
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/util/Cookie.js +0 -126
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/util/Dispatcher.js +0 -101
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/util/JSON.js +0 -81
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/util/JSONP.js +0 -25
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/util/JSONRequest.js +0 -87
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/util/URI.js +0 -289
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/util/XHR.js +0 -80
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/classes/xml/Parser.js +0 -126
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/jquery.tinymce.js +0 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/compat2x/editor_plugin.js +0 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/compat2x/editor_plugin_src.js +0 -616
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/safari/blank.htm +0 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/safari/editor_plugin.js +0 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/plugins/safari/editor_plugin_src.js +0 -438
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/tiny_mce_dev.js +0 -128
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/tiny_mce_jquery.js +0 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/tiny_mce_jquery_src.js +0 -12198
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/tiny_mce_prototype.js +0 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/jscripts/tiny_mce/tiny_mce_prototype_src.js +0 -13057
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/api.html +0 -18
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/api_jquery.html +0 -18
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/api_prototype.html +0 -19
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/basic.html +0 -548
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/crossdomain.html +0 -87
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/css/unit.css +0 -120
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/index.html +0 -10
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/jquery_plugin.html +0 -112
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/js/api.js +0 -1438
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/js/testrunner.js +0 -791
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/main.html +0 -8
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/media.html +0 -221
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/menu.html +0 -22
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/parts.html +0 -90
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/paste.html +0 -132
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/performance.html +0 -152
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/range.html +0 -522
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/removeformat.html +0 -88
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/selection.html +0 -235
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/config.ini +0 -27
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/footer.html +0 -3
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/header.html +0 -6
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/index.php +0 -1
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/instructions.txt +0 -4
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/logo.png +0 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/selectors.list +0 -40
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/style.css +0 -181
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/system/index.php +0 -112
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/system/slickspeed.js +0 -147
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/system/template.php +0 -47
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/slickspeed/template.html +0 -2865
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tests/test.xml +0 -6
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tools/ant/ant-contrib.jar +0 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tools/ant/js_build_tools.jar +0 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tools/ant/svnClientAdapter.jar +0 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tools/ant/svnant.jar +0 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tools/ant/svnjavahl.jar +0 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tools/ant/svnkit.jar +0 -0
- data/public/skyline/javascripts/src/skyline.editor/vendor/tinymce/tools/ant/yuicompressor.jar +0 -0
|
@@ -1,2295 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* $Id: Editor.js 1165 2009-06-26 15:26:55Z spocke $
|
|
3
|
-
*
|
|
4
|
-
* @author Moxiecode
|
|
5
|
-
* @copyright Copyright � 2004-2008, Moxiecode Systems AB, All rights reserved.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
(function(tinymce) {
|
|
9
|
-
var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, Dispatcher = tinymce.util.Dispatcher;
|
|
10
|
-
var each = tinymce.each, isGecko = tinymce.isGecko, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit;
|
|
11
|
-
var is = tinymce.is, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, EditorManager = tinymce.EditorManager;
|
|
12
|
-
var inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode;
|
|
13
|
-
|
|
14
|
-
/**#@+
|
|
15
|
-
* @class This class contains the core logic for a TinyMCE editor.
|
|
16
|
-
* @member tinymce.Editor
|
|
17
|
-
*/
|
|
18
|
-
tinymce.create('tinymce.Editor', {
|
|
19
|
-
/**
|
|
20
|
-
* Constructs a editor instance by id.
|
|
21
|
-
*
|
|
22
|
-
* @constructor
|
|
23
|
-
* @member tinymce.Editor
|
|
24
|
-
* @param {String} id Unique id for the editor.
|
|
25
|
-
* @param {Object} s Optional settings string for the editor.
|
|
26
|
-
*/
|
|
27
|
-
Editor : function(id, s) {
|
|
28
|
-
var t = this;
|
|
29
|
-
|
|
30
|
-
t.id = t.editorId = id;
|
|
31
|
-
t.execCommands = {};
|
|
32
|
-
t.queryStateCommands = {};
|
|
33
|
-
t.queryValueCommands = {};
|
|
34
|
-
t.plugins = {};
|
|
35
|
-
|
|
36
|
-
// Add events to the editor
|
|
37
|
-
each([
|
|
38
|
-
'onPreInit',
|
|
39
|
-
'onBeforeRenderUI',
|
|
40
|
-
'onPostRender',
|
|
41
|
-
'onInit',
|
|
42
|
-
'onRemove',
|
|
43
|
-
'onActivate',
|
|
44
|
-
'onDeactivate',
|
|
45
|
-
'onClick',
|
|
46
|
-
'onEvent',
|
|
47
|
-
'onMouseUp',
|
|
48
|
-
'onMouseDown',
|
|
49
|
-
'onDblClick',
|
|
50
|
-
'onKeyDown',
|
|
51
|
-
'onKeyUp',
|
|
52
|
-
'onKeyPress',
|
|
53
|
-
'onContextMenu',
|
|
54
|
-
'onSubmit',
|
|
55
|
-
'onReset',
|
|
56
|
-
'onPaste',
|
|
57
|
-
'onPreProcess',
|
|
58
|
-
'onPostProcess',
|
|
59
|
-
'onBeforeSetContent',
|
|
60
|
-
'onBeforeGetContent',
|
|
61
|
-
'onSetContent',
|
|
62
|
-
'onGetContent',
|
|
63
|
-
'onLoadContent',
|
|
64
|
-
'onSaveContent',
|
|
65
|
-
'onNodeChange',
|
|
66
|
-
'onChange',
|
|
67
|
-
'onBeforeExecCommand',
|
|
68
|
-
'onExecCommand',
|
|
69
|
-
'onUndo',
|
|
70
|
-
'onRedo',
|
|
71
|
-
'onVisualAid',
|
|
72
|
-
'onSetProgressState'
|
|
73
|
-
], function(e) {
|
|
74
|
-
t[e] = new Dispatcher(t);
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
// Default editor config
|
|
78
|
-
t.settings = s = extend({
|
|
79
|
-
id : id,
|
|
80
|
-
language : 'en',
|
|
81
|
-
docs_language : 'en',
|
|
82
|
-
theme : 'simple',
|
|
83
|
-
skin : 'default',
|
|
84
|
-
delta_width : 0,
|
|
85
|
-
delta_height : 0,
|
|
86
|
-
popup_css : '',
|
|
87
|
-
plugins : '',
|
|
88
|
-
document_base_url : tinymce.documentBaseURL,
|
|
89
|
-
add_form_submit_trigger : 1,
|
|
90
|
-
submit_patch : 1,
|
|
91
|
-
add_unload_trigger : 1,
|
|
92
|
-
convert_urls : 1,
|
|
93
|
-
relative_urls : 1,
|
|
94
|
-
remove_script_host : 1,
|
|
95
|
-
table_inline_editing : 0,
|
|
96
|
-
object_resizing : 1,
|
|
97
|
-
cleanup : 1,
|
|
98
|
-
accessibility_focus : 1,
|
|
99
|
-
custom_shortcuts : 1,
|
|
100
|
-
custom_undo_redo_keyboard_shortcuts : 1,
|
|
101
|
-
custom_undo_redo_restore_selection : 1,
|
|
102
|
-
custom_undo_redo : 1,
|
|
103
|
-
doctype : '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',
|
|
104
|
-
visual_table_class : 'mceItemTable',
|
|
105
|
-
visual : 1,
|
|
106
|
-
inline_styles : true,
|
|
107
|
-
convert_fonts_to_spans : true,
|
|
108
|
-
font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large',
|
|
109
|
-
apply_source_formatting : 1,
|
|
110
|
-
directionality : 'ltr',
|
|
111
|
-
forced_root_block : 'p',
|
|
112
|
-
valid_elements : '@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value|tabindex|accesskey],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big',
|
|
113
|
-
hidden_input : 1,
|
|
114
|
-
padd_empty_editor : 1,
|
|
115
|
-
render_ui : 1,
|
|
116
|
-
init_theme : 1,
|
|
117
|
-
force_p_newlines : 1,
|
|
118
|
-
indentation : '30px',
|
|
119
|
-
keep_styles : 1,
|
|
120
|
-
fix_table_elements : 1,
|
|
121
|
-
removeformat_selector : 'span,b,strong,em,i,font,u,strike'
|
|
122
|
-
}, s);
|
|
123
|
-
|
|
124
|
-
// Setup URIs
|
|
125
|
-
t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, {
|
|
126
|
-
base_uri : tinyMCE.baseURI
|
|
127
|
-
});
|
|
128
|
-
t.baseURI = EditorManager.baseURI;
|
|
129
|
-
|
|
130
|
-
// Call setup
|
|
131
|
-
t.execCallback('setup', t);
|
|
132
|
-
},
|
|
133
|
-
|
|
134
|
-
/**#@+
|
|
135
|
-
* @method
|
|
136
|
-
*/
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Renderes the editor/adds it to the page.
|
|
140
|
-
*/
|
|
141
|
-
render : function(nst) {
|
|
142
|
-
var t = this, s = t.settings, id = t.id, sl = tinymce.ScriptLoader;
|
|
143
|
-
|
|
144
|
-
// Page is not loaded yet, wait for it
|
|
145
|
-
if (!Event.domLoaded) {
|
|
146
|
-
Event.add(document, 'init', function() {
|
|
147
|
-
t.render();
|
|
148
|
-
});
|
|
149
|
-
return;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Force strict loading mode if render us called by user and not internally
|
|
153
|
-
if (!nst) {
|
|
154
|
-
s.strict_loading_mode = 1;
|
|
155
|
-
tinyMCE.settings = s;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
// Element not found, then skip initialization
|
|
159
|
-
if (!t.getElement())
|
|
160
|
-
return;
|
|
161
|
-
|
|
162
|
-
if (s.strict_loading_mode) {
|
|
163
|
-
sl.settings.strict_mode = s.strict_loading_mode;
|
|
164
|
-
tinymce.DOM.settings.strict = 1;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Add hidden input for non input elements inside form elements
|
|
168
|
-
if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form'))
|
|
169
|
-
DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id);
|
|
170
|
-
|
|
171
|
-
if (tinymce.WindowManager)
|
|
172
|
-
t.windowManager = new tinymce.WindowManager(t);
|
|
173
|
-
|
|
174
|
-
if (s.encoding == 'xml') {
|
|
175
|
-
t.onGetContent.add(function(ed, o) {
|
|
176
|
-
if (o.save)
|
|
177
|
-
o.content = DOM.encode(o.content);
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
if (s.add_form_submit_trigger) {
|
|
182
|
-
t.onSubmit.addToTop(function() {
|
|
183
|
-
if (t.initialized) {
|
|
184
|
-
t.save();
|
|
185
|
-
t.isNotDirty = 1;
|
|
186
|
-
}
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (s.add_unload_trigger) {
|
|
191
|
-
t._beforeUnload = tinyMCE.onBeforeUnload.add(function() {
|
|
192
|
-
if (t.initialized && !t.destroyed && !t.isHidden())
|
|
193
|
-
t.save({format : 'raw', no_events : true});
|
|
194
|
-
});
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
tinymce.addUnload(t.destroy, t);
|
|
198
|
-
|
|
199
|
-
if (s.submit_patch) {
|
|
200
|
-
t.onBeforeRenderUI.add(function() {
|
|
201
|
-
var n = t.getElement().form;
|
|
202
|
-
|
|
203
|
-
if (!n)
|
|
204
|
-
return;
|
|
205
|
-
|
|
206
|
-
// Already patched
|
|
207
|
-
if (n._mceOldSubmit)
|
|
208
|
-
return;
|
|
209
|
-
|
|
210
|
-
// Check page uses id="submit" or name="submit" for it's submit button
|
|
211
|
-
if (!n.submit.nodeType && !n.submit.length) {
|
|
212
|
-
t.formElement = n;
|
|
213
|
-
n._mceOldSubmit = n.submit;
|
|
214
|
-
n.submit = function() {
|
|
215
|
-
// Save all instances
|
|
216
|
-
EditorManager.triggerSave();
|
|
217
|
-
t.isNotDirty = 1;
|
|
218
|
-
|
|
219
|
-
return t.formElement._mceOldSubmit(t.formElement);
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
n = null;
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Load scripts
|
|
228
|
-
function loadScripts() {
|
|
229
|
-
if (s.language)
|
|
230
|
-
sl.add(tinymce.baseURL + '/langs/' + s.language + '.js');
|
|
231
|
-
|
|
232
|
-
if (s.theme && s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme])
|
|
233
|
-
ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js');
|
|
234
|
-
|
|
235
|
-
each(explode(s.plugins), function(p) {
|
|
236
|
-
if (p && p.charAt(0) != '-' && !PluginManager.urls[p]) {
|
|
237
|
-
// Skip safari plugin for other browsers
|
|
238
|
-
if (!isWebKit && p == 'safari')
|
|
239
|
-
return;
|
|
240
|
-
|
|
241
|
-
PluginManager.load(p, 'plugins/' + p + '/editor_plugin' + tinymce.suffix + '.js');
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
// Init when que is loaded
|
|
246
|
-
sl.loadQueue(function() {
|
|
247
|
-
if (!t.removed)
|
|
248
|
-
t.init();
|
|
249
|
-
});
|
|
250
|
-
};
|
|
251
|
-
|
|
252
|
-
// Load compat2x first
|
|
253
|
-
if (s.plugins.indexOf('compat2x') != -1) {
|
|
254
|
-
PluginManager.load('compat2x', 'plugins/compat2x/editor_plugin' + tinymce.suffix + '.js');
|
|
255
|
-
sl.loadQueue(loadScripts);
|
|
256
|
-
} else
|
|
257
|
-
loadScripts();
|
|
258
|
-
},
|
|
259
|
-
|
|
260
|
-
/**
|
|
261
|
-
* Initializes the editor this will be called automatically when
|
|
262
|
-
* all plugins/themes and language packs are loaded by the rendered method.
|
|
263
|
-
* This method will setup the iframe and create the theme and plugin instances.
|
|
264
|
-
*/
|
|
265
|
-
init : function() {
|
|
266
|
-
var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re;
|
|
267
|
-
|
|
268
|
-
EditorManager.add(t);
|
|
269
|
-
|
|
270
|
-
// Create theme
|
|
271
|
-
if (s.theme) {
|
|
272
|
-
s.theme = s.theme.replace(/-/, '');
|
|
273
|
-
o = ThemeManager.get(s.theme);
|
|
274
|
-
t.theme = new o();
|
|
275
|
-
|
|
276
|
-
if (t.theme.init && s.init_theme)
|
|
277
|
-
t.theme.init(t, ThemeManager.urls[s.theme] || tinymce.documentBaseURL.replace(/\/$/, ''));
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
// Create all plugins
|
|
281
|
-
each(explode(s.plugins.replace(/\-/g, '')), function(p) {
|
|
282
|
-
var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po;
|
|
283
|
-
|
|
284
|
-
if (c) {
|
|
285
|
-
po = new c(t, u);
|
|
286
|
-
|
|
287
|
-
t.plugins[p] = po;
|
|
288
|
-
|
|
289
|
-
if (po.init)
|
|
290
|
-
po.init(t, u);
|
|
291
|
-
}
|
|
292
|
-
});
|
|
293
|
-
|
|
294
|
-
// Setup popup CSS path(s)
|
|
295
|
-
if (s.popup_css !== false) {
|
|
296
|
-
if (s.popup_css)
|
|
297
|
-
s.popup_css = t.documentBaseURI.toAbsolute(s.popup_css);
|
|
298
|
-
else
|
|
299
|
-
s.popup_css = t.baseURI.toAbsolute("themes/" + s.theme + "/skins/" + s.skin + "/dialog.css");
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
if (s.popup_css_add)
|
|
303
|
-
s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add);
|
|
304
|
-
|
|
305
|
-
// Setup control factory
|
|
306
|
-
t.controlManager = new tinymce.ControlManager(t);
|
|
307
|
-
t.undoManager = new tinymce.UndoManager(t);
|
|
308
|
-
|
|
309
|
-
// Pass through
|
|
310
|
-
t.undoManager.onAdd.add(function(um, l) {
|
|
311
|
-
if (!l.initial)
|
|
312
|
-
return t.onChange.dispatch(t, l, um);
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
t.undoManager.onUndo.add(function(um, l) {
|
|
316
|
-
return t.onUndo.dispatch(t, l, um);
|
|
317
|
-
});
|
|
318
|
-
|
|
319
|
-
t.undoManager.onRedo.add(function(um, l) {
|
|
320
|
-
return t.onRedo.dispatch(t, l, um);
|
|
321
|
-
});
|
|
322
|
-
|
|
323
|
-
if (s.custom_undo_redo) {
|
|
324
|
-
t.onExecCommand.add(function(ed, cmd, ui, val, a) {
|
|
325
|
-
if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo))
|
|
326
|
-
t.undoManager.add();
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
t.onExecCommand.add(function(ed, c) {
|
|
331
|
-
// Don't refresh the select lists until caret move
|
|
332
|
-
if (!/^(FontName|FontSize)$/.test(c))
|
|
333
|
-
t.nodeChanged();
|
|
334
|
-
});
|
|
335
|
-
|
|
336
|
-
// Remove ghost selections on images and tables in Gecko
|
|
337
|
-
if (isGecko) {
|
|
338
|
-
function repaint(a, o) {
|
|
339
|
-
if (!o || !o.initial)
|
|
340
|
-
t.execCommand('mceRepaint');
|
|
341
|
-
};
|
|
342
|
-
|
|
343
|
-
t.onUndo.add(repaint);
|
|
344
|
-
t.onRedo.add(repaint);
|
|
345
|
-
t.onSetContent.add(repaint);
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
// Enables users to override the control factory
|
|
349
|
-
t.onBeforeRenderUI.dispatch(t, t.controlManager);
|
|
350
|
-
|
|
351
|
-
// Measure box
|
|
352
|
-
if (s.render_ui) {
|
|
353
|
-
w = s.width || e.style.width || e.offsetWidth;
|
|
354
|
-
h = s.height || e.style.height || e.offsetHeight;
|
|
355
|
-
t.orgDisplay = e.style.display;
|
|
356
|
-
re = /^[0-9\.]+(|px)$/i;
|
|
357
|
-
|
|
358
|
-
if (re.test('' + w))
|
|
359
|
-
w = Math.max(parseInt(w) + (o.deltaWidth || 0), 100);
|
|
360
|
-
|
|
361
|
-
if (re.test('' + h))
|
|
362
|
-
h = Math.max(parseInt(h) + (o.deltaHeight || 0), 100);
|
|
363
|
-
|
|
364
|
-
// Render UI
|
|
365
|
-
o = t.theme.renderUI({
|
|
366
|
-
targetNode : e,
|
|
367
|
-
width : w,
|
|
368
|
-
height : h,
|
|
369
|
-
deltaWidth : s.delta_width,
|
|
370
|
-
deltaHeight : s.delta_height
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
t.editorContainer = o.editorContainer;
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
// #ifdef contentEditable
|
|
377
|
-
|
|
378
|
-
// Content editable mode ends here
|
|
379
|
-
if (s.content_editable) {
|
|
380
|
-
e = n = o = null; // Fix IE leak
|
|
381
|
-
return t.setupContentEditable();
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
// #endif
|
|
385
|
-
|
|
386
|
-
// User specified a document.domain value
|
|
387
|
-
if (document.domain && location.hostname != document.domain)
|
|
388
|
-
tinymce.relaxedDomain = document.domain;
|
|
389
|
-
|
|
390
|
-
// Resize editor
|
|
391
|
-
DOM.setStyles(o.sizeContainer || o.editorContainer, {
|
|
392
|
-
width : w,
|
|
393
|
-
height : h
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
h = (o.iframeHeight || h) + (typeof(h) == 'number' ? (o.deltaHeight || 0) : '');
|
|
397
|
-
if (h < 100)
|
|
398
|
-
h = 100;
|
|
399
|
-
|
|
400
|
-
t.iframeHTML = s.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml">';
|
|
401
|
-
|
|
402
|
-
// We only need to override paths if we have to
|
|
403
|
-
// IE has a bug where it remove site absolute urls to relative ones if this is specified
|
|
404
|
-
if (s.document_base_url != tinymce.documentBaseURL)
|
|
405
|
-
t.iframeHTML += '<base href="' + t.documentBaseURI.getURI() + '" />';
|
|
406
|
-
|
|
407
|
-
t.iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
|
|
408
|
-
|
|
409
|
-
if (tinymce.relaxedDomain)
|
|
410
|
-
t.iframeHTML += '<script type="text/javascript">document.domain = "' + tinymce.relaxedDomain + '";</script>';
|
|
411
|
-
|
|
412
|
-
bi = s.body_id || 'tinymce';
|
|
413
|
-
if (bi.indexOf('=') != -1) {
|
|
414
|
-
bi = t.getParam('body_id', '', 'hash');
|
|
415
|
-
bi = bi[t.id] || bi;
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
bc = s.body_class || '';
|
|
419
|
-
if (bc.indexOf('=') != -1) {
|
|
420
|
-
bc = t.getParam('body_class', '', 'hash');
|
|
421
|
-
bc = bc[t.id] || '';
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
t.iframeHTML += '</head><body id="' + bi + '" class="mceContentBody ' + bc + '"></body></html>';
|
|
425
|
-
|
|
426
|
-
// Domain relaxing enabled, then set document domain
|
|
427
|
-
if (tinymce.relaxedDomain) {
|
|
428
|
-
// We need to write the contents here in IE since multiple writes messes up refresh button and back button
|
|
429
|
-
if (isIE || (tinymce.isOpera && parseFloat(opera.version()) >= 9.5))
|
|
430
|
-
u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()';
|
|
431
|
-
else if (tinymce.isOpera)
|
|
432
|
-
u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";document.close();ed.setupIframe();})()';
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
// Create iframe
|
|
436
|
-
n = DOM.add(o.iframeContainer, 'iframe', {
|
|
437
|
-
id : t.id + "_ifr",
|
|
438
|
-
src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7
|
|
439
|
-
frameBorder : '0',
|
|
440
|
-
style : {
|
|
441
|
-
width : '100%',
|
|
442
|
-
height : h
|
|
443
|
-
}
|
|
444
|
-
});
|
|
445
|
-
|
|
446
|
-
t.contentAreaContainer = o.iframeContainer;
|
|
447
|
-
DOM.get(o.editorContainer).style.display = t.orgDisplay;
|
|
448
|
-
DOM.get(t.id).style.display = 'none';
|
|
449
|
-
|
|
450
|
-
if (!isIE || !tinymce.relaxedDomain)
|
|
451
|
-
t.setupIframe();
|
|
452
|
-
|
|
453
|
-
e = n = o = null; // Cleanup
|
|
454
|
-
},
|
|
455
|
-
|
|
456
|
-
/**
|
|
457
|
-
* This method get called by the init method ones the iframe is loaded.
|
|
458
|
-
* It will fill the iframe with contents, setups DOM and selection objects for the iframe.
|
|
459
|
-
* This method should not be called directly.
|
|
460
|
-
*/
|
|
461
|
-
setupIframe : function() {
|
|
462
|
-
var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b;
|
|
463
|
-
|
|
464
|
-
// Setup iframe body
|
|
465
|
-
if (!isIE || !tinymce.relaxedDomain) {
|
|
466
|
-
d.open();
|
|
467
|
-
d.write(t.iframeHTML);
|
|
468
|
-
d.close();
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
// Design mode needs to be added here Ctrl+A will fail otherwise
|
|
472
|
-
if (!isIE) {
|
|
473
|
-
try {
|
|
474
|
-
if (!s.readonly)
|
|
475
|
-
d.designMode = 'On';
|
|
476
|
-
} catch (ex) {
|
|
477
|
-
// Will fail on Gecko if the editor is placed in an hidden container element
|
|
478
|
-
// The design mode will be set ones the editor is focused
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
|
-
|
|
482
|
-
// IE needs to use contentEditable or it will display non secure items for HTTPS
|
|
483
|
-
if (isIE) {
|
|
484
|
-
// It will not steal focus if we hide it while setting contentEditable
|
|
485
|
-
b = t.getBody();
|
|
486
|
-
DOM.hide(b);
|
|
487
|
-
|
|
488
|
-
if (!s.readonly)
|
|
489
|
-
b.contentEditable = true;
|
|
490
|
-
|
|
491
|
-
DOM.show(b);
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
// Setup objects
|
|
495
|
-
t.dom = new tinymce.DOM.DOMUtils(t.getDoc(), {
|
|
496
|
-
keep_values : true,
|
|
497
|
-
url_converter : t.convertURL,
|
|
498
|
-
url_converter_scope : t,
|
|
499
|
-
hex_colors : s.force_hex_style_colors,
|
|
500
|
-
class_filter : s.class_filter,
|
|
501
|
-
update_styles : 1,
|
|
502
|
-
fix_ie_paragraphs : 1
|
|
503
|
-
});
|
|
504
|
-
|
|
505
|
-
t.serializer = new tinymce.dom.Serializer({
|
|
506
|
-
entity_encoding : s.entity_encoding,
|
|
507
|
-
entities : s.entities,
|
|
508
|
-
valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements,
|
|
509
|
-
extended_valid_elements : s.extended_valid_elements,
|
|
510
|
-
valid_child_elements : s.valid_child_elements,
|
|
511
|
-
invalid_elements : s.invalid_elements,
|
|
512
|
-
fix_table_elements : s.fix_table_elements,
|
|
513
|
-
fix_list_elements : s.fix_list_elements,
|
|
514
|
-
fix_content_duplication : s.fix_content_duplication,
|
|
515
|
-
convert_fonts_to_spans : s.convert_fonts_to_spans,
|
|
516
|
-
font_size_classes : s.font_size_classes,
|
|
517
|
-
font_size_style_values : s.font_size_style_values,
|
|
518
|
-
apply_source_formatting : s.apply_source_formatting,
|
|
519
|
-
remove_linebreaks : s.remove_linebreaks,
|
|
520
|
-
element_format : s.element_format,
|
|
521
|
-
dom : t.dom
|
|
522
|
-
});
|
|
523
|
-
|
|
524
|
-
t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer);
|
|
525
|
-
t.forceBlocks = new tinymce.ForceBlocks(t, {
|
|
526
|
-
forced_root_block : s.forced_root_block
|
|
527
|
-
});
|
|
528
|
-
t.editorCommands = new tinymce.EditorCommands(t);
|
|
529
|
-
|
|
530
|
-
// Pass through
|
|
531
|
-
t.serializer.onPreProcess.add(function(se, o) {
|
|
532
|
-
return t.onPreProcess.dispatch(t, o, se);
|
|
533
|
-
});
|
|
534
|
-
|
|
535
|
-
t.serializer.onPostProcess.add(function(se, o) {
|
|
536
|
-
return t.onPostProcess.dispatch(t, o, se);
|
|
537
|
-
});
|
|
538
|
-
|
|
539
|
-
t.onPreInit.dispatch(t);
|
|
540
|
-
|
|
541
|
-
if (!s.gecko_spellcheck)
|
|
542
|
-
t.getBody().spellcheck = 0;
|
|
543
|
-
|
|
544
|
-
if (!s.readonly)
|
|
545
|
-
t._addEvents();
|
|
546
|
-
|
|
547
|
-
t.controlManager.onPostRender.dispatch(t, t.controlManager);
|
|
548
|
-
t.onPostRender.dispatch(t);
|
|
549
|
-
|
|
550
|
-
if (s.directionality)
|
|
551
|
-
t.getBody().dir = s.directionality;
|
|
552
|
-
|
|
553
|
-
if (s.nowrap)
|
|
554
|
-
t.getBody().style.whiteSpace = "nowrap";
|
|
555
|
-
|
|
556
|
-
if (s.custom_elements) {
|
|
557
|
-
function handleCustom(ed, o) {
|
|
558
|
-
each(explode(s.custom_elements), function(v) {
|
|
559
|
-
var n;
|
|
560
|
-
|
|
561
|
-
if (v.indexOf('~') === 0) {
|
|
562
|
-
v = v.substring(1);
|
|
563
|
-
n = 'span';
|
|
564
|
-
} else
|
|
565
|
-
n = 'div';
|
|
566
|
-
|
|
567
|
-
o.content = o.content.replace(new RegExp('<(' + v + ')([^>]*)>', 'g'), '<' + n + ' mce_name="$1"$2>');
|
|
568
|
-
o.content = o.content.replace(new RegExp('</(' + v + ')>', 'g'), '</' + n + '>');
|
|
569
|
-
});
|
|
570
|
-
};
|
|
571
|
-
|
|
572
|
-
t.onBeforeSetContent.add(handleCustom);
|
|
573
|
-
t.onPostProcess.add(function(ed, o) {
|
|
574
|
-
if (o.set)
|
|
575
|
-
handleCustom(ed, o);
|
|
576
|
-
});
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
if (s.handle_node_change_callback) {
|
|
580
|
-
t.onNodeChange.add(function(ed, cm, n) {
|
|
581
|
-
t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed());
|
|
582
|
-
});
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
if (s.save_callback) {
|
|
586
|
-
t.onSaveContent.add(function(ed, o) {
|
|
587
|
-
var h = t.execCallback('save_callback', t.id, o.content, t.getBody());
|
|
588
|
-
|
|
589
|
-
if (h)
|
|
590
|
-
o.content = h;
|
|
591
|
-
});
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
if (s.onchange_callback) {
|
|
595
|
-
t.onChange.add(function(ed, l) {
|
|
596
|
-
t.execCallback('onchange_callback', t, l);
|
|
597
|
-
});
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
if (s.convert_newlines_to_brs) {
|
|
601
|
-
t.onBeforeSetContent.add(function(ed, o) {
|
|
602
|
-
if (o.initial)
|
|
603
|
-
o.content = o.content.replace(/\r?\n/g, '<br />');
|
|
604
|
-
});
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
if (s.fix_nesting && isIE) {
|
|
608
|
-
t.onBeforeSetContent.add(function(ed, o) {
|
|
609
|
-
o.content = t._fixNesting(o.content);
|
|
610
|
-
});
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
if (s.preformatted) {
|
|
614
|
-
t.onPostProcess.add(function(ed, o) {
|
|
615
|
-
o.content = o.content.replace(/^\s*<pre.*?>/, '');
|
|
616
|
-
o.content = o.content.replace(/<\/pre>\s*$/, '');
|
|
617
|
-
|
|
618
|
-
if (o.set)
|
|
619
|
-
o.content = '<pre class="mceItemHidden">' + o.content + '</pre>';
|
|
620
|
-
});
|
|
621
|
-
}
|
|
622
|
-
|
|
623
|
-
if (s.verify_css_classes) {
|
|
624
|
-
t.serializer.attribValueFilter = function(n, v) {
|
|
625
|
-
var s, cl;
|
|
626
|
-
|
|
627
|
-
if (n == 'class') {
|
|
628
|
-
// Build regexp for classes
|
|
629
|
-
if (!t.classesRE) {
|
|
630
|
-
cl = t.dom.getClasses();
|
|
631
|
-
|
|
632
|
-
if (cl.length > 0) {
|
|
633
|
-
s = '';
|
|
634
|
-
|
|
635
|
-
each (cl, function(o) {
|
|
636
|
-
s += (s ? '|' : '') + o['class'];
|
|
637
|
-
});
|
|
638
|
-
|
|
639
|
-
t.classesRE = new RegExp('(' + s + ')', 'gi');
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : '';
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
return v;
|
|
647
|
-
};
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
if (s.convert_fonts_to_spans)
|
|
651
|
-
t._convertFonts();
|
|
652
|
-
|
|
653
|
-
if (s.inline_styles)
|
|
654
|
-
t._convertInlineElements();
|
|
655
|
-
|
|
656
|
-
if (s.cleanup_callback) {
|
|
657
|
-
t.onBeforeSetContent.add(function(ed, o) {
|
|
658
|
-
o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o);
|
|
659
|
-
});
|
|
660
|
-
|
|
661
|
-
t.onPreProcess.add(function(ed, o) {
|
|
662
|
-
if (o.set)
|
|
663
|
-
t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o);
|
|
664
|
-
|
|
665
|
-
if (o.get)
|
|
666
|
-
t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o);
|
|
667
|
-
});
|
|
668
|
-
|
|
669
|
-
t.onPostProcess.add(function(ed, o) {
|
|
670
|
-
if (o.set)
|
|
671
|
-
o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o);
|
|
672
|
-
|
|
673
|
-
if (o.get)
|
|
674
|
-
o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o);
|
|
675
|
-
});
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
if (s.save_callback) {
|
|
679
|
-
t.onGetContent.add(function(ed, o) {
|
|
680
|
-
if (o.save)
|
|
681
|
-
o.content = t.execCallback('save_callback', t.id, o.content, t.getBody());
|
|
682
|
-
});
|
|
683
|
-
}
|
|
684
|
-
|
|
685
|
-
if (s.handle_event_callback) {
|
|
686
|
-
t.onEvent.add(function(ed, e, o) {
|
|
687
|
-
if (t.execCallback('handle_event_callback', e, ed, o) === false)
|
|
688
|
-
Event.cancel(e);
|
|
689
|
-
});
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
// Add visual aids when new contents is added
|
|
693
|
-
t.onSetContent.add(function() {
|
|
694
|
-
t.addVisual(t.getBody());
|
|
695
|
-
});
|
|
696
|
-
|
|
697
|
-
// Remove empty contents
|
|
698
|
-
if (s.padd_empty_editor) {
|
|
699
|
-
t.onPostProcess.add(function(ed, o) {
|
|
700
|
-
o.content = o.content.replace(/^(<p[^>]*>( | |\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/, '');
|
|
701
|
-
});
|
|
702
|
-
}
|
|
703
|
-
|
|
704
|
-
if (isGecko) {
|
|
705
|
-
// Fix gecko link bug, when a link is placed at the end of block elements there is
|
|
706
|
-
// no way to move the caret behind the link. This fix adds a bogus br element after the link
|
|
707
|
-
function fixLinks(ed, o) {
|
|
708
|
-
each(ed.dom.select('a'), function(n) {
|
|
709
|
-
var pn = n.parentNode;
|
|
710
|
-
|
|
711
|
-
if (ed.dom.isBlock(pn) && pn.lastChild === n)
|
|
712
|
-
ed.dom.add(pn, 'br', {'mce_bogus' : 1});
|
|
713
|
-
});
|
|
714
|
-
};
|
|
715
|
-
|
|
716
|
-
t.onExecCommand.add(function(ed, cmd) {
|
|
717
|
-
if (cmd === 'CreateLink')
|
|
718
|
-
fixLinks(ed);
|
|
719
|
-
});
|
|
720
|
-
|
|
721
|
-
t.onSetContent.add(t.selection.onSetContent.add(fixLinks));
|
|
722
|
-
|
|
723
|
-
if (!s.readonly) {
|
|
724
|
-
try {
|
|
725
|
-
// Design mode must be set here once again to fix a bug where
|
|
726
|
-
// Ctrl+A/Delete/Backspace didn't work if the editor was added using mceAddControl then removed then added again
|
|
727
|
-
d.designMode = 'Off';
|
|
728
|
-
d.designMode = 'On';
|
|
729
|
-
} catch (ex) {
|
|
730
|
-
// Will fail on Gecko if the editor is placed in an hidden container element
|
|
731
|
-
// The design mode will be set ones the editor is focused
|
|
732
|
-
}
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
// A small timeout was needed since firefox will remove. Bug: #1838304
|
|
737
|
-
setTimeout(function () {
|
|
738
|
-
if (t.removed)
|
|
739
|
-
return;
|
|
740
|
-
|
|
741
|
-
t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')});
|
|
742
|
-
t.startContent = t.getContent({format : 'raw'});
|
|
743
|
-
t.undoManager.add({initial : true});
|
|
744
|
-
t.initialized = true;
|
|
745
|
-
|
|
746
|
-
t.onInit.dispatch(t);
|
|
747
|
-
t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc());
|
|
748
|
-
t.execCallback('init_instance_callback', t);
|
|
749
|
-
t.focus(true);
|
|
750
|
-
t.nodeChanged({initial : 1});
|
|
751
|
-
|
|
752
|
-
// Load specified content CSS last
|
|
753
|
-
if (s.content_css) {
|
|
754
|
-
tinymce.each(explode(s.content_css), function(u) {
|
|
755
|
-
t.dom.loadCSS(t.documentBaseURI.toAbsolute(u));
|
|
756
|
-
});
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
// Handle auto focus
|
|
760
|
-
if (s.auto_focus) {
|
|
761
|
-
setTimeout(function () {
|
|
762
|
-
var ed = EditorManager.get(s.auto_focus);
|
|
763
|
-
|
|
764
|
-
ed.selection.select(ed.getBody(), 1);
|
|
765
|
-
ed.selection.collapse(1);
|
|
766
|
-
ed.getWin().focus();
|
|
767
|
-
}, 100);
|
|
768
|
-
}
|
|
769
|
-
}, 1);
|
|
770
|
-
|
|
771
|
-
e = null;
|
|
772
|
-
},
|
|
773
|
-
|
|
774
|
-
// #ifdef contentEditable
|
|
775
|
-
|
|
776
|
-
/**
|
|
777
|
-
* Sets up the contentEditable mode.
|
|
778
|
-
*/
|
|
779
|
-
setupContentEditable : function() {
|
|
780
|
-
var t = this, s = t.settings, e = t.getElement();
|
|
781
|
-
|
|
782
|
-
t.contentDocument = s.content_document || document;
|
|
783
|
-
t.contentWindow = s.content_window || window;
|
|
784
|
-
t.bodyElement = e;
|
|
785
|
-
|
|
786
|
-
// Prevent leak in IE
|
|
787
|
-
s.content_document = s.content_window = null;
|
|
788
|
-
|
|
789
|
-
DOM.hide(e);
|
|
790
|
-
e.contentEditable = t.getParam('content_editable_state', true);
|
|
791
|
-
DOM.show(e);
|
|
792
|
-
|
|
793
|
-
if (!s.gecko_spellcheck)
|
|
794
|
-
t.getDoc().body.spellcheck = 0;
|
|
795
|
-
|
|
796
|
-
// Setup objects
|
|
797
|
-
t.dom = new tinymce.DOM.DOMUtils(t.getDoc(), {
|
|
798
|
-
keep_values : true,
|
|
799
|
-
url_converter : t.convertURL,
|
|
800
|
-
url_converter_scope : t,
|
|
801
|
-
hex_colors : s.force_hex_style_colors,
|
|
802
|
-
class_filter : s.class_filter,
|
|
803
|
-
root_element : t.id,
|
|
804
|
-
strict_root : 1,
|
|
805
|
-
fix_ie_paragraphs : 1,
|
|
806
|
-
update_styles : 1
|
|
807
|
-
});
|
|
808
|
-
|
|
809
|
-
t.serializer = new tinymce.dom.Serializer({
|
|
810
|
-
entity_encoding : s.entity_encoding,
|
|
811
|
-
entities : s.entities,
|
|
812
|
-
valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements,
|
|
813
|
-
extended_valid_elements : s.extended_valid_elements,
|
|
814
|
-
valid_child_elements : s.valid_child_elements,
|
|
815
|
-
invalid_elements : s.invalid_elements,
|
|
816
|
-
fix_table_elements : s.fix_table_elements,
|
|
817
|
-
fix_list_elements : s.fix_list_elements,
|
|
818
|
-
fix_content_duplication : s.fix_content_duplication,
|
|
819
|
-
convert_fonts_to_spans : s.convert_fonts_to_spans,
|
|
820
|
-
font_size_classes : s.font_size_classes,
|
|
821
|
-
font_size_style_values : s.font_size_style_values,
|
|
822
|
-
apply_source_formatting : s.apply_source_formatting,
|
|
823
|
-
dom : t.dom
|
|
824
|
-
});
|
|
825
|
-
|
|
826
|
-
t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer);
|
|
827
|
-
t.forceBlocks = new tinymce.ForceBlocks(t, {
|
|
828
|
-
forced_root_block : s.forced_root_block
|
|
829
|
-
});
|
|
830
|
-
t.editorCommands = new tinymce.EditorCommands(t);
|
|
831
|
-
|
|
832
|
-
// Pass through
|
|
833
|
-
t.serializer.onPreProcess.add(function(se, o) {
|
|
834
|
-
return t.onPreProcess.dispatch(t, o, se);
|
|
835
|
-
});
|
|
836
|
-
|
|
837
|
-
t.serializer.onPostProcess.add(function(se, o) {
|
|
838
|
-
return t.onPostProcess.dispatch(t, o, se);
|
|
839
|
-
});
|
|
840
|
-
|
|
841
|
-
t.onPreInit.dispatch(t);
|
|
842
|
-
t._addEvents();
|
|
843
|
-
|
|
844
|
-
t.controlManager.onPostRender.dispatch(t, t.controlManager);
|
|
845
|
-
t.onPostRender.dispatch(t);
|
|
846
|
-
|
|
847
|
-
if (s.convert_fonts_to_spans)
|
|
848
|
-
t._convertFonts();
|
|
849
|
-
|
|
850
|
-
if (s.inline_styles)
|
|
851
|
-
t._convertInlineElements();
|
|
852
|
-
|
|
853
|
-
t.onSetContent.add(function() {
|
|
854
|
-
t.addVisual(t.getBody());
|
|
855
|
-
});
|
|
856
|
-
|
|
857
|
-
t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')});
|
|
858
|
-
t.startContent = t.getContent({format : 'raw'});
|
|
859
|
-
t.undoManager.add({initial : true});
|
|
860
|
-
t.initialized = true;
|
|
861
|
-
|
|
862
|
-
t.onInit.dispatch(t);
|
|
863
|
-
t.focus(true);
|
|
864
|
-
t.nodeChanged({initial : 1});
|
|
865
|
-
|
|
866
|
-
// Load specified content CSS last
|
|
867
|
-
if (s.content_css) {
|
|
868
|
-
each(explode(s.content_css), function(u) {
|
|
869
|
-
t.dom.loadCSS(t.documentBaseURI.toAbsolute(u));
|
|
870
|
-
});
|
|
871
|
-
}
|
|
872
|
-
|
|
873
|
-
if (isIE) {
|
|
874
|
-
// Store away selection
|
|
875
|
-
t.dom.bind(t.getElement(), 'beforedeactivate', function() {
|
|
876
|
-
t.lastSelectionBookmark = t.selection.getBookmark(1);
|
|
877
|
-
});
|
|
878
|
-
|
|
879
|
-
t.onBeforeExecCommand.add(function(ed, cmd, ui, val, o) {
|
|
880
|
-
if (!DOM.getParent(ed.selection.getStart(), function(n) {return n == ed.getBody();}))
|
|
881
|
-
o.terminate = 1;
|
|
882
|
-
|
|
883
|
-
if (!DOM.getParent(ed.selection.getEnd(), function(n) {return n == ed.getBody();}))
|
|
884
|
-
o.terminate = 1;
|
|
885
|
-
});
|
|
886
|
-
}
|
|
887
|
-
|
|
888
|
-
e = null; // Cleanup
|
|
889
|
-
},
|
|
890
|
-
|
|
891
|
-
// #endif
|
|
892
|
-
|
|
893
|
-
/**
|
|
894
|
-
* Focuses/activates the editor. This will set this editor as the activeEditor in the EditorManager
|
|
895
|
-
* it will also place DOM focus inside the editor.
|
|
896
|
-
*
|
|
897
|
-
* @param {bool} sf Skip DOM focus. Just set is as the active editor.
|
|
898
|
-
*/
|
|
899
|
-
focus : function(sf) {
|
|
900
|
-
var oed, t = this, ce = t.settings.content_editable;
|
|
901
|
-
|
|
902
|
-
if (!sf) {
|
|
903
|
-
// Is not content editable or the selection is outside the area in IE
|
|
904
|
-
// the IE statement is needed to avoid bluring if element selections inside layers since
|
|
905
|
-
// the layer is like it's own document in IE
|
|
906
|
-
if (!ce && (!isIE || t.selection.getNode().ownerDocument != t.getDoc()))
|
|
907
|
-
t.getWin().focus();
|
|
908
|
-
|
|
909
|
-
// #ifdef contentEditable
|
|
910
|
-
|
|
911
|
-
// Content editable mode ends here
|
|
912
|
-
if (ce) {
|
|
913
|
-
if (tinymce.isWebKit)
|
|
914
|
-
t.getWin().focus();
|
|
915
|
-
else {
|
|
916
|
-
if (tinymce.isIE)
|
|
917
|
-
t.getElement().setActive();
|
|
918
|
-
else
|
|
919
|
-
t.getElement().focus();
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
|
|
923
|
-
// #endif
|
|
924
|
-
}
|
|
925
|
-
|
|
926
|
-
if (EditorManager.activeEditor != t) {
|
|
927
|
-
if ((oed = EditorManager.activeEditor) != null)
|
|
928
|
-
oed.onDeactivate.dispatch(oed, t);
|
|
929
|
-
|
|
930
|
-
t.onActivate.dispatch(t, oed);
|
|
931
|
-
}
|
|
932
|
-
|
|
933
|
-
EditorManager._setActive(t);
|
|
934
|
-
},
|
|
935
|
-
|
|
936
|
-
/**
|
|
937
|
-
* Executes a legacy callback. This method is useful to call old 2.x option callbacks.
|
|
938
|
-
* There new event model is a better way to add callback so this method might be removed in the future.
|
|
939
|
-
*
|
|
940
|
-
* @param {String} n Name of the callback to execute.
|
|
941
|
-
* @return {Object} Return value passed from callback function.
|
|
942
|
-
*/
|
|
943
|
-
execCallback : function(n) {
|
|
944
|
-
var t = this, f = t.settings[n], s;
|
|
945
|
-
|
|
946
|
-
if (!f)
|
|
947
|
-
return;
|
|
948
|
-
|
|
949
|
-
// Look through lookup
|
|
950
|
-
if (t.callbackLookup && (s = t.callbackLookup[n])) {
|
|
951
|
-
f = s.func;
|
|
952
|
-
s = s.scope;
|
|
953
|
-
}
|
|
954
|
-
|
|
955
|
-
if (is(f, 'string')) {
|
|
956
|
-
s = f.replace(/\.\w+$/, '');
|
|
957
|
-
s = s ? tinymce.resolve(s) : 0;
|
|
958
|
-
f = tinymce.resolve(f);
|
|
959
|
-
t.callbackLookup = t.callbackLookup || {};
|
|
960
|
-
t.callbackLookup[n] = {func : f, scope : s};
|
|
961
|
-
}
|
|
962
|
-
|
|
963
|
-
return f.apply(s || t, Array.prototype.slice.call(arguments, 1));
|
|
964
|
-
},
|
|
965
|
-
|
|
966
|
-
/**
|
|
967
|
-
* Translates the specified string by replacing variables with language pack items it will also check if there is
|
|
968
|
-
* a key mathcin the input.
|
|
969
|
-
*
|
|
970
|
-
* @param {String} s String to translate by the language pack data.
|
|
971
|
-
* @return {String} Translated string.
|
|
972
|
-
*/
|
|
973
|
-
translate : function(s) {
|
|
974
|
-
var c = this.settings.language || 'en', i18n = EditorManager.i18n;
|
|
975
|
-
|
|
976
|
-
if (!s)
|
|
977
|
-
return '';
|
|
978
|
-
|
|
979
|
-
return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) {
|
|
980
|
-
return i18n[c + '.' + b] || '{#' + b + '}';
|
|
981
|
-
});
|
|
982
|
-
},
|
|
983
|
-
|
|
984
|
-
/**
|
|
985
|
-
* Returns a language pack item by name/key.
|
|
986
|
-
*
|
|
987
|
-
* @param {String} n Name/key to get from the language pack.
|
|
988
|
-
* @param {String} dv Optional default value to retrive.
|
|
989
|
-
*/
|
|
990
|
-
getLang : function(n, dv) {
|
|
991
|
-
return EditorManager.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}');
|
|
992
|
-
},
|
|
993
|
-
|
|
994
|
-
/**
|
|
995
|
-
* Returns a configuration parameter by name.
|
|
996
|
-
*
|
|
997
|
-
* @param {String} n Configruation parameter to retrive.
|
|
998
|
-
* @param {String} dv Optional default value to return.
|
|
999
|
-
* @param {String} ty Optional type parameter.
|
|
1000
|
-
* @return {String} Configuration parameter value or default value.
|
|
1001
|
-
*/
|
|
1002
|
-
getParam : function(n, dv, ty) {
|
|
1003
|
-
var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o;
|
|
1004
|
-
|
|
1005
|
-
if (ty === 'hash') {
|
|
1006
|
-
o = {};
|
|
1007
|
-
|
|
1008
|
-
if (is(v, 'string')) {
|
|
1009
|
-
each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) {
|
|
1010
|
-
v = v.split('=');
|
|
1011
|
-
|
|
1012
|
-
if (v.length > 1)
|
|
1013
|
-
o[tr(v[0])] = tr(v[1]);
|
|
1014
|
-
else
|
|
1015
|
-
o[tr(v[0])] = tr(v);
|
|
1016
|
-
});
|
|
1017
|
-
} else
|
|
1018
|
-
o = v;
|
|
1019
|
-
|
|
1020
|
-
return o;
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
return v;
|
|
1024
|
-
},
|
|
1025
|
-
|
|
1026
|
-
/**
|
|
1027
|
-
* Distpaches out a onNodeChange event to all observers. This method should be called when you
|
|
1028
|
-
* need to update the UI states or element path etc.
|
|
1029
|
-
*
|
|
1030
|
-
* @param {Object} o Optional object to pass along for the node changed event.
|
|
1031
|
-
*/
|
|
1032
|
-
nodeChanged : function(o) {
|
|
1033
|
-
var t = this, s = t.selection, n = s.getNode() || t.getBody();
|
|
1034
|
-
|
|
1035
|
-
// Fix for bug #1896577 it seems that this can not be fired while the editor is loading
|
|
1036
|
-
if (t.initialized) {
|
|
1037
|
-
t.onNodeChange.dispatch(
|
|
1038
|
-
t,
|
|
1039
|
-
o ? o.controlManager || t.controlManager : t.controlManager,
|
|
1040
|
-
isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n, // Fix for IE initial state
|
|
1041
|
-
s.isCollapsed(),
|
|
1042
|
-
o
|
|
1043
|
-
);
|
|
1044
|
-
}
|
|
1045
|
-
},
|
|
1046
|
-
|
|
1047
|
-
/**
|
|
1048
|
-
* Adds a button that later gets created by the ControlManager. This is a shorter and easier method
|
|
1049
|
-
* of adding buttons without the need to deal with the ControlManager directly. But it's also less
|
|
1050
|
-
* powerfull if you need more control use the ControlManagers factory methods instead.
|
|
1051
|
-
*
|
|
1052
|
-
* @param {String} n Button name to add.
|
|
1053
|
-
* @param {Object} s Settings object with title, cmd etc.
|
|
1054
|
-
*/
|
|
1055
|
-
addButton : function(n, s) {
|
|
1056
|
-
var t = this;
|
|
1057
|
-
|
|
1058
|
-
t.buttons = t.buttons || {};
|
|
1059
|
-
t.buttons[n] = s;
|
|
1060
|
-
},
|
|
1061
|
-
|
|
1062
|
-
/**
|
|
1063
|
-
* Adds a custom command to the editor, you can also override existing commands with this method.
|
|
1064
|
-
* The command that you add can be executed with execCommand.
|
|
1065
|
-
*
|
|
1066
|
-
* @param {String} n Command name to add/override.
|
|
1067
|
-
* @param {function} f Function to execute when the command occurs.
|
|
1068
|
-
* @param {Object} s Optional scope to execute the function in.
|
|
1069
|
-
*/
|
|
1070
|
-
addCommand : function(n, f, s) {
|
|
1071
|
-
this.execCommands[n] = {func : f, scope : s || this};
|
|
1072
|
-
},
|
|
1073
|
-
|
|
1074
|
-
/**
|
|
1075
|
-
* Adds a custom query state command to the editor, you can also override existing commands with this method.
|
|
1076
|
-
* The command that you add can be executed with queryCommandState function.
|
|
1077
|
-
*
|
|
1078
|
-
* @param {String} n Command name to add/override.
|
|
1079
|
-
* @param {function} f Function to execute when the command state retrival occurs.
|
|
1080
|
-
* @param {Object} s Optional scope to execute the function in.
|
|
1081
|
-
*/
|
|
1082
|
-
addQueryStateHandler : function(n, f, s) {
|
|
1083
|
-
this.queryStateCommands[n] = {func : f, scope : s || this};
|
|
1084
|
-
},
|
|
1085
|
-
|
|
1086
|
-
/**
|
|
1087
|
-
* Adds a custom query value command to the editor, you can also override existing commands with this method.
|
|
1088
|
-
* The command that you add can be executed with queryCommandValue function.
|
|
1089
|
-
*
|
|
1090
|
-
* @param {String} n Command name to add/override.
|
|
1091
|
-
* @param {function} f Function to execute when the command value retrival occurs.
|
|
1092
|
-
* @param {Object} s Optional scope to execute the function in.
|
|
1093
|
-
*/
|
|
1094
|
-
addQueryValueHandler : function(n, f, s) {
|
|
1095
|
-
this.queryValueCommands[n] = {func : f, scope : s || this};
|
|
1096
|
-
},
|
|
1097
|
-
|
|
1098
|
-
/**
|
|
1099
|
-
* Adds a keyboard shortcut for some command or function.
|
|
1100
|
-
*
|
|
1101
|
-
* @param {String} pa Shortcut pattern. Like for example: ctrl+alt+o.
|
|
1102
|
-
* @param {String} desc Text description for the command.
|
|
1103
|
-
* @param {String/Function} cmd_func Command name string or function to execute when the key is pressed.
|
|
1104
|
-
* @param {Object} sc Optional scope to execute the function in.
|
|
1105
|
-
* @return {bool} true/false state if the shortcut was added or not.
|
|
1106
|
-
*/
|
|
1107
|
-
addShortcut : function(pa, desc, cmd_func, sc) {
|
|
1108
|
-
var t = this, c;
|
|
1109
|
-
|
|
1110
|
-
if (!t.settings.custom_shortcuts)
|
|
1111
|
-
return false;
|
|
1112
|
-
|
|
1113
|
-
t.shortcuts = t.shortcuts || {};
|
|
1114
|
-
|
|
1115
|
-
if (is(cmd_func, 'string')) {
|
|
1116
|
-
c = cmd_func;
|
|
1117
|
-
|
|
1118
|
-
cmd_func = function() {
|
|
1119
|
-
t.execCommand(c, false, null);
|
|
1120
|
-
};
|
|
1121
|
-
}
|
|
1122
|
-
|
|
1123
|
-
if (is(cmd_func, 'object')) {
|
|
1124
|
-
c = cmd_func;
|
|
1125
|
-
|
|
1126
|
-
cmd_func = function() {
|
|
1127
|
-
t.execCommand(c[0], c[1], c[2]);
|
|
1128
|
-
};
|
|
1129
|
-
}
|
|
1130
|
-
|
|
1131
|
-
each(explode(pa), function(pa) {
|
|
1132
|
-
var o = {
|
|
1133
|
-
func : cmd_func,
|
|
1134
|
-
scope : sc || this,
|
|
1135
|
-
desc : desc,
|
|
1136
|
-
alt : false,
|
|
1137
|
-
ctrl : false,
|
|
1138
|
-
shift : false
|
|
1139
|
-
};
|
|
1140
|
-
|
|
1141
|
-
each(explode(pa, '+'), function(v) {
|
|
1142
|
-
switch (v) {
|
|
1143
|
-
case 'alt':
|
|
1144
|
-
case 'ctrl':
|
|
1145
|
-
case 'shift':
|
|
1146
|
-
o[v] = true;
|
|
1147
|
-
break;
|
|
1148
|
-
|
|
1149
|
-
default:
|
|
1150
|
-
o.charCode = v.charCodeAt(0);
|
|
1151
|
-
o.keyCode = v.toUpperCase().charCodeAt(0);
|
|
1152
|
-
}
|
|
1153
|
-
});
|
|
1154
|
-
|
|
1155
|
-
t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o;
|
|
1156
|
-
});
|
|
1157
|
-
|
|
1158
|
-
return true;
|
|
1159
|
-
},
|
|
1160
|
-
|
|
1161
|
-
/**
|
|
1162
|
-
* Executes a command on the current instance. These commands can be TinyMCE internal commands prefixed with "mce" or
|
|
1163
|
-
* they can be build in browser commands such as "Bold". A compleate list of browser commands is available on MSDN or Mozilla.org.
|
|
1164
|
-
* This function will dispatch the execCommand function on each plugin, theme or the execcommand_callback option if none of these
|
|
1165
|
-
* return true it will handle the command as a internal browser command.
|
|
1166
|
-
*
|
|
1167
|
-
* @param {String} cmd Command name to execute, for example mceLink or Bold.
|
|
1168
|
-
* @param {bool} ui True/false state if a UI (dialog) should be presented or not.
|
|
1169
|
-
* @param {mixed} val Optional command value, this can be anything.
|
|
1170
|
-
* @param {Object} a Optional arguments object.
|
|
1171
|
-
* @return {bool} True/false if the command was executed or not.
|
|
1172
|
-
*/
|
|
1173
|
-
execCommand : function(cmd, ui, val, a) {
|
|
1174
|
-
var t = this, s = 0, o, st;
|
|
1175
|
-
|
|
1176
|
-
if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus))
|
|
1177
|
-
t.focus();
|
|
1178
|
-
|
|
1179
|
-
o = {};
|
|
1180
|
-
t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o);
|
|
1181
|
-
if (o.terminate)
|
|
1182
|
-
return false;
|
|
1183
|
-
|
|
1184
|
-
// Command callback
|
|
1185
|
-
if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) {
|
|
1186
|
-
t.onExecCommand.dispatch(t, cmd, ui, val, a);
|
|
1187
|
-
return true;
|
|
1188
|
-
}
|
|
1189
|
-
|
|
1190
|
-
// Registred commands
|
|
1191
|
-
if (o = t.execCommands[cmd]) {
|
|
1192
|
-
st = o.func.call(o.scope, ui, val);
|
|
1193
|
-
|
|
1194
|
-
// Fall through on true
|
|
1195
|
-
if (st !== true) {
|
|
1196
|
-
t.onExecCommand.dispatch(t, cmd, ui, val, a);
|
|
1197
|
-
return st;
|
|
1198
|
-
}
|
|
1199
|
-
}
|
|
1200
|
-
|
|
1201
|
-
// Plugin commands
|
|
1202
|
-
each(t.plugins, function(p) {
|
|
1203
|
-
if (p.execCommand && p.execCommand(cmd, ui, val)) {
|
|
1204
|
-
t.onExecCommand.dispatch(t, cmd, ui, val, a);
|
|
1205
|
-
s = 1;
|
|
1206
|
-
return false;
|
|
1207
|
-
}
|
|
1208
|
-
});
|
|
1209
|
-
|
|
1210
|
-
if (s)
|
|
1211
|
-
return true;
|
|
1212
|
-
|
|
1213
|
-
// Theme commands
|
|
1214
|
-
if (t.theme && t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) {
|
|
1215
|
-
t.onExecCommand.dispatch(t, cmd, ui, val, a);
|
|
1216
|
-
return true;
|
|
1217
|
-
}
|
|
1218
|
-
|
|
1219
|
-
// Execute global commands
|
|
1220
|
-
if (tinymce.GlobalCommands.execCommand(t, cmd, ui, val)) {
|
|
1221
|
-
t.onExecCommand.dispatch(t, cmd, ui, val, a);
|
|
1222
|
-
return true;
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1225
|
-
// Editor commands
|
|
1226
|
-
if (t.editorCommands.execCommand(cmd, ui, val)) {
|
|
1227
|
-
t.onExecCommand.dispatch(t, cmd, ui, val, a);
|
|
1228
|
-
return true;
|
|
1229
|
-
}
|
|
1230
|
-
|
|
1231
|
-
// Browser commands
|
|
1232
|
-
t.getDoc().execCommand(cmd, ui, val);
|
|
1233
|
-
t.onExecCommand.dispatch(t, cmd, ui, val, a);
|
|
1234
|
-
},
|
|
1235
|
-
|
|
1236
|
-
/**
|
|
1237
|
-
* Returns a command specific state, for example if bold is enabled or not.
|
|
1238
|
-
*
|
|
1239
|
-
* @param {string} c Command to query state from.
|
|
1240
|
-
* @return {bool} Command specific state, for example if bold is enabled or not.
|
|
1241
|
-
*/
|
|
1242
|
-
queryCommandState : function(c) {
|
|
1243
|
-
var t = this, o, s;
|
|
1244
|
-
|
|
1245
|
-
// Is hidden then return undefined
|
|
1246
|
-
if (t._isHidden())
|
|
1247
|
-
return;
|
|
1248
|
-
|
|
1249
|
-
// Registred commands
|
|
1250
|
-
if (o = t.queryStateCommands[c]) {
|
|
1251
|
-
s = o.func.call(o.scope);
|
|
1252
|
-
|
|
1253
|
-
// Fall though on true
|
|
1254
|
-
if (s !== true)
|
|
1255
|
-
return s;
|
|
1256
|
-
}
|
|
1257
|
-
|
|
1258
|
-
// Registred commands
|
|
1259
|
-
o = t.editorCommands.queryCommandState(c);
|
|
1260
|
-
if (o !== -1)
|
|
1261
|
-
return o;
|
|
1262
|
-
|
|
1263
|
-
// Browser commands
|
|
1264
|
-
try {
|
|
1265
|
-
return this.getDoc().queryCommandState(c);
|
|
1266
|
-
} catch (ex) {
|
|
1267
|
-
// Fails sometimes see bug: 1896577
|
|
1268
|
-
}
|
|
1269
|
-
},
|
|
1270
|
-
|
|
1271
|
-
/**
|
|
1272
|
-
* Returns a command specific value, for example the current font size.
|
|
1273
|
-
*
|
|
1274
|
-
* @param {string} c Command to query value from.
|
|
1275
|
-
* @return {Object} Command specific value, for example the current font size.
|
|
1276
|
-
*/
|
|
1277
|
-
queryCommandValue : function(c) {
|
|
1278
|
-
var t = this, o, s;
|
|
1279
|
-
|
|
1280
|
-
// Is hidden then return undefined
|
|
1281
|
-
if (t._isHidden())
|
|
1282
|
-
return;
|
|
1283
|
-
|
|
1284
|
-
// Registred commands
|
|
1285
|
-
if (o = t.queryValueCommands[c]) {
|
|
1286
|
-
s = o.func.call(o.scope);
|
|
1287
|
-
|
|
1288
|
-
// Fall though on true
|
|
1289
|
-
if (s !== true)
|
|
1290
|
-
return s;
|
|
1291
|
-
}
|
|
1292
|
-
|
|
1293
|
-
// Registred commands
|
|
1294
|
-
o = t.editorCommands.queryCommandValue(c);
|
|
1295
|
-
if (is(o))
|
|
1296
|
-
return o;
|
|
1297
|
-
|
|
1298
|
-
// Browser commands
|
|
1299
|
-
try {
|
|
1300
|
-
return this.getDoc().queryCommandValue(c);
|
|
1301
|
-
} catch (ex) {
|
|
1302
|
-
// Fails sometimes see bug: 1896577
|
|
1303
|
-
}
|
|
1304
|
-
},
|
|
1305
|
-
|
|
1306
|
-
/**
|
|
1307
|
-
* Shows the editor and hides any textarea/div that the editor is supposed to replace.
|
|
1308
|
-
*/
|
|
1309
|
-
show : function() {
|
|
1310
|
-
var t = this;
|
|
1311
|
-
|
|
1312
|
-
DOM.show(t.getContainer());
|
|
1313
|
-
DOM.hide(t.id);
|
|
1314
|
-
t.load();
|
|
1315
|
-
},
|
|
1316
|
-
|
|
1317
|
-
/**
|
|
1318
|
-
* Hides the editor and shows any textarea/div that the editor is supposed to replace.
|
|
1319
|
-
*/
|
|
1320
|
-
hide : function() {
|
|
1321
|
-
var t = this, d = t.getDoc();
|
|
1322
|
-
|
|
1323
|
-
// Fixed bug where IE has a blinking cursor left from the editor
|
|
1324
|
-
if (isIE && d)
|
|
1325
|
-
d.execCommand('SelectAll');
|
|
1326
|
-
|
|
1327
|
-
// We must save before we hide so Safari doesn't crash
|
|
1328
|
-
t.save();
|
|
1329
|
-
DOM.hide(t.getContainer());
|
|
1330
|
-
DOM.setStyle(t.id, 'display', t.orgDisplay);
|
|
1331
|
-
},
|
|
1332
|
-
|
|
1333
|
-
/**
|
|
1334
|
-
* Returns true/false if the editor is hidden or not.
|
|
1335
|
-
*
|
|
1336
|
-
* @return {bool} True/false if the editor is hidden or not.
|
|
1337
|
-
*/
|
|
1338
|
-
isHidden : function() {
|
|
1339
|
-
return !DOM.isHidden(this.id);
|
|
1340
|
-
},
|
|
1341
|
-
|
|
1342
|
-
/**
|
|
1343
|
-
* Sets the progress state, this will display a throbber/progess for the editor.
|
|
1344
|
-
* This is ideal for asycronous operations like an AJAX save call.
|
|
1345
|
-
*
|
|
1346
|
-
* @param {bool} b Boolean state if the progress should be shown or hidden.
|
|
1347
|
-
* @param {Number} ti Optional time to wait before the progress gets shown.
|
|
1348
|
-
* @param {Object} o Optional object to pass to the progress observers.
|
|
1349
|
-
* @return {bool} Same as the input state.
|
|
1350
|
-
*/
|
|
1351
|
-
setProgressState : function(b, ti, o) {
|
|
1352
|
-
this.onSetProgressState.dispatch(this, b, ti, o);
|
|
1353
|
-
|
|
1354
|
-
return b;
|
|
1355
|
-
},
|
|
1356
|
-
|
|
1357
|
-
/**
|
|
1358
|
-
* Loads contents from the textarea or div element that got converted into an editor instance.
|
|
1359
|
-
* This method will move the contents from that textarea or div into the editor by using setContent
|
|
1360
|
-
* so all events etc that method has will get dispatched as well.
|
|
1361
|
-
*
|
|
1362
|
-
* @param {Object} o Optional content object, this gets passed around through the whole load process.
|
|
1363
|
-
* @return {String} HTML string that got set into the editor.
|
|
1364
|
-
*/
|
|
1365
|
-
load : function(o) {
|
|
1366
|
-
var t = this, e = t.getElement(), h;
|
|
1367
|
-
|
|
1368
|
-
if (e) {
|
|
1369
|
-
o = o || {};
|
|
1370
|
-
o.load = true;
|
|
1371
|
-
|
|
1372
|
-
// Double encode existing entities in the value
|
|
1373
|
-
h = t.setContent(is(e.value) ? e.value : e.innerHTML, o);
|
|
1374
|
-
o.element = e;
|
|
1375
|
-
|
|
1376
|
-
if (!o.no_events)
|
|
1377
|
-
t.onLoadContent.dispatch(t, o);
|
|
1378
|
-
|
|
1379
|
-
o.element = e = null;
|
|
1380
|
-
|
|
1381
|
-
return h;
|
|
1382
|
-
}
|
|
1383
|
-
},
|
|
1384
|
-
|
|
1385
|
-
/**
|
|
1386
|
-
* Saves the contents from a editor out to the textarea or div element that got converted into an editor instance.
|
|
1387
|
-
* This method will move the HTML contents from the editor into that textarea or div by getContent
|
|
1388
|
-
* so all events etc that method has will get dispatched as well.
|
|
1389
|
-
*
|
|
1390
|
-
* @param {Object} o Optional content object, this gets passed around through the whole save process.
|
|
1391
|
-
* @return {String} HTML string that got set into the textarea/div.
|
|
1392
|
-
*/
|
|
1393
|
-
save : function(o) {
|
|
1394
|
-
var t = this, e = t.getElement(), h, f;
|
|
1395
|
-
|
|
1396
|
-
if (!e || !t.initialized)
|
|
1397
|
-
return;
|
|
1398
|
-
|
|
1399
|
-
o = o || {};
|
|
1400
|
-
o.save = true;
|
|
1401
|
-
|
|
1402
|
-
// Add undo level will trigger onchange event
|
|
1403
|
-
if (!o.no_events) {
|
|
1404
|
-
t.undoManager.typing = 0;
|
|
1405
|
-
t.undoManager.add();
|
|
1406
|
-
}
|
|
1407
|
-
|
|
1408
|
-
o.element = e;
|
|
1409
|
-
h = o.content = t.getContent(o);
|
|
1410
|
-
|
|
1411
|
-
if (!o.no_events)
|
|
1412
|
-
t.onSaveContent.dispatch(t, o);
|
|
1413
|
-
|
|
1414
|
-
h = o.content;
|
|
1415
|
-
|
|
1416
|
-
if (!/TEXTAREA|INPUT/i.test(e.nodeName)) {
|
|
1417
|
-
e.innerHTML = h;
|
|
1418
|
-
|
|
1419
|
-
// Update hidden form element
|
|
1420
|
-
if (f = DOM.getParent(t.id, 'form')) {
|
|
1421
|
-
each(f.elements, function(e) {
|
|
1422
|
-
if (e.name == t.id) {
|
|
1423
|
-
e.value = h;
|
|
1424
|
-
return false;
|
|
1425
|
-
}
|
|
1426
|
-
});
|
|
1427
|
-
}
|
|
1428
|
-
} else
|
|
1429
|
-
e.value = h;
|
|
1430
|
-
|
|
1431
|
-
o.element = e = null;
|
|
1432
|
-
|
|
1433
|
-
return h;
|
|
1434
|
-
},
|
|
1435
|
-
|
|
1436
|
-
/**
|
|
1437
|
-
* Sets the specified content to the editor instance, this will cleanup the content before it gets set using
|
|
1438
|
-
* the different cleanup rules options.
|
|
1439
|
-
*
|
|
1440
|
-
* @param {String} h Content to set to editor, normally HTML contents but can be other formats as well.
|
|
1441
|
-
* @param {Object} o Optional content object, this gets passed around through the whole set process.
|
|
1442
|
-
* @return {String} HTML string that got set into the editor.
|
|
1443
|
-
*/
|
|
1444
|
-
setContent : function(h, o) {
|
|
1445
|
-
var t = this;
|
|
1446
|
-
|
|
1447
|
-
o = o || {};
|
|
1448
|
-
o.format = o.format || 'html';
|
|
1449
|
-
o.set = true;
|
|
1450
|
-
o.content = h;
|
|
1451
|
-
|
|
1452
|
-
if (!o.no_events)
|
|
1453
|
-
t.onBeforeSetContent.dispatch(t, o);
|
|
1454
|
-
|
|
1455
|
-
// Padd empty content in Gecko and Safari. Commands will otherwise fail on the content
|
|
1456
|
-
// It will also be impossible to place the caret in the editor unless there is a BR element present
|
|
1457
|
-
if (!tinymce.isIE && (h.length === 0 || /^\s+$/.test(h))) {
|
|
1458
|
-
o.content = t.dom.setHTML(t.getBody(), '<br mce_bogus="1" />');
|
|
1459
|
-
o.format = 'raw';
|
|
1460
|
-
}
|
|
1461
|
-
|
|
1462
|
-
o.content = t.dom.setHTML(t.getBody(), tinymce.trim(o.content));
|
|
1463
|
-
|
|
1464
|
-
if (o.format != 'raw' && t.settings.cleanup) {
|
|
1465
|
-
o.getInner = true;
|
|
1466
|
-
o.content = t.dom.setHTML(t.getBody(), t.serializer.serialize(t.getBody(), o));
|
|
1467
|
-
}
|
|
1468
|
-
|
|
1469
|
-
if (!o.no_events)
|
|
1470
|
-
t.onSetContent.dispatch(t, o);
|
|
1471
|
-
|
|
1472
|
-
return o.content;
|
|
1473
|
-
},
|
|
1474
|
-
|
|
1475
|
-
/**
|
|
1476
|
-
* Gets the content from the editor instance, this will cleanup the content before it gets returned using
|
|
1477
|
-
* the different cleanup rules options.
|
|
1478
|
-
*
|
|
1479
|
-
* @param {Object} o Optional content object, this gets passed around through the whole get process.
|
|
1480
|
-
* @return {String} Cleaned content string, normally HTML contents.
|
|
1481
|
-
*/
|
|
1482
|
-
getContent : function(o) {
|
|
1483
|
-
var t = this, h;
|
|
1484
|
-
|
|
1485
|
-
o = o || {};
|
|
1486
|
-
o.format = o.format || 'html';
|
|
1487
|
-
o.get = true;
|
|
1488
|
-
|
|
1489
|
-
if (!o.no_events)
|
|
1490
|
-
t.onBeforeGetContent.dispatch(t, o);
|
|
1491
|
-
|
|
1492
|
-
if (o.format != 'raw' && t.settings.cleanup) {
|
|
1493
|
-
o.getInner = true;
|
|
1494
|
-
h = t.serializer.serialize(t.getBody(), o);
|
|
1495
|
-
} else
|
|
1496
|
-
h = t.getBody().innerHTML;
|
|
1497
|
-
|
|
1498
|
-
h = h.replace(/^\s*|\s*$/g, '');
|
|
1499
|
-
o.content = h;
|
|
1500
|
-
|
|
1501
|
-
if (!o.no_events)
|
|
1502
|
-
t.onGetContent.dispatch(t, o);
|
|
1503
|
-
|
|
1504
|
-
return o.content;
|
|
1505
|
-
},
|
|
1506
|
-
|
|
1507
|
-
/**
|
|
1508
|
-
* Returns true/false if the editor is dirty or not. It will get dirty if the user has made modifications to the contents.
|
|
1509
|
-
*
|
|
1510
|
-
* @return {bool} True/false if the editor is dirty or not. It will get dirty if the user has made modifications to the contents.
|
|
1511
|
-
*/
|
|
1512
|
-
isDirty : function() {
|
|
1513
|
-
var t = this;
|
|
1514
|
-
|
|
1515
|
-
return tinymce.trim(t.startContent) != tinymce.trim(t.getContent({format : 'raw', no_events : 1})) && !t.isNotDirty;
|
|
1516
|
-
},
|
|
1517
|
-
|
|
1518
|
-
/**
|
|
1519
|
-
* Returns the editors container element. The container element wrappes in
|
|
1520
|
-
* all the elements added to the page for the editor. Such as UI, iframe etc.
|
|
1521
|
-
*
|
|
1522
|
-
* @return {Element} HTML DOM element for the editor container.
|
|
1523
|
-
*/
|
|
1524
|
-
getContainer : function() {
|
|
1525
|
-
var t = this;
|
|
1526
|
-
|
|
1527
|
-
if (!t.container)
|
|
1528
|
-
t.container = DOM.get(t.editorContainer || t.id + '_parent');
|
|
1529
|
-
|
|
1530
|
-
return t.container;
|
|
1531
|
-
},
|
|
1532
|
-
|
|
1533
|
-
/**
|
|
1534
|
-
* Returns the editors content area container element. The this element is the one who
|
|
1535
|
-
* holds the iframe or the editable element.
|
|
1536
|
-
*
|
|
1537
|
-
* @return {Element} HTML DOM element for the editor area container.
|
|
1538
|
-
*/
|
|
1539
|
-
getContentAreaContainer : function() {
|
|
1540
|
-
return this.contentAreaContainer;
|
|
1541
|
-
},
|
|
1542
|
-
|
|
1543
|
-
/**
|
|
1544
|
-
* Returns the target element/textarea that got replaced with a TinyMCE editor instance.
|
|
1545
|
-
*
|
|
1546
|
-
* @return {Element} HTML DOM element for the replaced element.
|
|
1547
|
-
*/
|
|
1548
|
-
getElement : function() {
|
|
1549
|
-
return DOM.get(this.settings.content_element || this.id);
|
|
1550
|
-
},
|
|
1551
|
-
|
|
1552
|
-
/**
|
|
1553
|
-
* Returns the iframes window object.
|
|
1554
|
-
*
|
|
1555
|
-
* @return {Window} Iframe DOM window object.
|
|
1556
|
-
*/
|
|
1557
|
-
getWin : function() {
|
|
1558
|
-
var t = this, e;
|
|
1559
|
-
|
|
1560
|
-
if (!t.contentWindow) {
|
|
1561
|
-
e = DOM.get(t.id + "_ifr");
|
|
1562
|
-
|
|
1563
|
-
if (e)
|
|
1564
|
-
t.contentWindow = e.contentWindow;
|
|
1565
|
-
}
|
|
1566
|
-
|
|
1567
|
-
return t.contentWindow;
|
|
1568
|
-
},
|
|
1569
|
-
|
|
1570
|
-
/**
|
|
1571
|
-
* Returns the iframes document object.
|
|
1572
|
-
*
|
|
1573
|
-
* @return {Document} Iframe DOM document object.
|
|
1574
|
-
*/
|
|
1575
|
-
getDoc : function() {
|
|
1576
|
-
var t = this, w;
|
|
1577
|
-
|
|
1578
|
-
if (!t.contentDocument) {
|
|
1579
|
-
w = t.getWin();
|
|
1580
|
-
|
|
1581
|
-
if (w)
|
|
1582
|
-
t.contentDocument = w.document;
|
|
1583
|
-
}
|
|
1584
|
-
|
|
1585
|
-
return t.contentDocument;
|
|
1586
|
-
},
|
|
1587
|
-
|
|
1588
|
-
/**
|
|
1589
|
-
* Returns the iframes body element.
|
|
1590
|
-
*
|
|
1591
|
-
* @return {Element} Iframe body element.
|
|
1592
|
-
*/
|
|
1593
|
-
getBody : function() {
|
|
1594
|
-
return this.bodyElement || this.getDoc().body;
|
|
1595
|
-
},
|
|
1596
|
-
|
|
1597
|
-
/**
|
|
1598
|
-
* URL converter function this gets executed each time a user adds an img, a or
|
|
1599
|
-
* any other element that has a URL in it. This will be called both by the DOM and HTML
|
|
1600
|
-
* manipulation functions.
|
|
1601
|
-
*
|
|
1602
|
-
* @param {string} u URL to convert.
|
|
1603
|
-
* @param {string} n Attribute name src, href etc.
|
|
1604
|
-
* @param {string/HTMLElement} Tag name or HTML DOM element depending on HTML or DOM insert.
|
|
1605
|
-
* @return {string} Converted URL string.
|
|
1606
|
-
*/
|
|
1607
|
-
convertURL : function(u, n, e) {
|
|
1608
|
-
var t = this, s = t.settings;
|
|
1609
|
-
|
|
1610
|
-
// Use callback instead
|
|
1611
|
-
if (s.urlconverter_callback)
|
|
1612
|
-
return t.execCallback('urlconverter_callback', u, e, true, n);
|
|
1613
|
-
|
|
1614
|
-
// Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs
|
|
1615
|
-
if (!s.convert_urls || (e && e.nodeName == 'LINK') || u.indexOf('file:') === 0)
|
|
1616
|
-
return u;
|
|
1617
|
-
|
|
1618
|
-
// Convert to relative
|
|
1619
|
-
if (s.relative_urls)
|
|
1620
|
-
return t.documentBaseURI.toRelative(u);
|
|
1621
|
-
|
|
1622
|
-
// Convert to absolute
|
|
1623
|
-
u = t.documentBaseURI.toAbsolute(u, s.remove_script_host);
|
|
1624
|
-
|
|
1625
|
-
return u;
|
|
1626
|
-
},
|
|
1627
|
-
|
|
1628
|
-
/**
|
|
1629
|
-
* Adds visual aid for tables, anchors etc so they can be more easily edited inside the editor.
|
|
1630
|
-
*
|
|
1631
|
-
* @param {Element} e Optional root element to loop though to find tables etc that needs the visual aid.
|
|
1632
|
-
*/
|
|
1633
|
-
addVisual : function(e) {
|
|
1634
|
-
var t = this, s = t.settings;
|
|
1635
|
-
|
|
1636
|
-
e = e || t.getBody();
|
|
1637
|
-
|
|
1638
|
-
if (!is(t.hasVisual))
|
|
1639
|
-
t.hasVisual = s.visual;
|
|
1640
|
-
|
|
1641
|
-
each(t.dom.select('table,a', e), function(e) {
|
|
1642
|
-
var v;
|
|
1643
|
-
|
|
1644
|
-
switch (e.nodeName) {
|
|
1645
|
-
case 'TABLE':
|
|
1646
|
-
v = t.dom.getAttrib(e, 'border');
|
|
1647
|
-
|
|
1648
|
-
if (!v || v == '0') {
|
|
1649
|
-
if (t.hasVisual)
|
|
1650
|
-
t.dom.addClass(e, s.visual_table_class);
|
|
1651
|
-
else
|
|
1652
|
-
t.dom.removeClass(e, s.visual_table_class);
|
|
1653
|
-
}
|
|
1654
|
-
|
|
1655
|
-
return;
|
|
1656
|
-
|
|
1657
|
-
case 'A':
|
|
1658
|
-
v = t.dom.getAttrib(e, 'name');
|
|
1659
|
-
|
|
1660
|
-
if (v) {
|
|
1661
|
-
if (t.hasVisual)
|
|
1662
|
-
t.dom.addClass(e, 'mceItemAnchor');
|
|
1663
|
-
else
|
|
1664
|
-
t.dom.removeClass(e, 'mceItemAnchor');
|
|
1665
|
-
}
|
|
1666
|
-
|
|
1667
|
-
return;
|
|
1668
|
-
}
|
|
1669
|
-
});
|
|
1670
|
-
|
|
1671
|
-
t.onVisualAid.dispatch(t, e, t.hasVisual);
|
|
1672
|
-
},
|
|
1673
|
-
|
|
1674
|
-
/**
|
|
1675
|
-
* Removes the editor from the dom and EditorManager collection.
|
|
1676
|
-
*/
|
|
1677
|
-
remove : function() {
|
|
1678
|
-
var t = this, e = t.getContainer();
|
|
1679
|
-
|
|
1680
|
-
t.removed = 1; // Cancels post remove event execution
|
|
1681
|
-
t.hide();
|
|
1682
|
-
|
|
1683
|
-
t.execCallback('remove_instance_callback', t);
|
|
1684
|
-
t.onRemove.dispatch(t);
|
|
1685
|
-
|
|
1686
|
-
// Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command
|
|
1687
|
-
t.onExecCommand.listeners = [];
|
|
1688
|
-
|
|
1689
|
-
EditorManager.remove(t);
|
|
1690
|
-
DOM.remove(e);
|
|
1691
|
-
},
|
|
1692
|
-
|
|
1693
|
-
/**
|
|
1694
|
-
* Destroys the editor instance by removing all events, element references or other resources
|
|
1695
|
-
* that could leak memory. This method will be called automatically when the page is unloaded
|
|
1696
|
-
* but you can also call it directly if you know what you are doing.
|
|
1697
|
-
*
|
|
1698
|
-
* @param {bool} s Optional state if the destroy is an automatic destroy or user called one.
|
|
1699
|
-
*/
|
|
1700
|
-
destroy : function(s) {
|
|
1701
|
-
var t = this;
|
|
1702
|
-
|
|
1703
|
-
// One time is enough
|
|
1704
|
-
if (t.destroyed)
|
|
1705
|
-
return;
|
|
1706
|
-
|
|
1707
|
-
if (!s) {
|
|
1708
|
-
tinymce.removeUnload(t.destroy);
|
|
1709
|
-
tinyMCE.onBeforeUnload.remove(t._beforeUnload);
|
|
1710
|
-
|
|
1711
|
-
// Manual destroy
|
|
1712
|
-
if (t.theme && t.theme.destroy)
|
|
1713
|
-
t.theme.destroy();
|
|
1714
|
-
|
|
1715
|
-
// Destroy controls, selection and dom
|
|
1716
|
-
t.controlManager.destroy();
|
|
1717
|
-
t.selection.destroy();
|
|
1718
|
-
t.dom.destroy();
|
|
1719
|
-
|
|
1720
|
-
// Remove all events
|
|
1721
|
-
|
|
1722
|
-
// Don't clear the window or document if content editable
|
|
1723
|
-
// is enabled since other instances might still be present
|
|
1724
|
-
if (!t.settings.content_editable) {
|
|
1725
|
-
Event.clear(t.getWin());
|
|
1726
|
-
Event.clear(t.getDoc());
|
|
1727
|
-
}
|
|
1728
|
-
|
|
1729
|
-
Event.clear(t.getBody());
|
|
1730
|
-
Event.clear(t.formElement);
|
|
1731
|
-
}
|
|
1732
|
-
|
|
1733
|
-
if (t.formElement) {
|
|
1734
|
-
t.formElement.submit = t.formElement._mceOldSubmit;
|
|
1735
|
-
t.formElement._mceOldSubmit = null;
|
|
1736
|
-
}
|
|
1737
|
-
|
|
1738
|
-
t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null;
|
|
1739
|
-
|
|
1740
|
-
if (t.selection)
|
|
1741
|
-
t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null;
|
|
1742
|
-
|
|
1743
|
-
t.destroyed = 1;
|
|
1744
|
-
},
|
|
1745
|
-
|
|
1746
|
-
// Internal functions
|
|
1747
|
-
|
|
1748
|
-
_addEvents : function() {
|
|
1749
|
-
// 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset
|
|
1750
|
-
var t = this, i, s = t.settings, lo = {
|
|
1751
|
-
mouseup : 'onMouseUp',
|
|
1752
|
-
mousedown : 'onMouseDown',
|
|
1753
|
-
click : 'onClick',
|
|
1754
|
-
keyup : 'onKeyUp',
|
|
1755
|
-
keydown : 'onKeyDown',
|
|
1756
|
-
keypress : 'onKeyPress',
|
|
1757
|
-
submit : 'onSubmit',
|
|
1758
|
-
reset : 'onReset',
|
|
1759
|
-
contextmenu : 'onContextMenu',
|
|
1760
|
-
dblclick : 'onDblClick',
|
|
1761
|
-
paste : 'onPaste' // Doesn't work in all browsers yet
|
|
1762
|
-
};
|
|
1763
|
-
|
|
1764
|
-
function eventHandler(e, o) {
|
|
1765
|
-
var ty = e.type;
|
|
1766
|
-
|
|
1767
|
-
// Don't fire events when it's removed
|
|
1768
|
-
if (t.removed)
|
|
1769
|
-
return;
|
|
1770
|
-
|
|
1771
|
-
// Generic event handler
|
|
1772
|
-
if (t.onEvent.dispatch(t, e, o) !== false) {
|
|
1773
|
-
// Specific event handler
|
|
1774
|
-
t[lo[e.fakeType || e.type]].dispatch(t, e, o);
|
|
1775
|
-
}
|
|
1776
|
-
};
|
|
1777
|
-
|
|
1778
|
-
// Add DOM events
|
|
1779
|
-
each(lo, function(v, k) {
|
|
1780
|
-
switch (k) {
|
|
1781
|
-
case 'contextmenu':
|
|
1782
|
-
if (tinymce.isOpera) {
|
|
1783
|
-
// Fake contextmenu on Opera
|
|
1784
|
-
t.dom.bind(t.getBody(), 'mousedown', function(e) {
|
|
1785
|
-
if (e.ctrlKey) {
|
|
1786
|
-
e.fakeType = 'contextmenu';
|
|
1787
|
-
eventHandler(e);
|
|
1788
|
-
}
|
|
1789
|
-
});
|
|
1790
|
-
} else
|
|
1791
|
-
t.dom.bind(t.getBody(), k, eventHandler);
|
|
1792
|
-
break;
|
|
1793
|
-
|
|
1794
|
-
case 'paste':
|
|
1795
|
-
t.dom.bind(t.getBody(), k, function(e) {
|
|
1796
|
-
eventHandler(e);
|
|
1797
|
-
});
|
|
1798
|
-
break;
|
|
1799
|
-
|
|
1800
|
-
case 'submit':
|
|
1801
|
-
case 'reset':
|
|
1802
|
-
t.dom.bind(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler);
|
|
1803
|
-
break;
|
|
1804
|
-
|
|
1805
|
-
default:
|
|
1806
|
-
t.dom.bind(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler);
|
|
1807
|
-
}
|
|
1808
|
-
});
|
|
1809
|
-
|
|
1810
|
-
t.dom.bind(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) {
|
|
1811
|
-
t.focus(true);
|
|
1812
|
-
});
|
|
1813
|
-
|
|
1814
|
-
// #ifdef contentEditable
|
|
1815
|
-
|
|
1816
|
-
if (s.content_editable && tinymce.isOpera) {
|
|
1817
|
-
// Opera doesn't support focus event for contentEditable elements so we need to fake it
|
|
1818
|
-
function doFocus(e) {
|
|
1819
|
-
t.focus(true);
|
|
1820
|
-
};
|
|
1821
|
-
|
|
1822
|
-
t.dom.bind(t.getBody(), 'click', doFocus);
|
|
1823
|
-
t.dom.bind(t.getBody(), 'keydown', doFocus);
|
|
1824
|
-
}
|
|
1825
|
-
|
|
1826
|
-
// #endif
|
|
1827
|
-
|
|
1828
|
-
// Fixes bug where a specified document_base_uri could result in broken images
|
|
1829
|
-
// This will also fix drag drop of images in Gecko
|
|
1830
|
-
if (tinymce.isGecko) {
|
|
1831
|
-
// Convert all images to absolute URLs
|
|
1832
|
-
/* t.onSetContent.add(function(ed, o) {
|
|
1833
|
-
each(ed.dom.select('img'), function(e) {
|
|
1834
|
-
var v;
|
|
1835
|
-
|
|
1836
|
-
if (v = e.getAttribute('mce_src'))
|
|
1837
|
-
e.src = t.documentBaseURI.toAbsolute(v);
|
|
1838
|
-
})
|
|
1839
|
-
});*/
|
|
1840
|
-
|
|
1841
|
-
t.dom.bind(t.getDoc(), 'DOMNodeInserted', function(e) {
|
|
1842
|
-
var v;
|
|
1843
|
-
|
|
1844
|
-
e = e.target;
|
|
1845
|
-
|
|
1846
|
-
if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('mce_src')))
|
|
1847
|
-
e.src = t.documentBaseURI.toAbsolute(v);
|
|
1848
|
-
});
|
|
1849
|
-
}
|
|
1850
|
-
|
|
1851
|
-
// Set various midas options in Gecko
|
|
1852
|
-
if (isGecko) {
|
|
1853
|
-
function setOpts() {
|
|
1854
|
-
var t = this, d = t.getDoc(), s = t.settings;
|
|
1855
|
-
|
|
1856
|
-
if (isGecko && !s.readonly) {
|
|
1857
|
-
if (t._isHidden()) {
|
|
1858
|
-
try {
|
|
1859
|
-
if (!s.content_editable)
|
|
1860
|
-
d.designMode = 'On';
|
|
1861
|
-
} catch (ex) {
|
|
1862
|
-
// Fails if it's hidden
|
|
1863
|
-
}
|
|
1864
|
-
}
|
|
1865
|
-
|
|
1866
|
-
try {
|
|
1867
|
-
// Try new Gecko method
|
|
1868
|
-
d.execCommand("styleWithCSS", 0, false);
|
|
1869
|
-
} catch (ex) {
|
|
1870
|
-
// Use old method
|
|
1871
|
-
if (!t._isHidden())
|
|
1872
|
-
try {d.execCommand("useCSS", 0, true);} catch (ex) {}
|
|
1873
|
-
}
|
|
1874
|
-
|
|
1875
|
-
if (!s.table_inline_editing)
|
|
1876
|
-
try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {}
|
|
1877
|
-
|
|
1878
|
-
if (!s.object_resizing)
|
|
1879
|
-
try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {}
|
|
1880
|
-
}
|
|
1881
|
-
};
|
|
1882
|
-
|
|
1883
|
-
t.onBeforeExecCommand.add(setOpts);
|
|
1884
|
-
t.onMouseDown.add(setOpts);
|
|
1885
|
-
}
|
|
1886
|
-
|
|
1887
|
-
// Add node change handlers
|
|
1888
|
-
t.onMouseUp.add(t.nodeChanged);
|
|
1889
|
-
t.onClick.add(t.nodeChanged);
|
|
1890
|
-
t.onKeyUp.add(function(ed, e) {
|
|
1891
|
-
var c = e.keyCode;
|
|
1892
|
-
|
|
1893
|
-
if ((c >= 33 && c <= 36) || (c >= 37 && c <= 40) || c == 13 || c == 45 || c == 46 || c == 8 || (tinymce.isMac && (c == 91 || c == 93)) || e.ctrlKey)
|
|
1894
|
-
t.nodeChanged();
|
|
1895
|
-
});
|
|
1896
|
-
|
|
1897
|
-
// Add reset handler
|
|
1898
|
-
t.onReset.add(function() {
|
|
1899
|
-
t.setContent(t.startContent, {format : 'raw'});
|
|
1900
|
-
});
|
|
1901
|
-
|
|
1902
|
-
// Add shortcuts
|
|
1903
|
-
if (s.custom_shortcuts) {
|
|
1904
|
-
if (s.custom_undo_redo_keyboard_shortcuts) {
|
|
1905
|
-
t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo');
|
|
1906
|
-
t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo');
|
|
1907
|
-
}
|
|
1908
|
-
|
|
1909
|
-
// Add default shortcuts for gecko
|
|
1910
|
-
if (isGecko) {
|
|
1911
|
-
t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold');
|
|
1912
|
-
t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic');
|
|
1913
|
-
t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline');
|
|
1914
|
-
}
|
|
1915
|
-
|
|
1916
|
-
// BlockFormat shortcuts keys
|
|
1917
|
-
for (i=1; i<=6; i++)
|
|
1918
|
-
t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, '<h' + i + '>']);
|
|
1919
|
-
|
|
1920
|
-
t.addShortcut('ctrl+7', '', ['FormatBlock', false, '<p>']);
|
|
1921
|
-
t.addShortcut('ctrl+8', '', ['FormatBlock', false, '<div>']);
|
|
1922
|
-
t.addShortcut('ctrl+9', '', ['FormatBlock', false, '<address>']);
|
|
1923
|
-
|
|
1924
|
-
function find(e) {
|
|
1925
|
-
var v = null;
|
|
1926
|
-
|
|
1927
|
-
if (!e.altKey && !e.ctrlKey && !e.metaKey)
|
|
1928
|
-
return v;
|
|
1929
|
-
|
|
1930
|
-
each(t.shortcuts, function(o) {
|
|
1931
|
-
if (tinymce.isMac && o.ctrl != e.metaKey)
|
|
1932
|
-
return;
|
|
1933
|
-
else if (!tinymce.isMac && o.ctrl != e.ctrlKey)
|
|
1934
|
-
return;
|
|
1935
|
-
|
|
1936
|
-
if (o.alt != e.altKey)
|
|
1937
|
-
return;
|
|
1938
|
-
|
|
1939
|
-
if (o.shift != e.shiftKey)
|
|
1940
|
-
return;
|
|
1941
|
-
|
|
1942
|
-
if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) {
|
|
1943
|
-
v = o;
|
|
1944
|
-
return false;
|
|
1945
|
-
}
|
|
1946
|
-
});
|
|
1947
|
-
|
|
1948
|
-
return v;
|
|
1949
|
-
};
|
|
1950
|
-
|
|
1951
|
-
t.onKeyUp.add(function(ed, e) {
|
|
1952
|
-
var o = find(e);
|
|
1953
|
-
|
|
1954
|
-
if (o)
|
|
1955
|
-
return Event.cancel(e);
|
|
1956
|
-
});
|
|
1957
|
-
|
|
1958
|
-
t.onKeyPress.add(function(ed, e) {
|
|
1959
|
-
var o = find(e);
|
|
1960
|
-
|
|
1961
|
-
if (o)
|
|
1962
|
-
return Event.cancel(e);
|
|
1963
|
-
});
|
|
1964
|
-
|
|
1965
|
-
t.onKeyDown.add(function(ed, e) {
|
|
1966
|
-
var o = find(e);
|
|
1967
|
-
|
|
1968
|
-
if (o) {
|
|
1969
|
-
o.func.call(o.scope);
|
|
1970
|
-
return Event.cancel(e);
|
|
1971
|
-
}
|
|
1972
|
-
});
|
|
1973
|
-
}
|
|
1974
|
-
|
|
1975
|
-
if (tinymce.isIE) {
|
|
1976
|
-
// Fix so resize will only update the width and height attributes not the styles of an image
|
|
1977
|
-
// It will also block mceItemNoResize items
|
|
1978
|
-
t.dom.bind(t.getDoc(), 'controlselect', function(e) {
|
|
1979
|
-
var re = t.resizeInfo, cb;
|
|
1980
|
-
|
|
1981
|
-
e = e.target;
|
|
1982
|
-
|
|
1983
|
-
// Don't do this action for non image elements
|
|
1984
|
-
if (e.nodeName !== 'IMG')
|
|
1985
|
-
return;
|
|
1986
|
-
|
|
1987
|
-
if (re)
|
|
1988
|
-
t.dom.unbind(re.node, re.ev, re.cb);
|
|
1989
|
-
|
|
1990
|
-
if (!t.dom.hasClass(e, 'mceItemNoResize')) {
|
|
1991
|
-
ev = 'resizeend';
|
|
1992
|
-
cb = t.dom.bind(e, ev, function(e) {
|
|
1993
|
-
var v;
|
|
1994
|
-
|
|
1995
|
-
e = e.target;
|
|
1996
|
-
|
|
1997
|
-
if (v = t.dom.getStyle(e, 'width')) {
|
|
1998
|
-
t.dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, ''));
|
|
1999
|
-
t.dom.setStyle(e, 'width', '');
|
|
2000
|
-
}
|
|
2001
|
-
|
|
2002
|
-
if (v = t.dom.getStyle(e, 'height')) {
|
|
2003
|
-
t.dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, ''));
|
|
2004
|
-
t.dom.setStyle(e, 'height', '');
|
|
2005
|
-
}
|
|
2006
|
-
});
|
|
2007
|
-
} else {
|
|
2008
|
-
ev = 'resizestart';
|
|
2009
|
-
cb = t.dom.bind(e, 'resizestart', Event.cancel, Event);
|
|
2010
|
-
}
|
|
2011
|
-
|
|
2012
|
-
re = t.resizeInfo = {
|
|
2013
|
-
node : e,
|
|
2014
|
-
ev : ev,
|
|
2015
|
-
cb : cb
|
|
2016
|
-
};
|
|
2017
|
-
});
|
|
2018
|
-
|
|
2019
|
-
t.onKeyDown.add(function(ed, e) {
|
|
2020
|
-
switch (e.keyCode) {
|
|
2021
|
-
case 8:
|
|
2022
|
-
// Fix IE control + backspace browser bug
|
|
2023
|
-
if (t.selection.getRng().item) {
|
|
2024
|
-
t.selection.getRng().item(0).removeNode();
|
|
2025
|
-
return Event.cancel(e);
|
|
2026
|
-
}
|
|
2027
|
-
}
|
|
2028
|
-
});
|
|
2029
|
-
|
|
2030
|
-
/*if (t.dom.boxModel) {
|
|
2031
|
-
t.getBody().style.height = '100%';
|
|
2032
|
-
|
|
2033
|
-
Event.add(t.getWin(), 'resize', function(e) {
|
|
2034
|
-
var docElm = t.getDoc().documentElement;
|
|
2035
|
-
|
|
2036
|
-
docElm.style.height = (docElm.offsetHeight - 10) + 'px';
|
|
2037
|
-
});
|
|
2038
|
-
}*/
|
|
2039
|
-
}
|
|
2040
|
-
|
|
2041
|
-
if (tinymce.isOpera) {
|
|
2042
|
-
t.onClick.add(function(ed, e) {
|
|
2043
|
-
Event.prevent(e);
|
|
2044
|
-
});
|
|
2045
|
-
}
|
|
2046
|
-
|
|
2047
|
-
// Add custom undo/redo handlers
|
|
2048
|
-
if (s.custom_undo_redo) {
|
|
2049
|
-
function addUndo() {
|
|
2050
|
-
t.undoManager.typing = 0;
|
|
2051
|
-
t.undoManager.add();
|
|
2052
|
-
};
|
|
2053
|
-
|
|
2054
|
-
// Add undo level on editor blur
|
|
2055
|
-
if (tinymce.isIE) {
|
|
2056
|
-
t.dom.bind(t.getWin(), 'blur', function(e) {
|
|
2057
|
-
var n;
|
|
2058
|
-
|
|
2059
|
-
// Check added for fullscreen bug
|
|
2060
|
-
if (t.selection) {
|
|
2061
|
-
n = t.selection.getNode();
|
|
2062
|
-
|
|
2063
|
-
// Add undo level is selection was lost to another document
|
|
2064
|
-
if (!t.removed && n.ownerDocument && n.ownerDocument != t.getDoc())
|
|
2065
|
-
addUndo();
|
|
2066
|
-
}
|
|
2067
|
-
});
|
|
2068
|
-
} else {
|
|
2069
|
-
t.dom.bind(t.getDoc(), 'blur', function() {
|
|
2070
|
-
if (t.selection && !t.removed)
|
|
2071
|
-
addUndo();
|
|
2072
|
-
});
|
|
2073
|
-
}
|
|
2074
|
-
|
|
2075
|
-
t.onMouseDown.add(addUndo);
|
|
2076
|
-
|
|
2077
|
-
t.onKeyUp.add(function(ed, e) {
|
|
2078
|
-
if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) {
|
|
2079
|
-
t.undoManager.typing = 0;
|
|
2080
|
-
t.undoManager.add();
|
|
2081
|
-
}
|
|
2082
|
-
});
|
|
2083
|
-
|
|
2084
|
-
t.onKeyDown.add(function(ed, e) {
|
|
2085
|
-
// Is caracter positon keys
|
|
2086
|
-
if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) {
|
|
2087
|
-
if (t.undoManager.typing) {
|
|
2088
|
-
t.undoManager.add();
|
|
2089
|
-
t.undoManager.typing = 0;
|
|
2090
|
-
}
|
|
2091
|
-
|
|
2092
|
-
return;
|
|
2093
|
-
}
|
|
2094
|
-
|
|
2095
|
-
if (!t.undoManager.typing) {
|
|
2096
|
-
t.undoManager.add();
|
|
2097
|
-
t.undoManager.typing = 1;
|
|
2098
|
-
}
|
|
2099
|
-
});
|
|
2100
|
-
}
|
|
2101
|
-
},
|
|
2102
|
-
|
|
2103
|
-
_convertInlineElements : function() {
|
|
2104
|
-
var t = this, s = t.settings, dom = t.dom, v, e, na, st, sp;
|
|
2105
|
-
|
|
2106
|
-
function convert(ed, o) {
|
|
2107
|
-
if (!s.inline_styles)
|
|
2108
|
-
return;
|
|
2109
|
-
|
|
2110
|
-
if (o.get) {
|
|
2111
|
-
each(t.dom.select('table,u,strike', o.node), function(n) {
|
|
2112
|
-
switch (n.nodeName) {
|
|
2113
|
-
case 'TABLE':
|
|
2114
|
-
if (v = dom.getAttrib(n, 'height')) {
|
|
2115
|
-
dom.setStyle(n, 'height', v);
|
|
2116
|
-
dom.setAttrib(n, 'height', '');
|
|
2117
|
-
}
|
|
2118
|
-
break;
|
|
2119
|
-
|
|
2120
|
-
case 'U':
|
|
2121
|
-
case 'STRIKE':
|
|
2122
|
-
//sp = dom.create('span', {style : dom.getAttrib(n, 'style')});
|
|
2123
|
-
n.style.textDecoration = n.nodeName == 'U' ? 'underline' : 'line-through';
|
|
2124
|
-
dom.setAttrib(n, 'mce_style', '');
|
|
2125
|
-
dom.setAttrib(n, 'mce_name', 'span');
|
|
2126
|
-
break;
|
|
2127
|
-
}
|
|
2128
|
-
});
|
|
2129
|
-
} else if (o.set) {
|
|
2130
|
-
each(t.dom.select('table,span', o.node).reverse(), function(n) {
|
|
2131
|
-
if (n.nodeName == 'TABLE') {
|
|
2132
|
-
if (v = dom.getStyle(n, 'height'))
|
|
2133
|
-
dom.setAttrib(n, 'height', v.replace(/[^0-9%]+/g, ''));
|
|
2134
|
-
} else {
|
|
2135
|
-
// Convert spans to elements
|
|
2136
|
-
if (n.style.textDecoration == 'underline')
|
|
2137
|
-
na = 'u';
|
|
2138
|
-
else if (n.style.textDecoration == 'line-through')
|
|
2139
|
-
na = 'strike';
|
|
2140
|
-
else
|
|
2141
|
-
na = '';
|
|
2142
|
-
|
|
2143
|
-
if (na) {
|
|
2144
|
-
n.style.textDecoration = '';
|
|
2145
|
-
dom.setAttrib(n, 'mce_style', '');
|
|
2146
|
-
|
|
2147
|
-
e = dom.create(na, {
|
|
2148
|
-
style : dom.getAttrib(n, 'style')
|
|
2149
|
-
});
|
|
2150
|
-
|
|
2151
|
-
dom.replace(e, n, 1);
|
|
2152
|
-
}
|
|
2153
|
-
}
|
|
2154
|
-
});
|
|
2155
|
-
}
|
|
2156
|
-
};
|
|
2157
|
-
|
|
2158
|
-
t.onPreProcess.add(convert);
|
|
2159
|
-
|
|
2160
|
-
if (!s.cleanup_on_startup) {
|
|
2161
|
-
t.onSetContent.add(function(ed, o) {
|
|
2162
|
-
if (o.initial)
|
|
2163
|
-
convert(t, {node : t.getBody(), set : 1});
|
|
2164
|
-
});
|
|
2165
|
-
}
|
|
2166
|
-
},
|
|
2167
|
-
|
|
2168
|
-
_convertFonts : function() {
|
|
2169
|
-
var t = this, s = t.settings, dom = t.dom, fz, fzn, sl, cl;
|
|
2170
|
-
|
|
2171
|
-
// No need
|
|
2172
|
-
if (!s.inline_styles)
|
|
2173
|
-
return;
|
|
2174
|
-
|
|
2175
|
-
// Font pt values and font size names
|
|
2176
|
-
fz = [8, 10, 12, 14, 18, 24, 36];
|
|
2177
|
-
fzn = ['xx-small', 'x-small','small','medium','large','x-large', 'xx-large'];
|
|
2178
|
-
|
|
2179
|
-
if (sl = s.font_size_style_values)
|
|
2180
|
-
sl = explode(sl);
|
|
2181
|
-
|
|
2182
|
-
if (cl = s.font_size_classes)
|
|
2183
|
-
cl = explode(cl);
|
|
2184
|
-
|
|
2185
|
-
function process(no) {
|
|
2186
|
-
var n, sp, nl, x;
|
|
2187
|
-
|
|
2188
|
-
// Keep unit tests happy
|
|
2189
|
-
if (!s.inline_styles)
|
|
2190
|
-
return;
|
|
2191
|
-
|
|
2192
|
-
nl = t.dom.select('font', no);
|
|
2193
|
-
for (x = nl.length - 1; x >= 0; x--) {
|
|
2194
|
-
n = nl[x];
|
|
2195
|
-
|
|
2196
|
-
sp = dom.create('span', {
|
|
2197
|
-
style : dom.getAttrib(n, 'style'),
|
|
2198
|
-
'class' : dom.getAttrib(n, 'class')
|
|
2199
|
-
});
|
|
2200
|
-
|
|
2201
|
-
dom.setStyles(sp, {
|
|
2202
|
-
fontFamily : dom.getAttrib(n, 'face'),
|
|
2203
|
-
color : dom.getAttrib(n, 'color'),
|
|
2204
|
-
backgroundColor : n.style.backgroundColor
|
|
2205
|
-
});
|
|
2206
|
-
|
|
2207
|
-
if (n.size) {
|
|
2208
|
-
if (sl)
|
|
2209
|
-
dom.setStyle(sp, 'fontSize', sl[parseInt(n.size) - 1]);
|
|
2210
|
-
else
|
|
2211
|
-
dom.setAttrib(sp, 'class', cl[parseInt(n.size) - 1]);
|
|
2212
|
-
}
|
|
2213
|
-
|
|
2214
|
-
dom.setAttrib(sp, 'mce_style', '');
|
|
2215
|
-
dom.replace(sp, n, 1);
|
|
2216
|
-
}
|
|
2217
|
-
};
|
|
2218
|
-
|
|
2219
|
-
// Run on cleanup
|
|
2220
|
-
t.onPreProcess.add(function(ed, o) {
|
|
2221
|
-
if (o.get)
|
|
2222
|
-
process(o.node);
|
|
2223
|
-
});
|
|
2224
|
-
|
|
2225
|
-
t.onSetContent.add(function(ed, o) {
|
|
2226
|
-
if (o.initial)
|
|
2227
|
-
process(o.node);
|
|
2228
|
-
});
|
|
2229
|
-
},
|
|
2230
|
-
|
|
2231
|
-
_isHidden : function() {
|
|
2232
|
-
var s;
|
|
2233
|
-
|
|
2234
|
-
if (!isGecko)
|
|
2235
|
-
return 0;
|
|
2236
|
-
|
|
2237
|
-
// Weird, wheres that cursor selection?
|
|
2238
|
-
s = this.selection.getSel();
|
|
2239
|
-
return (!s || !s.rangeCount || s.rangeCount == 0);
|
|
2240
|
-
},
|
|
2241
|
-
|
|
2242
|
-
// Fix for bug #1867292
|
|
2243
|
-
_fixNesting : function(s) {
|
|
2244
|
-
var d = [], i;
|
|
2245
|
-
|
|
2246
|
-
s = s.replace(/<(\/)?([^\s>]+)[^>]*?>/g, function(a, b, c) {
|
|
2247
|
-
var e;
|
|
2248
|
-
|
|
2249
|
-
// Handle end element
|
|
2250
|
-
if (b === '/') {
|
|
2251
|
-
if (!d.length)
|
|
2252
|
-
return '';
|
|
2253
|
-
|
|
2254
|
-
if (c !== d[d.length - 1].tag) {
|
|
2255
|
-
for (i=d.length - 1; i>=0; i--) {
|
|
2256
|
-
if (d[i].tag === c) {
|
|
2257
|
-
d[i].close = 1;
|
|
2258
|
-
break;
|
|
2259
|
-
}
|
|
2260
|
-
}
|
|
2261
|
-
|
|
2262
|
-
return '';
|
|
2263
|
-
} else {
|
|
2264
|
-
d.pop();
|
|
2265
|
-
|
|
2266
|
-
if (d.length && d[d.length - 1].close) {
|
|
2267
|
-
a = a + '</' + d[d.length - 1].tag + '>';
|
|
2268
|
-
d.pop();
|
|
2269
|
-
}
|
|
2270
|
-
}
|
|
2271
|
-
} else {
|
|
2272
|
-
// Ignore these
|
|
2273
|
-
if (/^(br|hr|input|meta|img|link|param)$/i.test(c))
|
|
2274
|
-
return a;
|
|
2275
|
-
|
|
2276
|
-
// Ignore closed ones
|
|
2277
|
-
if (/\/>$/.test(a))
|
|
2278
|
-
return a;
|
|
2279
|
-
|
|
2280
|
-
d.push({tag : c}); // Push start element
|
|
2281
|
-
}
|
|
2282
|
-
|
|
2283
|
-
return a;
|
|
2284
|
-
});
|
|
2285
|
-
|
|
2286
|
-
// End all open tags
|
|
2287
|
-
for (i=d.length - 1; i>=0; i--)
|
|
2288
|
-
s += '</' + d[i].tag + '>';
|
|
2289
|
-
|
|
2290
|
-
return s;
|
|
2291
|
-
}
|
|
2292
|
-
|
|
2293
|
-
/**#@-*/
|
|
2294
|
-
});
|
|
2295
|
-
})(tinymce);
|