From 6bba8e84854eed30bb088cbafca501fc4bfb2cc2 Mon Sep 17 00:00:00 2001 From: Stian Haklev Date: Wed, 9 May 2007 15:58:33 +0700 Subject: [PATCH] applied my changes - initial import --- Notes.txt | 62 + app/controllers/admin_tool_controller.rb | 34 + app/controllers/application.rb | 38 +- app/controllers/authentication_controller.rb | 4 +- app/controllers/file_controller.rb | 223 +- app/controllers/folder_controller.rb | 162 +- app/controllers/frontpage_controller.rb | 88 + app/controllers/usage_controller.rb | 13 + app/controllers/user_controller.rb | 63 +- app/helpers/application_helper.rb | 7 +- app/helpers/frontpage_helper.rb | 2 + app/models/clipboard.rb | 24 +- app/models/folder.rb | 112 +- app/models/group.rb | 25 +- app/models/group_permission.rb | 18 +- app/models/myfile.rb | 188 +- app/models/news.rb | 2 + app/models/password_mailer.rb | 8 +- app/models/usage.rb | 9 + app/models/user.rb | 22 +- app/views/admin_tool/folder_tree.rhtml | 17 + app/views/admin_tool/server_status.rhtml | 5 + app/views/admin_tool/show_log.rhtml | 35 + app/views/file/preview.rhtml | 6 +- app/views/file/upload_without_progress.rhtml | 34 +- app/views/folder/list.rhtml | 86 +- app/views/frontpage/_form.rhtml | 12 + app/views/frontpage/edit.rhtml | 8 + app/views/frontpage/filelist.rhtml | 6 + app/views/frontpage/list.rhtml | 24 + app/views/frontpage/new.rhtml | 8 + app/views/frontpage/show.rhtml | 8 + app/views/group/list.rhtml | 10 +- app/views/layouts/admin_tool.rhtml | 30 + app/views/layouts/authentication.rhtml | 19 +- app/views/layouts/file.rhtml | 88 +- app/views/layouts/folder.rhtml | 100 +- app/views/layouts/frontpage.rhtml | 36 + app/views/layouts/group.rhtml | 88 +- app/views/layouts/search.rhtml | 81 +- app/views/layouts/usage.rhtml | 26 + app/views/layouts/user.rhtml | 88 +- app/views/password_mailer/forgotten.rhtml | 6 +- app/views/password_mailer/new_user.rhtml | 4 +- app/views/shared/_content.rhtml | 10 + app/views/shared/_create_file_folder.rhtml | 5 +- app/views/shared/_go_to_menu.rhtml | 28 +- app/views/shared/_intranet.rhtml | 7 + app/views/shared/_root_folder.rhtml | 3 + app/views/shared/_top_header.rhtml | 15 + app/views/user/_form.rhtml | 6 +- app/views/user/mass_create.rhtml | 11 + config/database.yml | 40 +- config/environment.rb | 43 +- config/lighttpd.conf | 40 + config/mongrel_cluster.yml | 9 + config/routes.rb | 5 +- create-data-dir.sh | 9 + db/migrate/001_initial_schema.rb | 59 +- lib/extensions.rb | 11 + lib/tiny_mce.rb | 36 + lib/tiny_mce_helper.rb | 48 + public/images/a.png | Bin 0 -> 2894 bytes public/images/alert.black.png | Bin 0 -> 2866 bytes public/images/alert.red.png | Bin 0 -> 2866 bytes public/images/apache_pb.png | Bin 0 -> 2795 bytes public/images/apache_pb2.png | Bin 0 -> 2795 bytes public/images/apache_pb2_ani.png | Bin 0 -> 2773 bytes public/images/arrow_up.png | Bin 0 -> 372 bytes public/images/ascii.png | Bin 0 -> 579 bytes public/images/back.png | Bin 0 -> 2885 bytes public/images/ball.gray.png | Bin 0 -> 2869 bytes public/images/ball.red.png | Bin 0 -> 2846 bytes public/images/binary.png | Bin 0 -> 2889 bytes public/images/binhex.png | Bin 0 -> 2903 bytes public/images/blank.png | Bin 0 -> 2756 bytes public/images/bomb.png | Bin 0 -> 2964 bytes public/images/box1.png | Bin 0 -> 2875 bytes public/images/box2.png | Bin 0 -> 2900 bytes public/images/broken.png | Bin 0 -> 2903 bytes public/images/burst.png | Bin 0 -> 2920 bytes public/images/c.png | Bin 0 -> 2876 bytes public/images/comp.blue.png | Bin 0 -> 2900 bytes public/images/comp.gray.png | Bin 0 -> 2902 bytes public/images/compressed.png | Bin 0 -> 2881 bytes public/images/continued.png | Bin 0 -> 2845 bytes public/images/dir.png | Bin 0 -> 2857 bytes public/images/diskimg.png | Bin 0 -> 2908 bytes public/images/down.png | Bin 0 -> 2812 bytes public/images/dvi.png | Bin 0 -> 2885 bytes public/images/f.png | Bin 0 -> 2875 bytes public/images/fileicon-c.jpg | Bin 0 -> 847 bytes public/images/fileicon-cpp.jpg | Bin 0 -> 848 bytes public/images/fileicon-deb.jpg | Bin 0 -> 924 bytes public/images/fileicon-djvu.jpg | Bin 0 -> 879 bytes public/images/fileicon-dvi.jpg | Bin 0 -> 941 bytes public/images/fileicon-exe.jpg | Bin 0 -> 958 bytes public/images/fileicon-exe.png | Bin 0 -> 3043 bytes public/images/fileicon-h.jpg | Bin 0 -> 838 bytes public/images/fileicon-html.jpg | Bin 0 -> 908 bytes public/images/fileicon-html.png | Bin 0 -> 3099 bytes public/images/fileicon-iso.jpg | Bin 0 -> 921 bytes public/images/fileicon-java.jpg | Bin 0 -> 864 bytes public/images/fileicon-mid.jpg | Bin 0 -> 849 bytes public/images/fileicon-mov.jpg | Bin 0 -> 912 bytes public/images/fileicon-o.jpg | Bin 0 -> 844 bytes public/images/fileicon-ogg.jpg | Bin 0 -> 847 bytes public/images/fileicon-pdf.jpg | Bin 0 -> 931 bytes public/images/fileicon-ps.jpg | Bin 0 -> 848 bytes public/images/fileicon-rm.jpg | Bin 0 -> 854 bytes public/images/fileicon-rpm.jpg | Bin 0 -> 881 bytes public/images/fileicon-svg.jpg | Bin 0 -> 916 bytes public/images/fileicon-tar.jpg | Bin 0 -> 903 bytes public/images/fileicon-tex.jpg | Bin 0 -> 909 bytes public/images/fileicon-ttf.jpg | Bin 0 -> 931 bytes public/images/fileicon-txt.jpg | Bin 0 -> 847 bytes public/images/fileicon.jpg | Bin 0 -> 853 bytes public/images/folder.open.png | Bin 0 -> 2902 bytes public/images/folder.sec.png | Bin 0 -> 2868 bytes public/images/forward.png | Bin 0 -> 2894 bytes public/images/generic.png | Bin 0 -> 2844 bytes public/images/generic.red.png | Bin 0 -> 2837 bytes public/images/generic.sec.png | Bin 0 -> 2854 bytes public/images/hand.right.png | Bin 0 -> 2879 bytes public/images/hand.up.png | Bin 0 -> 2886 bytes public/images/icon.sheet.png | Bin 0 -> 2889 bytes public/images/image.png | Bin 0 -> 760 bytes public/images/image1.png | Bin 0 -> 2889 bytes public/images/image2.png | Bin 0 -> 2926 bytes public/images/image3.png | Bin 0 -> 2904 bytes public/images/index.png | Bin 0 -> 2948 bytes public/images/layout.png | Bin 0 -> 2875 bytes public/images/left.png | Bin 0 -> 2806 bytes public/images/link.png | Bin 0 -> 2885 bytes public/images/log.png | Bin 0 -> 555 bytes public/images/logo.jpg | Bin 0 -> 40174 bytes public/images/movie.png | Bin 0 -> 2869 bytes public/images/p.png | Bin 0 -> 2874 bytes public/images/patch.png | Bin 0 -> 2891 bytes public/images/pdf.png | Bin 0 -> 747 bytes public/images/pie0.png | Bin 0 -> 2837 bytes public/images/pie1.png | Bin 0 -> 2840 bytes public/images/pie2.png | Bin 0 -> 2839 bytes public/images/pie3.png | Bin 0 -> 2832 bytes public/images/pie4.png | Bin 0 -> 2827 bytes public/images/pie5.png | Bin 0 -> 2830 bytes public/images/pie6.png | Bin 0 -> 2823 bytes public/images/pie7.png | Bin 0 -> 2823 bytes public/images/pie8.png | Bin 0 -> 2810 bytes public/images/portal.png | Bin 0 -> 2872 bytes public/images/preview.png | Bin 0 -> 190 bytes public/images/ps.png | Bin 0 -> 2880 bytes public/images/quill.png | Bin 0 -> 2911 bytes public/images/right.png | Bin 0 -> 2812 bytes public/images/screw1.png | Bin 0 -> 2909 bytes public/images/screw2.png | Bin 0 -> 2910 bytes public/images/script.png | Bin 0 -> 2865 bytes public/images/sound1.png | Bin 0 -> 2916 bytes public/images/sound2.png | Bin 0 -> 2884 bytes public/images/sphere1.png | Bin 0 -> 2911 bytes public/images/sphere2.png | Bin 0 -> 2907 bytes public/images/spreadsheet.png | Bin 0 -> 623 bytes public/images/tar.png | Bin 0 -> 2892 bytes public/images/tex.png | Bin 0 -> 2890 bytes public/images/text.png | Bin 0 -> 2867 bytes public/images/transfer.png | Bin 0 -> 2893 bytes public/images/txt.png | Bin 0 -> 601 bytes public/images/unknown.png | Bin 0 -> 2882 bytes public/images/up.png | Bin 0 -> 2805 bytes public/images/uu.png | Bin 0 -> 2879 bytes public/images/uuencoded.png | Bin 0 -> 2879 bytes public/images/word.png | Bin 0 -> 767 bytes public/images/world1.png | Bin 0 -> 2939 bytes public/images/world2.png | Bin 0 -> 2943 bytes public/javascripts/tiny_mce/blank.htm | 9 + public/javascripts/tiny_mce/langs/en.js | 41 + public/javascripts/tiny_mce/langs/readme.txt | 9 + public/javascripts/tiny_mce/license.txt | 504 ++ .../tiny_mce/plugins/_template/editor_plugin.js | 1 + .../plugins/_template/editor_plugin_src.js | 238 + .../tiny_mce/plugins/_template/images/template.gif | Bin 0 -> 87 bytes .../tiny_mce/plugins/_template/langs/en.js | 8 + .../tiny_mce/plugins/_template/popup.htm | 48 + .../tiny_mce/plugins/_template/readme.txt | 1 + .../tiny_mce/plugins/advhr/css/advhr.css | 23 + .../tiny_mce/plugins/advhr/editor_plugin.js | 1 + .../tiny_mce/plugins/advhr/editor_plugin_src.js | 90 + .../tiny_mce/plugins/advhr/images/advhr.gif | Bin 0 -> 153 bytes .../tiny_mce/plugins/advhr/jscripts/rule.js | 43 + .../javascripts/tiny_mce/plugins/advhr/langs/en.js | 8 + .../javascripts/tiny_mce/plugins/advhr/readme.txt | 1 + public/javascripts/tiny_mce/plugins/advhr/rule.htm | 61 + .../tiny_mce/plugins/advimage/css/advimage.css | 66 + .../tiny_mce/plugins/advimage/editor_plugin.js | 1 + .../tiny_mce/plugins/advimage/editor_plugin_src.js | 148 + .../tiny_mce/plugins/advimage/image.htm | 241 + .../tiny_mce/plugins/advimage/images/sample.gif | Bin 0 -> 1624 bytes .../plugins/advimage/jscripts/functions.js | 550 ++ .../tiny_mce/plugins/advimage/langs/en.js | 27 + .../tiny_mce/plugins/advimage/readme.txt | 1 + .../tiny_mce/plugins/advlink/css/advlink.css | 35 + .../tiny_mce/plugins/advlink/editor_plugin.js | 1 + .../tiny_mce/plugins/advlink/editor_plugin_src.js | 88 + .../tiny_mce/plugins/advlink/jscripts/functions.js | 568 ++ .../tiny_mce/plugins/advlink/langs/en.js | 46 + .../javascripts/tiny_mce/plugins/advlink/link.htm | 337 + .../tiny_mce/plugins/advlink/readme.txt | 1 + .../tiny_mce/plugins/autosave/editor_plugin.js | 1 + .../tiny_mce/plugins/autosave/editor_plugin_src.js | 46 + .../tiny_mce/plugins/autosave/langs/en.js | 5 + .../tiny_mce/plugins/autosave/readme.txt | 1 + .../tiny_mce/plugins/blockquote/editor_plugin.js | 95 + .../plugins/blockquote/editor_plugin_src.js | 95 + .../tiny_mce/plugins/blockquote/images/quote.gif | Bin 0 -> 159 bytes .../tiny_mce/plugins/blockquote/langs/en.js | 3 + .../tiny_mce/plugins/blockquote/readme.txt | 65 + .../tiny_mce/plugins/cleanup/editor_plugin.js | 0 .../tiny_mce/plugins/cleanup/editor_plugin_src.js | 10 + .../tiny_mce/plugins/cleanup/readme.txt | 1 + .../plugins/codeblock/editor_plugin_src.js | 98 + .../tiny_mce/plugins/codeblock/images/code.gif | Bin 0 -> 261 bytes .../tiny_mce/plugins/codeblock/langs/en.js | 3 + .../tiny_mce/plugins/codeblock/readme.txt | 65 + .../plugins/contextmenu/css/contextmenu.css | 74 + .../tiny_mce/plugins/contextmenu/editor_plugin.js | 1 + .../plugins/contextmenu/editor_plugin_src.js | 357 + .../tiny_mce/plugins/contextmenu/images/spacer.gif | Bin 0 -> 43 bytes .../tiny_mce/plugins/contextmenu/readme.txt | 1 + .../tiny_mce/plugins/devkit/css/devkit.css | 117 + .../tiny_mce/plugins/devkit/css/devkit_ui.css | 15 + .../javascripts/tiny_mce/plugins/devkit/devkit.htm | 140 + .../tiny_mce/plugins/devkit/editor_plugin.js | 1 + .../tiny_mce/plugins/devkit/editor_plugin_src.js | 325 + .../tiny_mce/plugins/devkit/images/flip_down.gif | Bin 0 -> 179 bytes .../tiny_mce/plugins/devkit/images/flip_up.gif | Bin 0 -> 193 bytes .../tiny_mce/plugins/devkit/jscripts/devkit.js | 328 + .../tiny_mce/plugins/devkit/jscripts/diff.js | 1192 ++++ .../tiny_mce/plugins/devkit/langs/en.js | 23 + .../plugins/directionality/editor_plugin.js | 1 + .../plugins/directionality/editor_plugin_src.js | 90 + .../tiny_mce/plugins/directionality/images/ltr.gif | Bin 0 -> 155 bytes .../tiny_mce/plugins/directionality/images/rtl.gif | Bin 0 -> 153 bytes .../tiny_mce/plugins/directionality/langs/en.js | 6 + .../tiny_mce/plugins/directionality/readme.txt | 1 + .../tiny_mce/plugins/emotions/editor_plugin.js | 1 + .../tiny_mce/plugins/emotions/editor_plugin_src.js | 63 + .../tiny_mce/plugins/emotions/emotions.htm | 40 + .../tiny_mce/plugins/emotions/images/emotions.gif | Bin 0 -> 319 bytes .../tiny_mce/plugins/emotions/images/readme.txt | 2 + .../plugins/emotions/images/smiley-cool.gif | Bin 0 -> 354 bytes .../plugins/emotions/images/smiley-cry.gif | Bin 0 -> 329 bytes .../plugins/emotions/images/smiley-embarassed.gif | Bin 0 -> 331 bytes .../emotions/images/smiley-foot-in-mouth.gif | Bin 0 -> 344 bytes .../plugins/emotions/images/smiley-frown.gif | Bin 0 -> 340 bytes .../plugins/emotions/images/smiley-innocent.gif | Bin 0 -> 336 bytes .../plugins/emotions/images/smiley-kiss.gif | Bin 0 -> 338 bytes .../plugins/emotions/images/smiley-laughing.gif | Bin 0 -> 344 bytes .../plugins/emotions/images/smiley-money-mouth.gif | Bin 0 -> 321 bytes .../plugins/emotions/images/smiley-sealed.gif | Bin 0 -> 325 bytes .../plugins/emotions/images/smiley-smile.gif | Bin 0 -> 345 bytes .../plugins/emotions/images/smiley-surprised.gif | Bin 0 -> 342 bytes .../plugins/emotions/images/smiley-tongue-out.gif | Bin 0 -> 328 bytes .../plugins/emotions/images/smiley-undecided.gif | Bin 0 -> 337 bytes .../plugins/emotions/images/smiley-wink.gif | Bin 0 -> 351 bytes .../plugins/emotions/images/smiley-yell.gif | Bin 0 -> 336 bytes .../plugins/emotions/jscripts/functions.js | 21 + .../tiny_mce/plugins/emotions/langs/en.js | 22 + .../tiny_mce/plugins/emotions/readme.txt | 1 + .../tiny_mce/plugins/flash/css/content.css | 7 + .../tiny_mce/plugins/flash/css/flash.css | 11 + .../tiny_mce/plugins/flash/editor_plugin.js | 1 + .../tiny_mce/plugins/flash/editor_plugin_src.js | 285 + .../javascripts/tiny_mce/plugins/flash/flash.htm | 70 + .../tiny_mce/plugins/flash/images/flash.gif | Bin 0 -> 241 bytes .../tiny_mce/plugins/flash/jscripts/flash.js | 107 + .../javascripts/tiny_mce/plugins/flash/langs/en.js | 11 + .../javascripts/tiny_mce/plugins/flash/readme.txt | 1 + .../tiny_mce/plugins/fullpage/blank.htm | 9 + .../tiny_mce/plugins/fullpage/css/fullpage.css | 172 + .../tiny_mce/plugins/fullpage/editor_plugin.js | 1 + .../tiny_mce/plugins/fullpage/editor_plugin_src.js | 227 + .../tiny_mce/plugins/fullpage/fullpage.htm | 577 ++ .../tiny_mce/plugins/fullpage/images/add.gif | Bin 0 -> 893 bytes .../tiny_mce/plugins/fullpage/images/fullpage.gif | Bin 0 -> 632 bytes .../tiny_mce/plugins/fullpage/images/move_down.gif | Bin 0 -> 194 bytes .../tiny_mce/plugins/fullpage/images/move_up.gif | Bin 0 -> 200 bytes .../tiny_mce/plugins/fullpage/images/remove.gif | Bin 0 -> 180 bytes .../tiny_mce/plugins/fullpage/jscripts/fullpage.js | 580 ++ .../tiny_mce/plugins/fullpage/langs/en.js | 92 + .../tiny_mce/plugins/fullscreen/css/content.css | 3 + .../tiny_mce/plugins/fullscreen/editor_plugin.js | 1 + .../plugins/fullscreen/editor_plugin_src.js | 189 + .../plugins/fullscreen/images/fullscreen.gif | Bin 0 -> 198 bytes .../tiny_mce/plugins/fullscreen/langs/en.js | 5 + .../tiny_mce/plugins/fullscreen/readme.txt | 1 + .../tiny_mce/plugins/iespell/editor_plugin.js | 1 + .../tiny_mce/plugins/iespell/editor_plugin_src.js | 58 + .../tiny_mce/plugins/iespell/images/iespell.gif | Bin 0 -> 124 bytes .../tiny_mce/plugins/iespell/langs/en.js | 7 + .../tiny_mce/plugins/iespell/readme.txt | 1 + .../plugins/inlinepopups/css/inlinepopup.css | 69 + .../tiny_mce/plugins/inlinepopups/editor_plugin.js | 1 + .../plugins/inlinepopups/editor_plugin_src.js | 660 ++ .../plugins/inlinepopups/images/spacer.gif | Bin 0 -> 43 bytes .../plugins/inlinepopups/images/window_close.gif | Bin 0 -> 110 bytes .../inlinepopups/images/window_maximize.gif | Bin 0 -> 111 bytes .../inlinepopups/images/window_minimize.gif | Bin 0 -> 112 bytes .../plugins/inlinepopups/images/window_resize.gif | Bin 0 -> 74 bytes .../plugins/inlinepopups/jscripts/mcwindows.js | 453 ++ .../tiny_mce/plugins/inlinepopups/readme.txt | 0 .../plugins/insertdatetime/editor_plugin.js | 1 + .../plugins/insertdatetime/editor_plugin_src.js | 90 + .../plugins/insertdatetime/images/insertdate.gif | Bin 0 -> 287 bytes .../plugins/insertdatetime/images/inserttime.gif | Bin 0 -> 239 bytes .../tiny_mce/plugins/insertdatetime/langs/en.js | 12 + .../tiny_mce/plugins/insertdatetime/readme.txt | 1 + .../tiny_mce/plugins/layer/editor_plugin.js | 1 + .../tiny_mce/plugins/layer/editor_plugin_src.js | 248 + .../tiny_mce/plugins/layer/images/absolute.gif | Bin 0 -> 209 bytes .../tiny_mce/plugins/layer/images/backward.gif | Bin 0 -> 360 bytes .../tiny_mce/plugins/layer/images/forward.gif | Bin 0 -> 358 bytes .../tiny_mce/plugins/layer/images/insert_layer.gif | Bin 0 -> 264 bytes .../tiny_mce/plugins/layer/images/insertlayer.gif | Bin 0 -> 264 bytes .../tiny_mce/plugins/layer/images/movebackward.gif | Bin 0 -> 360 bytes .../tiny_mce/plugins/layer/images/moveforward.gif | Bin 0 -> 358 bytes .../javascripts/tiny_mce/plugins/layer/langs/en.js | 9 + .../javascripts/tiny_mce/plugins/layer/readme.txt | 1 + .../tiny_mce/plugins/media/css/content.css | 26 + .../tiny_mce/plugins/media/css/media.css | 68 + .../tiny_mce/plugins/media/editor_plugin.js | 1 + .../tiny_mce/plugins/media/editor_plugin_src.js | 428 ++ .../tiny_mce/plugins/media/images/flash.gif | Bin 0 -> 241 bytes .../tiny_mce/plugins/media/images/media.gif | Bin 0 -> 280 bytes .../tiny_mce/plugins/media/images/quicktime.gif | Bin 0 -> 303 bytes .../tiny_mce/plugins/media/images/realmedia.gif | Bin 0 -> 439 bytes .../tiny_mce/plugins/media/images/shockwave.gif | Bin 0 -> 387 bytes .../tiny_mce/plugins/media/images/windowsmedia.gif | Bin 0 -> 415 bytes .../tiny_mce/plugins/media/jscripts/embed.js | 73 + .../tiny_mce/plugins/media/jscripts/media.js | 572 ++ .../javascripts/tiny_mce/plugins/media/langs/en.js | 85 + .../javascripts/tiny_mce/plugins/media/media.htm | 723 ++ .../tiny_mce/plugins/nonbreaking/editor_plugin.js | 1 + .../plugins/nonbreaking/editor_plugin_src.js | 62 + .../plugins/nonbreaking/images/nonbreaking.gif | Bin 0 -> 619 bytes .../tiny_mce/plugins/nonbreaking/langs/en.js | 5 + .../plugins/noneditable/css/noneditable.css | 9 + .../tiny_mce/plugins/noneditable/editor_plugin.js | 1 + .../plugins/noneditable/editor_plugin_src.js | 140 + .../tiny_mce/plugins/noneditable/readme.txt | 1 + .../tiny_mce/plugins/ntattachlink/editor_plugin.js | 37 + .../plugins/ntattachlink/editor_plugin_src.js | 58 + .../tiny_mce/plugins/ntattachlink/langs/en.js | 5 + .../plugins/ntimagelink/editor_plugin_src.js | 58 + .../plugins/ntpagelink/editor_plugin_src.js | 64 + .../javascripts/tiny_mce/plugins/paste/blank.htm | 19 + .../tiny_mce/plugins/paste/css/blank.css | 13 + .../tiny_mce/plugins/paste/css/pasteword.css | 3 + .../tiny_mce/plugins/paste/editor_plugin.js | 1 + .../tiny_mce/plugins/paste/editor_plugin_src.js | 385 ++ .../tiny_mce/plugins/paste/images/pastetext.gif | Bin 0 -> 294 bytes .../tiny_mce/plugins/paste/images/pasteword.gif | Bin 0 -> 299 bytes .../tiny_mce/plugins/paste/images/selectall.gif | Bin 0 -> 205 bytes .../tiny_mce/plugins/paste/jscripts/pastetext.js | 38 + .../tiny_mce/plugins/paste/jscripts/pasteword.js | 52 + .../javascripts/tiny_mce/plugins/paste/langs/en.js | 10 + .../tiny_mce/plugins/paste/pastetext.htm | 34 + .../tiny_mce/plugins/paste/pasteword.htm | 29 + .../javascripts/tiny_mce/plugins/paste/readme.txt | 1 + .../tiny_mce/plugins/preview/editor_plugin.js | 1 + .../tiny_mce/plugins/preview/editor_plugin_src.js | 205 + .../tiny_mce/plugins/preview/example.html | 14 + .../tiny_mce/plugins/preview/images/preview.gif | Bin 0 -> 286 bytes .../tiny_mce/plugins/preview/jscripts/embed.js | 73 + .../tiny_mce/plugins/preview/langs/en.js | 5 + .../tiny_mce/plugins/preview/readme.txt | 1 + .../tiny_mce/plugins/print/editor_plugin.js | 1 + .../tiny_mce/plugins/print/editor_plugin_src.js | 47 + .../tiny_mce/plugins/print/images/print.gif | Bin 0 -> 211 bytes .../javascripts/tiny_mce/plugins/print/langs/en.js | 5 + .../javascripts/tiny_mce/plugins/print/readme.txt | 1 + public/javascripts/tiny_mce/plugins/readme.txt | 1 + .../tiny_mce/plugins/save/editor_plugin.js | 1 + .../tiny_mce/plugins/save/editor_plugin_src.js | 115 + .../tiny_mce/plugins/save/images/save.gif | Bin 0 -> 285 bytes .../javascripts/tiny_mce/plugins/save/langs/en.js | 5 + .../javascripts/tiny_mce/plugins/save/readme.txt | 1 + .../plugins/searchreplace/css/searchreplace.css | 20 + .../plugins/searchreplace/editor_plugin.js | 1 + .../plugins/searchreplace/editor_plugin_src.js | 164 + .../plugins/searchreplace/images/replace.gif | Bin 0 -> 125 bytes .../searchreplace/images/replace_all_button_bg.gif | Bin 0 -> 669 bytes .../searchreplace/images/replace_button_bg.gif | Bin 0 -> 669 bytes .../plugins/searchreplace/images/search.gif | Bin 0 -> 191 bytes .../searchreplace/jscripts/searchreplace.js | 85 + .../tiny_mce/plugins/searchreplace/langs/en.js | 21 + .../tiny_mce/plugins/searchreplace/readme.txt | 1 + .../plugins/searchreplace/searchreplace.htm | 104 + .../tiny_mce/plugins/style/css/props.css | 62 + .../tiny_mce/plugins/style/editor_plugin.js | 1 + .../tiny_mce/plugins/style/editor_plugin_src.js | 79 + .../plugins/style/images/apply_button_bg.gif | Bin 0 -> 1096 bytes .../tiny_mce/plugins/style/images/style_info.gif | Bin 0 -> 562 bytes .../tiny_mce/plugins/style/images/styleprops.gif | Bin 0 -> 562 bytes .../tiny_mce/plugins/style/jscripts/props.js | 633 ++ .../javascripts/tiny_mce/plugins/style/langs/en.js | 66 + .../javascripts/tiny_mce/plugins/style/props.htm | 698 ++ .../javascripts/tiny_mce/plugins/style/readme.txt | 1 + public/javascripts/tiny_mce/plugins/table/cell.htm | 182 + .../tiny_mce/plugins/table/css/cell.css | 17 + .../javascripts/tiny_mce/plugins/table/css/row.css | 25 + .../tiny_mce/plugins/table/css/table.css | 13 + .../tiny_mce/plugins/table/editor_plugin.js | 1 + .../tiny_mce/plugins/table/editor_plugin_src.js | 1073 +++ .../tiny_mce/plugins/table/images/buttons.gif | Bin 0 -> 1765 bytes .../tiny_mce/plugins/table/images/table.gif | Bin 0 -> 287 bytes .../plugins/table/images/table_cell_props.gif | Bin 0 -> 189 bytes .../tiny_mce/plugins/table/images/table_delete.gif | Bin 0 -> 372 bytes .../plugins/table/images/table_delete_col.gif | Bin 0 -> 163 bytes .../plugins/table/images/table_delete_row.gif | Bin 0 -> 171 bytes .../table/images/table_insert_col_after.gif | Bin 0 -> 165 bytes .../table/images/table_insert_col_before.gif | Bin 0 -> 165 bytes .../table/images/table_insert_row_after.gif | Bin 0 -> 163 bytes .../table/images/table_insert_row_before.gif | Bin 0 -> 159 bytes .../plugins/table/images/table_merge_cells.gif | Bin 0 -> 198 bytes .../plugins/table/images/table_row_props.gif | Bin 0 -> 187 bytes .../plugins/table/images/table_split_cells.gif | Bin 0 -> 210 bytes .../tiny_mce/plugins/table/jscripts/cell.js | 249 + .../tiny_mce/plugins/table/jscripts/merge_cells.js | 24 + .../tiny_mce/plugins/table/jscripts/row.js | 200 + .../tiny_mce/plugins/table/jscripts/table.js | 349 + .../javascripts/tiny_mce/plugins/table/langs/en.js | 78 + .../tiny_mce/plugins/table/merge_cells.htm | 38 + .../javascripts/tiny_mce/plugins/table/readme.txt | 1 + public/javascripts/tiny_mce/plugins/table/row.htm | 159 + .../javascripts/tiny_mce/plugins/table/table.htm | 156 + .../tiny_mce/plugins/visualchars/editor_plugin.js | 1 + .../plugins/visualchars/editor_plugin_src.js | 89 + .../plugins/visualchars/images/visualchars.gif | Bin 0 -> 134 bytes .../tiny_mce/plugins/visualchars/langs/en.js | 5 + .../tiny_mce/plugins/xhtmlxtras/abbr.htm | 148 + .../tiny_mce/plugins/xhtmlxtras/acronym.htm | 148 + .../tiny_mce/plugins/xhtmlxtras/cite.htm | 148 + .../tiny_mce/plugins/xhtmlxtras/css/popup.css | 46 + .../tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css | 24 + .../tiny_mce/plugins/xhtmlxtras/del.htm | 169 + .../tiny_mce/plugins/xhtmlxtras/editor_plugin.js | 1 + .../plugins/xhtmlxtras/editor_plugin_src.js | 175 + .../tiny_mce/plugins/xhtmlxtras/images/abbr.gif | Bin 0 -> 144 bytes .../tiny_mce/plugins/xhtmlxtras/images/acronym.gif | Bin 0 -> 138 bytes .../tiny_mce/plugins/xhtmlxtras/images/cite.gif | Bin 0 -> 313 bytes .../plugins/xhtmlxtras/images/date_time.gif | Bin 0 -> 287 bytes .../tiny_mce/plugins/xhtmlxtras/images/del.gif | Bin 0 -> 222 bytes .../tiny_mce/plugins/xhtmlxtras/images/ins.gif | Bin 0 -> 231 bytes .../plugins/xhtmlxtras/images/remove_button_bg.gif | Bin 0 -> 433 bytes .../tiny_mce/plugins/xhtmlxtras/ins.htm | 169 + .../tiny_mce/plugins/xhtmlxtras/jscripts/abbr.js | 29 + .../plugins/xhtmlxtras/jscripts/acronym.js | 29 + .../tiny_mce/plugins/xhtmlxtras/jscripts/cite.js | 29 + .../tiny_mce/plugins/xhtmlxtras/jscripts/del.js | 54 + .../plugins/xhtmlxtras/jscripts/element_common.js | 241 + .../tiny_mce/plugins/xhtmlxtras/jscripts/ins.js | 53 + .../tiny_mce/plugins/xhtmlxtras/langs/en.js | 33 + .../tiny_mce/plugins/zoom/editor_plugin.js | 1 + .../tiny_mce/plugins/zoom/editor_plugin_src.js | 56 + .../javascripts/tiny_mce/plugins/zoom/readme.txt | 1 + .../javascripts/tiny_mce/themes/advanced/about.htm | 52 + .../tiny_mce/themes/advanced/anchor.htm | 33 + .../tiny_mce/themes/advanced/charmap.htm | 53 + .../tiny_mce/themes/advanced/color_picker.htm | 13 + .../themes/advanced/css/editor_content.css | 58 + .../tiny_mce/themes/advanced/css/editor_popup.css | 331 + .../tiny_mce/themes/advanced/css/editor_ui.css | 97 + .../tiny_mce/themes/advanced/docs/en/about.htm | 31 + .../themes/advanced/docs/en/common_buttons.htm | 162 + .../advanced/docs/en/create_accessible_content.htm | 45 + .../docs/en/images/insert_anchor_window.gif | Bin 0 -> 5189 bytes .../docs/en/images/insert_image_window.gif | Bin 0 -> 7195 bytes .../advanced/docs/en/images/insert_link_window.gif | Bin 0 -> 5658 bytes .../docs/en/images/insert_table_window.gif | Bin 0 -> 7094 bytes .../tiny_mce/themes/advanced/docs/en/index.htm | 27 + .../advanced/docs/en/insert_anchor_button.htm | 32 + .../advanced/docs/en/insert_image_button.htm | 65 + .../themes/advanced/docs/en/insert_link_button.htm | 33 + .../advanced/docs/en/insert_table_button.htm | 71 + .../tiny_mce/themes/advanced/docs/en/style.css | 28 + .../tiny_mce/themes/advanced/editor_template.js | 1 + .../themes/advanced/editor_template_src.js | 1534 +++++ .../javascripts/tiny_mce/themes/advanced/image.htm | 100 + .../tiny_mce/themes/advanced/images/anchor.gif | Bin 0 -> 171 bytes .../themes/advanced/images/anchor_symbol.gif | Bin 0 -> 70 bytes .../tiny_mce/themes/advanced/images/backcolor.gif | Bin 0 -> 359 bytes .../tiny_mce/themes/advanced/images/bold.gif | Bin 0 -> 76 bytes .../tiny_mce/themes/advanced/images/bold_de_se.gif | Bin 0 -> 73 bytes .../tiny_mce/themes/advanced/images/bold_es.gif | Bin 0 -> 80 bytes .../tiny_mce/themes/advanced/images/bold_fr.gif | Bin 0 -> 78 bytes .../tiny_mce/themes/advanced/images/bold_ru.gif | Bin 0 -> 77 bytes .../tiny_mce/themes/advanced/images/bold_tw.gif | Bin 0 -> 207 bytes .../tiny_mce/themes/advanced/images/browse.gif | Bin 0 -> 113 bytes .../tiny_mce/themes/advanced/images/bullist.gif | Bin 0 -> 108 bytes .../themes/advanced/images/button_menu.gif | Bin 0 -> 57 bytes .../tiny_mce/themes/advanced/images/buttons.gif | Bin 0 -> 5662 bytes .../themes/advanced/images/cancel_button_bg.gif | Bin 0 -> 677 bytes .../tiny_mce/themes/advanced/images/charmap.gif | Bin 0 -> 245 bytes .../tiny_mce/themes/advanced/images/cleanup.gif | Bin 0 -> 256 bytes .../tiny_mce/themes/advanced/images/close.gif | Bin 0 -> 102 bytes .../tiny_mce/themes/advanced/images/code.gif | Bin 0 -> 110 bytes .../tiny_mce/themes/advanced/images/color.gif | Bin 0 -> 125 bytes .../tiny_mce/themes/advanced/images/copy.gif | Bin 0 -> 263 bytes .../tiny_mce/themes/advanced/images/custom_1.gif | Bin 0 -> 76 bytes .../tiny_mce/themes/advanced/images/cut.gif | Bin 0 -> 187 bytes .../tiny_mce/themes/advanced/images/forecolor.gif | Bin 0 -> 342 bytes .../tiny_mce/themes/advanced/images/help.gif | Bin 0 -> 295 bytes .../tiny_mce/themes/advanced/images/hr.gif | Bin 0 -> 63 bytes .../tiny_mce/themes/advanced/images/image.gif | Bin 0 -> 194 bytes .../tiny_mce/themes/advanced/images/indent.gif | Bin 0 -> 112 bytes .../themes/advanced/images/insert_button_bg.gif | Bin 0 -> 703 bytes .../tiny_mce/themes/advanced/images/italic.gif | Bin 0 -> 79 bytes .../themes/advanced/images/italic_de_se.gif | Bin 0 -> 75 bytes .../tiny_mce/themes/advanced/images/italic_es.gif | Bin 0 -> 74 bytes .../tiny_mce/themes/advanced/images/italic_ru.gif | Bin 0 -> 78 bytes .../tiny_mce/themes/advanced/images/italic_tw.gif | Bin 0 -> 274 bytes .../themes/advanced/images/justifycenter.gif | Bin 0 -> 70 bytes .../themes/advanced/images/justifyfull.gif | Bin 0 -> 71 bytes .../themes/advanced/images/justifyleft.gif | Bin 0 -> 71 bytes .../themes/advanced/images/justifyright.gif | Bin 0 -> 70 bytes .../tiny_mce/themes/advanced/images/link.gif | Bin 0 -> 175 bytes .../tiny_mce/themes/advanced/images/menu_check.gif | Bin 0 -> 51 bytes .../themes/advanced/images/newdocument.gif | Bin 0 -> 170 bytes .../tiny_mce/themes/advanced/images/numlist.gif | Bin 0 -> 111 bytes .../tiny_mce/themes/advanced/images/opacity.png | Bin 0 -> 147 bytes .../tiny_mce/themes/advanced/images/outdent.gif | Bin 0 -> 110 bytes .../tiny_mce/themes/advanced/images/paste.gif | Bin 0 -> 286 bytes .../tiny_mce/themes/advanced/images/redo.gif | Bin 0 -> 169 bytes .../themes/advanced/images/removeformat.gif | Bin 0 -> 168 bytes .../tiny_mce/themes/advanced/images/separator.gif | Bin 0 -> 57 bytes .../tiny_mce/themes/advanced/images/spacer.gif | Bin 0 -> 43 bytes .../themes/advanced/images/statusbar_resize.gif | Bin 0 -> 79 bytes .../themes/advanced/images/strikethrough.gif | Bin 0 -> 83 bytes .../tiny_mce/themes/advanced/images/sub.gif | Bin 0 -> 148 bytes .../tiny_mce/themes/advanced/images/sup.gif | Bin 0 -> 147 bytes .../tiny_mce/themes/advanced/images/underline.gif | Bin 0 -> 88 bytes .../themes/advanced/images/underline_es.gif | Bin 0 -> 79 bytes .../themes/advanced/images/underline_fr.gif | Bin 0 -> 79 bytes .../themes/advanced/images/underline_ru.gif | Bin 0 -> 77 bytes .../themes/advanced/images/underline_tw.gif | Bin 0 -> 245 bytes .../tiny_mce/themes/advanced/images/undo.gif | Bin 0 -> 175 bytes .../tiny_mce/themes/advanced/images/unlink.gif | Bin 0 -> 190 bytes .../tiny_mce/themes/advanced/images/visualaid.gif | Bin 0 -> 206 bytes .../tiny_mce/themes/advanced/images/xp/tab_bg.gif | Bin 0 -> 694 bytes .../tiny_mce/themes/advanced/images/xp/tab_end.gif | Bin 0 -> 169 bytes .../themes/advanced/images/xp/tab_sel_bg.gif | Bin 0 -> 428 bytes .../themes/advanced/images/xp/tab_sel_end.gif | Bin 0 -> 101 bytes .../tiny_mce/themes/advanced/images/xp/tabs_bg.gif | Bin 0 -> 48 bytes .../tiny_mce/themes/advanced/jscripts/about.js | 75 + .../tiny_mce/themes/advanced/jscripts/anchor.js | 74 + .../tiny_mce/themes/advanced/jscripts/charmap.js | 326 + .../themes/advanced/jscripts/color_picker.js | 108 + .../tiny_mce/themes/advanced/jscripts/image.js | 81 + .../tiny_mce/themes/advanced/jscripts/link.js | 70 + .../themes/advanced/jscripts/source_editor.js | 60 + .../tiny_mce/themes/advanced/langs/en.js | 82 + .../javascripts/tiny_mce/themes/advanced/link.htm | 100 + .../tiny_mce/themes/advanced/source_editor.htm | 32 + .../tiny_mce/themes/simple/css/editor_content.css | 25 + .../tiny_mce/themes/simple/css/editor_popup.css | 41 + .../tiny_mce/themes/simple/css/editor_ui.css | 125 + .../tiny_mce/themes/simple/editor_template.js | 1 + .../tiny_mce/themes/simple/editor_template_src.js | 84 + .../tiny_mce/themes/simple/images/bold.gif | Bin 0 -> 76 bytes .../tiny_mce/themes/simple/images/bold_de_se.gif | Bin 0 -> 73 bytes .../tiny_mce/themes/simple/images/bold_fr.gif | Bin 0 -> 78 bytes .../tiny_mce/themes/simple/images/bold_ru.gif | Bin 0 -> 77 bytes .../tiny_mce/themes/simple/images/bold_tw.gif | Bin 0 -> 207 bytes .../tiny_mce/themes/simple/images/bullist.gif | Bin 0 -> 108 bytes .../tiny_mce/themes/simple/images/buttons.gif | Bin 0 -> 1054 bytes .../tiny_mce/themes/simple/images/cleanup.gif | Bin 0 -> 256 bytes .../tiny_mce/themes/simple/images/italic.gif | Bin 0 -> 79 bytes .../tiny_mce/themes/simple/images/italic_de_se.gif | Bin 0 -> 75 bytes .../tiny_mce/themes/simple/images/italic_ru.gif | Bin 0 -> 78 bytes .../tiny_mce/themes/simple/images/italic_tw.gif | Bin 0 -> 274 bytes .../tiny_mce/themes/simple/images/numlist.gif | Bin 0 -> 111 bytes .../tiny_mce/themes/simple/images/redo.gif | Bin 0 -> 169 bytes .../tiny_mce/themes/simple/images/separator.gif | Bin 0 -> 57 bytes .../tiny_mce/themes/simple/images/spacer.gif | Bin 0 -> 43 bytes .../themes/simple/images/strikethrough.gif | Bin 0 -> 83 bytes .../tiny_mce/themes/simple/images/underline.gif | Bin 0 -> 88 bytes .../tiny_mce/themes/simple/images/underline_fr.gif | Bin 0 -> 79 bytes .../tiny_mce/themes/simple/images/underline_ru.gif | Bin 0 -> 77 bytes .../tiny_mce/themes/simple/images/underline_tw.gif | Bin 0 -> 245 bytes .../tiny_mce/themes/simple/images/undo.gif | Bin 0 -> 175 bytes public/javascripts/tiny_mce/tiny_mce.js | 1 + public/javascripts/tiny_mce/tiny_mce_popup.js | 288 + public/javascripts/tiny_mce/tiny_mce_src.js | 7284 ++++++++++++++++++++ .../javascripts/tiny_mce/utils/editable_selects.js | 61 + public/javascripts/tiny_mce/utils/form_utils.js | 210 + public/javascripts/tiny_mce/utils/mclayer.js | 210 + public/javascripts/tiny_mce/utils/mctabs.js | 74 + public/javascripts/tiny_mce/utils/validate.js | 219 + public/stylesheets/boxroom.css | 777 ++- startover.sh | 7 + tiny_mce_options.yml | 121 + vendor/plugins/exception_notification/README | 111 + vendor/plugins/exception_notification/init.rb | 1 + .../lib/exception_notifiable.rb | 99 + .../lib/exception_notifier.rb | 67 + .../lib/exception_notifier_helper.rb | 63 + .../views/exception_notifier/_backtrace.rhtml | 1 + .../views/exception_notifier/_environment.rhtml | 7 + .../views/exception_notifier/_inspect_model.rhtml | 16 + .../views/exception_notifier/_request.rhtml | 3 + .../views/exception_notifier/_session.rhtml | 2 + .../views/exception_notifier/_title.rhtml | 3 + .../exception_notification.rhtml | 6 + vendor/plugins/tiny_mce/init.rb | 4 + vendor/plugins/tiny_mce/lib/tiny_mce.rb | 36 + vendor/plugins/tiny_mce/lib/tiny_mce_helper.rb | 48 + vendor/plugins/tiny_mce/tiny_mce_options.yml | 121 + vendor/plugins/tiny_mce_gzip/README | 37 + vendor/plugins/tiny_mce_gzip/init.rb | 2 + .../plugins/tiny_mce_gzip/lib/gzip_action_cache.rb | 79 + vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip.js | 120 + .../tiny_mce_gzip/lib/tiny_mce_gzip_controller.rb | 63 + .../tiny_mce_gzip/lib/tiny_mce_gzip_routes.rb | 9 + 623 files changed, 35688 insertions(+), 923 deletions(-) create mode 100644 Notes.txt create mode 100644 app/controllers/admin_tool_controller.rb create mode 100644 app/controllers/frontpage_controller.rb create mode 100644 app/controllers/usage_controller.rb create mode 100644 app/helpers/frontpage_helper.rb create mode 100644 app/models/news.rb create mode 100644 app/views/admin_tool/folder_tree.rhtml create mode 100644 app/views/admin_tool/server_status.rhtml create mode 100644 app/views/admin_tool/show_log.rhtml create mode 100644 app/views/frontpage/_form.rhtml create mode 100644 app/views/frontpage/edit.rhtml create mode 100644 app/views/frontpage/filelist.rhtml create mode 100644 app/views/frontpage/list.rhtml create mode 100644 app/views/frontpage/new.rhtml create mode 100644 app/views/frontpage/show.rhtml create mode 100644 app/views/layouts/admin_tool.rhtml rewrite app/views/layouts/file.rhtml (71%) rewrite app/views/layouts/folder.rhtml (62%) create mode 100644 app/views/layouts/frontpage.rhtml rewrite app/views/layouts/group.rhtml (72%) rewrite app/views/layouts/search.rhtml (75%) create mode 100644 app/views/layouts/usage.rhtml rewrite app/views/layouts/user.rhtml (67%) create mode 100644 app/views/shared/_content.rhtml rewrite app/views/shared/_go_to_menu.rhtml (100%) create mode 100644 app/views/shared/_intranet.rhtml create mode 100755 app/views/shared/_root_folder.rhtml create mode 100644 app/views/shared/_top_header.rhtml create mode 100644 app/views/user/mass_create.rhtml create mode 100644 config/lighttpd.conf create mode 100644 config/mongrel_cluster.yml create mode 100644 create-data-dir.sh create mode 100644 lib/extensions.rb create mode 100644 lib/tiny_mce.rb create mode 100644 lib/tiny_mce_helper.rb create mode 100644 public/images/a.png create mode 100644 public/images/alert.black.png create mode 100644 public/images/alert.red.png create mode 100644 public/images/apache_pb.png create mode 100644 public/images/apache_pb2.png create mode 100644 public/images/apache_pb2_ani.png create mode 100755 public/images/arrow_up.png create mode 100644 public/images/ascii.png create mode 100644 public/images/back.png create mode 100644 public/images/ball.gray.png create mode 100644 public/images/ball.red.png create mode 100644 public/images/binary.png create mode 100644 public/images/binhex.png create mode 100644 public/images/blank.png create mode 100644 public/images/bomb.png create mode 100644 public/images/box1.png create mode 100644 public/images/box2.png create mode 100644 public/images/broken.png create mode 100644 public/images/burst.png create mode 100644 public/images/c.png create mode 100644 public/images/comp.blue.png create mode 100644 public/images/comp.gray.png create mode 100644 public/images/compressed.png create mode 100644 public/images/continued.png create mode 100644 public/images/dir.png create mode 100644 public/images/diskimg.png create mode 100644 public/images/down.png create mode 100644 public/images/dvi.png create mode 100644 public/images/f.png create mode 100644 public/images/fileicon-c.jpg create mode 100644 public/images/fileicon-cpp.jpg create mode 100644 public/images/fileicon-deb.jpg create mode 100644 public/images/fileicon-djvu.jpg create mode 100644 public/images/fileicon-dvi.jpg create mode 100644 public/images/fileicon-exe.jpg create mode 100644 public/images/fileicon-exe.png create mode 100644 public/images/fileicon-h.jpg create mode 100644 public/images/fileicon-html.jpg create mode 100644 public/images/fileicon-html.png create mode 100644 public/images/fileicon-iso.jpg create mode 100644 public/images/fileicon-java.jpg create mode 100644 public/images/fileicon-mid.jpg create mode 100644 public/images/fileicon-mov.jpg create mode 100644 public/images/fileicon-o.jpg create mode 100644 public/images/fileicon-ogg.jpg create mode 100644 public/images/fileicon-pdf.jpg create mode 100644 public/images/fileicon-ps.jpg create mode 100644 public/images/fileicon-rm.jpg create mode 100644 public/images/fileicon-rpm.jpg create mode 100644 public/images/fileicon-svg.jpg create mode 100644 public/images/fileicon-tar.jpg create mode 100644 public/images/fileicon-tex.jpg create mode 100644 public/images/fileicon-ttf.jpg create mode 100644 public/images/fileicon-txt.jpg create mode 100644 public/images/fileicon.jpg create mode 100644 public/images/folder.open.png create mode 100644 public/images/folder.sec.png create mode 100644 public/images/forward.png create mode 100644 public/images/generic.png create mode 100644 public/images/generic.red.png create mode 100644 public/images/generic.sec.png create mode 100644 public/images/hand.right.png create mode 100644 public/images/hand.up.png create mode 100644 public/images/icon.sheet.png create mode 100644 public/images/image.png create mode 100644 public/images/image1.png create mode 100644 public/images/image2.png create mode 100644 public/images/image3.png create mode 100644 public/images/index.png create mode 100644 public/images/layout.png create mode 100644 public/images/left.png create mode 100644 public/images/link.png create mode 100644 public/images/log.png create mode 100644 public/images/logo.jpg create mode 100644 public/images/movie.png create mode 100644 public/images/p.png create mode 100644 public/images/patch.png create mode 100644 public/images/pdf.png create mode 100644 public/images/pie0.png create mode 100644 public/images/pie1.png create mode 100644 public/images/pie2.png create mode 100644 public/images/pie3.png create mode 100644 public/images/pie4.png create mode 100644 public/images/pie5.png create mode 100644 public/images/pie6.png create mode 100644 public/images/pie7.png create mode 100644 public/images/pie8.png create mode 100644 public/images/portal.png create mode 100644 public/images/preview.png create mode 100644 public/images/ps.png create mode 100644 public/images/quill.png create mode 100644 public/images/right.png create mode 100644 public/images/screw1.png create mode 100644 public/images/screw2.png create mode 100644 public/images/script.png create mode 100644 public/images/sound1.png create mode 100644 public/images/sound2.png create mode 100644 public/images/sphere1.png create mode 100644 public/images/sphere2.png create mode 100644 public/images/spreadsheet.png create mode 100644 public/images/tar.png create mode 100644 public/images/tex.png create mode 100644 public/images/text.png create mode 100644 public/images/transfer.png create mode 100644 public/images/txt.png create mode 100644 public/images/unknown.png create mode 100644 public/images/up.png create mode 100644 public/images/uu.png create mode 100644 public/images/uuencoded.png create mode 100644 public/images/word.png create mode 100644 public/images/world1.png create mode 100644 public/images/world2.png create mode 100755 public/javascripts/tiny_mce/blank.htm create mode 100755 public/javascripts/tiny_mce/langs/en.js create mode 100755 public/javascripts/tiny_mce/langs/readme.txt create mode 100755 public/javascripts/tiny_mce/license.txt create mode 100644 public/javascripts/tiny_mce/plugins/_template/editor_plugin.js create mode 100644 public/javascripts/tiny_mce/plugins/_template/editor_plugin_src.js create mode 100644 public/javascripts/tiny_mce/plugins/_template/images/template.gif create mode 100644 public/javascripts/tiny_mce/plugins/_template/langs/en.js create mode 100644 public/javascripts/tiny_mce/plugins/_template/popup.htm create mode 100644 public/javascripts/tiny_mce/plugins/_template/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/advhr/css/advhr.css create mode 100755 public/javascripts/tiny_mce/plugins/advhr/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/advhr/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/advhr/images/advhr.gif create mode 100755 public/javascripts/tiny_mce/plugins/advhr/jscripts/rule.js create mode 100755 public/javascripts/tiny_mce/plugins/advhr/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/advhr/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/advhr/rule.htm create mode 100755 public/javascripts/tiny_mce/plugins/advimage/css/advimage.css create mode 100755 public/javascripts/tiny_mce/plugins/advimage/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/advimage/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/advimage/image.htm create mode 100755 public/javascripts/tiny_mce/plugins/advimage/images/sample.gif create mode 100755 public/javascripts/tiny_mce/plugins/advimage/jscripts/functions.js create mode 100755 public/javascripts/tiny_mce/plugins/advimage/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/advimage/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/advlink/css/advlink.css create mode 100755 public/javascripts/tiny_mce/plugins/advlink/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/advlink/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/advlink/jscripts/functions.js create mode 100755 public/javascripts/tiny_mce/plugins/advlink/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/advlink/link.htm create mode 100755 public/javascripts/tiny_mce/plugins/advlink/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/autosave/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/autosave/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/autosave/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/autosave/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/blockquote/editor_plugin.js create mode 100644 public/javascripts/tiny_mce/plugins/blockquote/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/blockquote/images/quote.gif create mode 100755 public/javascripts/tiny_mce/plugins/blockquote/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/blockquote/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/cleanup/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/cleanup/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/cleanup/readme.txt create mode 100644 public/javascripts/tiny_mce/plugins/codeblock/editor_plugin_src.js create mode 100644 public/javascripts/tiny_mce/plugins/codeblock/images/code.gif create mode 100755 public/javascripts/tiny_mce/plugins/codeblock/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/codeblock/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/contextmenu/css/contextmenu.css create mode 100755 public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/contextmenu/images/spacer.gif create mode 100755 public/javascripts/tiny_mce/plugins/contextmenu/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/devkit/css/devkit.css create mode 100755 public/javascripts/tiny_mce/plugins/devkit/css/devkit_ui.css create mode 100755 public/javascripts/tiny_mce/plugins/devkit/devkit.htm create mode 100755 public/javascripts/tiny_mce/plugins/devkit/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/devkit/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/devkit/images/flip_down.gif create mode 100755 public/javascripts/tiny_mce/plugins/devkit/images/flip_up.gif create mode 100755 public/javascripts/tiny_mce/plugins/devkit/jscripts/devkit.js create mode 100755 public/javascripts/tiny_mce/plugins/devkit/jscripts/diff.js create mode 100755 public/javascripts/tiny_mce/plugins/devkit/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/directionality/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/directionality/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/directionality/images/ltr.gif create mode 100755 public/javascripts/tiny_mce/plugins/directionality/images/rtl.gif create mode 100755 public/javascripts/tiny_mce/plugins/directionality/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/directionality/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/emotions/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/emotions/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/emotions/emotions.htm create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/emotions.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-cool.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-cry.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-embarassed.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-frown.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-innocent.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-kiss.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-laughing.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-sealed.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-smile.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-surprised.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-undecided.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-wink.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/images/smiley-yell.gif create mode 100755 public/javascripts/tiny_mce/plugins/emotions/jscripts/functions.js create mode 100755 public/javascripts/tiny_mce/plugins/emotions/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/emotions/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/flash/css/content.css create mode 100755 public/javascripts/tiny_mce/plugins/flash/css/flash.css create mode 100755 public/javascripts/tiny_mce/plugins/flash/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/flash/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/flash/flash.htm create mode 100755 public/javascripts/tiny_mce/plugins/flash/images/flash.gif create mode 100755 public/javascripts/tiny_mce/plugins/flash/jscripts/flash.js create mode 100755 public/javascripts/tiny_mce/plugins/flash/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/flash/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/blank.htm create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/css/fullpage.css create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/fullpage.htm create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/images/add.gif create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/images/fullpage.gif create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/images/move_down.gif create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/images/move_up.gif create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/images/remove.gif create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/jscripts/fullpage.js create mode 100755 public/javascripts/tiny_mce/plugins/fullpage/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/fullscreen/css/content.css create mode 100755 public/javascripts/tiny_mce/plugins/fullscreen/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/fullscreen/images/fullscreen.gif create mode 100755 public/javascripts/tiny_mce/plugins/fullscreen/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/fullscreen/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/iespell/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/iespell/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/iespell/images/iespell.gif create mode 100755 public/javascripts/tiny_mce/plugins/iespell/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/iespell/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/css/inlinepopup.css create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/images/spacer.gif create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/images/window_close.gif create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/images/window_maximize.gif create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/images/window_minimize.gif create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/images/window_resize.gif create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/jscripts/mcwindows.js create mode 100755 public/javascripts/tiny_mce/plugins/inlinepopups/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/insertdatetime/images/insertdate.gif create mode 100755 public/javascripts/tiny_mce/plugins/insertdatetime/images/inserttime.gif create mode 100755 public/javascripts/tiny_mce/plugins/insertdatetime/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/insertdatetime/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/layer/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/layer/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/layer/images/absolute.gif create mode 100755 public/javascripts/tiny_mce/plugins/layer/images/backward.gif create mode 100755 public/javascripts/tiny_mce/plugins/layer/images/forward.gif create mode 100755 public/javascripts/tiny_mce/plugins/layer/images/insert_layer.gif create mode 100755 public/javascripts/tiny_mce/plugins/layer/images/insertlayer.gif create mode 100755 public/javascripts/tiny_mce/plugins/layer/images/movebackward.gif create mode 100755 public/javascripts/tiny_mce/plugins/layer/images/moveforward.gif create mode 100755 public/javascripts/tiny_mce/plugins/layer/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/layer/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/media/css/content.css create mode 100755 public/javascripts/tiny_mce/plugins/media/css/media.css create mode 100755 public/javascripts/tiny_mce/plugins/media/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/media/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/media/images/flash.gif create mode 100755 public/javascripts/tiny_mce/plugins/media/images/media.gif create mode 100755 public/javascripts/tiny_mce/plugins/media/images/quicktime.gif create mode 100755 public/javascripts/tiny_mce/plugins/media/images/realmedia.gif create mode 100755 public/javascripts/tiny_mce/plugins/media/images/shockwave.gif create mode 100755 public/javascripts/tiny_mce/plugins/media/images/windowsmedia.gif create mode 100755 public/javascripts/tiny_mce/plugins/media/jscripts/embed.js create mode 100755 public/javascripts/tiny_mce/plugins/media/jscripts/media.js create mode 100755 public/javascripts/tiny_mce/plugins/media/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/media/media.htm create mode 100755 public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif create mode 100755 public/javascripts/tiny_mce/plugins/nonbreaking/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/noneditable/css/noneditable.css create mode 100755 public/javascripts/tiny_mce/plugins/noneditable/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/noneditable/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/noneditable/readme.txt create mode 100644 public/javascripts/tiny_mce/plugins/ntattachlink/editor_plugin.js create mode 100644 public/javascripts/tiny_mce/plugins/ntattachlink/editor_plugin_src.js create mode 100644 public/javascripts/tiny_mce/plugins/ntattachlink/langs/en.js create mode 100644 public/javascripts/tiny_mce/plugins/ntimagelink/editor_plugin_src.js create mode 100644 public/javascripts/tiny_mce/plugins/ntpagelink/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/paste/blank.htm create mode 100755 public/javascripts/tiny_mce/plugins/paste/css/blank.css create mode 100755 public/javascripts/tiny_mce/plugins/paste/css/pasteword.css create mode 100755 public/javascripts/tiny_mce/plugins/paste/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/paste/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/paste/images/pastetext.gif create mode 100755 public/javascripts/tiny_mce/plugins/paste/images/pasteword.gif create mode 100755 public/javascripts/tiny_mce/plugins/paste/images/selectall.gif create mode 100755 public/javascripts/tiny_mce/plugins/paste/jscripts/pastetext.js create mode 100755 public/javascripts/tiny_mce/plugins/paste/jscripts/pasteword.js create mode 100755 public/javascripts/tiny_mce/plugins/paste/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/paste/pastetext.htm create mode 100755 public/javascripts/tiny_mce/plugins/paste/pasteword.htm create mode 100755 public/javascripts/tiny_mce/plugins/paste/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/preview/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/preview/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/preview/example.html create mode 100755 public/javascripts/tiny_mce/plugins/preview/images/preview.gif create mode 100755 public/javascripts/tiny_mce/plugins/preview/jscripts/embed.js create mode 100755 public/javascripts/tiny_mce/plugins/preview/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/preview/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/print/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/print/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/print/images/print.gif create mode 100755 public/javascripts/tiny_mce/plugins/print/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/print/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/save/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/save/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/save/images/save.gif create mode 100755 public/javascripts/tiny_mce/plugins/save/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/save/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/css/searchreplace.css create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/images/replace.gif create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/images/search.gif create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/searchreplace/searchreplace.htm create mode 100755 public/javascripts/tiny_mce/plugins/style/css/props.css create mode 100755 public/javascripts/tiny_mce/plugins/style/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/style/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/style/images/apply_button_bg.gif create mode 100755 public/javascripts/tiny_mce/plugins/style/images/style_info.gif create mode 100755 public/javascripts/tiny_mce/plugins/style/images/styleprops.gif create mode 100755 public/javascripts/tiny_mce/plugins/style/jscripts/props.js create mode 100755 public/javascripts/tiny_mce/plugins/style/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/style/props.htm create mode 100755 public/javascripts/tiny_mce/plugins/style/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/table/cell.htm create mode 100755 public/javascripts/tiny_mce/plugins/table/css/cell.css create mode 100755 public/javascripts/tiny_mce/plugins/table/css/row.css create mode 100755 public/javascripts/tiny_mce/plugins/table/css/table.css create mode 100755 public/javascripts/tiny_mce/plugins/table/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/table/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/table/images/buttons.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_cell_props.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_delete.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_delete_col.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_delete_row.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_insert_col_after.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_insert_col_before.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_insert_row_after.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_insert_row_before.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_merge_cells.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_row_props.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/images/table_split_cells.gif create mode 100755 public/javascripts/tiny_mce/plugins/table/jscripts/cell.js create mode 100755 public/javascripts/tiny_mce/plugins/table/jscripts/merge_cells.js create mode 100755 public/javascripts/tiny_mce/plugins/table/jscripts/row.js create mode 100755 public/javascripts/tiny_mce/plugins/table/jscripts/table.js create mode 100755 public/javascripts/tiny_mce/plugins/table/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/table/merge_cells.htm create mode 100755 public/javascripts/tiny_mce/plugins/table/readme.txt create mode 100755 public/javascripts/tiny_mce/plugins/table/row.htm create mode 100755 public/javascripts/tiny_mce/plugins/table/table.htm create mode 100755 public/javascripts/tiny_mce/plugins/visualchars/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/visualchars/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/visualchars/images/visualchars.gif create mode 100755 public/javascripts/tiny_mce/plugins/visualchars/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/abbr.htm create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/acronym.htm create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/cite.htm create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/css/popup.css create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/del.htm create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/images/abbr.gif create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/images/acronym.gif create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/images/cite.gif create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/images/date_time.gif create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/images/del.gif create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/images/ins.gif create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/images/remove_button_bg.gif create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/ins.htm create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/abbr.js create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/acronym.js create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/cite.js create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/del.js create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/element_common.js create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/ins.js create mode 100755 public/javascripts/tiny_mce/plugins/xhtmlxtras/langs/en.js create mode 100755 public/javascripts/tiny_mce/plugins/zoom/editor_plugin.js create mode 100755 public/javascripts/tiny_mce/plugins/zoom/editor_plugin_src.js create mode 100755 public/javascripts/tiny_mce/plugins/zoom/readme.txt create mode 100755 public/javascripts/tiny_mce/themes/advanced/about.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/anchor.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/charmap.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/color_picker.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/css/editor_content.css create mode 100755 public/javascripts/tiny_mce/themes/advanced/css/editor_popup.css create mode 100755 public/javascripts/tiny_mce/themes/advanced/css/editor_ui.css create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/about.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/common_buttons.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/index.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/insert_image_button.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/insert_link_button.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/insert_table_button.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/docs/en/style.css create mode 100755 public/javascripts/tiny_mce/themes/advanced/editor_template.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/editor_template_src.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/image.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/anchor.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/anchor_symbol.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/backcolor.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/bold.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/bold_de_se.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/bold_es.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/bold_fr.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/bold_ru.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/bold_tw.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/browse.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/bullist.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/button_menu.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/buttons.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/cancel_button_bg.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/charmap.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/cleanup.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/close.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/code.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/color.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/copy.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/custom_1.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/cut.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/forecolor.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/help.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/hr.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/image.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/indent.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/insert_button_bg.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/italic.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/italic_de_se.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/italic_es.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/italic_ru.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/italic_tw.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/justifycenter.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/justifyfull.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/justifyleft.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/justifyright.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/link.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/menu_check.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/newdocument.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/numlist.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/opacity.png create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/outdent.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/paste.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/redo.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/removeformat.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/separator.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/spacer.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/statusbar_resize.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/strikethrough.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/sub.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/sup.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/underline.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/underline_es.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/underline_fr.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/underline_ru.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/underline_tw.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/undo.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/unlink.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/visualaid.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/xp/tab_bg.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/xp/tab_end.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/images/xp/tabs_bg.gif create mode 100755 public/javascripts/tiny_mce/themes/advanced/jscripts/about.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/jscripts/anchor.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/jscripts/charmap.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/jscripts/color_picker.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/jscripts/image.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/jscripts/link.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/jscripts/source_editor.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/langs/en.js create mode 100755 public/javascripts/tiny_mce/themes/advanced/link.htm create mode 100755 public/javascripts/tiny_mce/themes/advanced/source_editor.htm create mode 100755 public/javascripts/tiny_mce/themes/simple/css/editor_content.css create mode 100755 public/javascripts/tiny_mce/themes/simple/css/editor_popup.css create mode 100755 public/javascripts/tiny_mce/themes/simple/css/editor_ui.css create mode 100755 public/javascripts/tiny_mce/themes/simple/editor_template.js create mode 100755 public/javascripts/tiny_mce/themes/simple/editor_template_src.js create mode 100755 public/javascripts/tiny_mce/themes/simple/images/bold.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/bold_de_se.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/bold_fr.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/bold_ru.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/bold_tw.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/bullist.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/buttons.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/cleanup.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/italic.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/italic_de_se.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/italic_ru.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/italic_tw.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/numlist.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/redo.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/separator.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/spacer.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/strikethrough.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/underline.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/underline_fr.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/underline_ru.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/underline_tw.gif create mode 100755 public/javascripts/tiny_mce/themes/simple/images/undo.gif create mode 100755 public/javascripts/tiny_mce/tiny_mce.js create mode 100755 public/javascripts/tiny_mce/tiny_mce_popup.js create mode 100755 public/javascripts/tiny_mce/tiny_mce_src.js create mode 100755 public/javascripts/tiny_mce/utils/editable_selects.js create mode 100755 public/javascripts/tiny_mce/utils/form_utils.js create mode 100755 public/javascripts/tiny_mce/utils/mclayer.js create mode 100755 public/javascripts/tiny_mce/utils/mctabs.js create mode 100755 public/javascripts/tiny_mce/utils/validate.js rewrite public/stylesheets/boxroom.css (95%) create mode 100755 startover.sh create mode 100644 tiny_mce_options.yml create mode 100644 vendor/plugins/exception_notification/README create mode 100644 vendor/plugins/exception_notification/init.rb create mode 100644 vendor/plugins/exception_notification/lib/exception_notifiable.rb create mode 100644 vendor/plugins/exception_notification/lib/exception_notifier.rb create mode 100644 vendor/plugins/exception_notification/lib/exception_notifier_helper.rb create mode 100644 vendor/plugins/exception_notification/views/exception_notifier/_backtrace.rhtml create mode 100644 vendor/plugins/exception_notification/views/exception_notifier/_environment.rhtml create mode 100644 vendor/plugins/exception_notification/views/exception_notifier/_inspect_model.rhtml create mode 100644 vendor/plugins/exception_notification/views/exception_notifier/_request.rhtml create mode 100644 vendor/plugins/exception_notification/views/exception_notifier/_session.rhtml create mode 100644 vendor/plugins/exception_notification/views/exception_notifier/_title.rhtml create mode 100644 vendor/plugins/exception_notification/views/exception_notifier/exception_notification.rhtml create mode 100644 vendor/plugins/tiny_mce/init.rb create mode 100644 vendor/plugins/tiny_mce/lib/tiny_mce.rb create mode 100644 vendor/plugins/tiny_mce/lib/tiny_mce_helper.rb create mode 100644 vendor/plugins/tiny_mce/tiny_mce_options.yml create mode 100644 vendor/plugins/tiny_mce_gzip/README create mode 100644 vendor/plugins/tiny_mce_gzip/init.rb create mode 100644 vendor/plugins/tiny_mce_gzip/lib/gzip_action_cache.rb create mode 100644 vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip.js create mode 100644 vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip_controller.rb create mode 100644 vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip_routes.rb diff --git a/Notes.txt b/Notes.txt new file mode 100644 index 0000000..5d76e5f --- /dev/null +++ b/Notes.txt @@ -0,0 +1,62 @@ +Go through this list and make sure all bugs are ironed out! +- upload file / create folder seems to work well +- upload zipfile with existing filename zip1 doesn't get +test +Should I rename files with names that don't match, or just give an error message? Anyway, for some weird-ass reason, sometimes the single file-upload doesn't pass the filename to process_all_files thingy. --- seems to work, I'll implement this for directory unzipping +too first, and then do more testing. + +TODO: Log attempted upload of blocked filetype. + +had to add weird "extract directory names" thingy to extract dirs... do this before so we can +check if directory names already exist? - this thing is so broken... disabled by now. +zip doesn't work on ciihq + +---- +*Showstopper:* +* BUG!!!: Moving folders and deleting folders does not update the Ferret index, which leads to search page crashing. +* BUG!!!: Moving folders and deleting folders doesn't even delete all belonging folders, like zippety zip - or all belonging files! + +*General:* +* FEATURE: is it possible to make more stuff case-insensitive? filenames, folders, groups, users... or at least the checks for similar names (don't want Folder and folder in the same dir). Need to check with ActiveRecord's find_by_name for example. + +*Quota:* (agreed to temporarily suspend this) +* BUG: size of directories and number of files not updated correctly when unpacking zip files? shows minus -- also does not propagate up properly? +* BUG: directory file sizes not updated when multimove. multidelete should be OK? +* TEST: get zip to different directories. test thoroughly. +* BUG: should not be able to set quota that is less than current size of sub_tree + +*User*: +* FEATURE: make group names case-insensitive? + +*Upload*: +* BUG?: permissions are not propagated properly! no delete permissions for admin on subfolder... +* !!!BUG: error checking on folders that already exist... / recovery with zip to folders +* FEATURE: javascript goodness: select all (for example)... how to make the zip stuff nicer? +* FEATURE: give option to rename uploaded file immediately +* FEATURE: have small text piece per folder (inherited) with information about usage, naming convention, etc (show on list and upload) +* BUG: do more filesystem checking - if a file or folder already exists on disk - shouldn't happen, but needs to be checked. + +*Folder*: +* !!!BUG: check if files exist first before overwriting with multimove + +*Usages*: +* FEATURE: usages: sorting, search + +--- + +_from Nita:_ +* FEATURE: each user gets a personal folder, to store for example passport copies when travelling (CARE Canada has this in LiveLink) - trying in danau-toba? +* FEATURE: versioning - not before 2.0 + +_from Paul:_ +* FEATURE: symbolic links (useful?) +* FEATURE: see permissions without having access to changing them - email button for person responsible for that folder +* FEATURE: new option: make new directory named as zip file or as user wants, put all zip files in there, make this default. keep option to upload zip file by itself. +* FEATURE: download all (check boxes next to folders as well) (already in danau-toba) + +--- + +*Recent bug fixes in taman-mini*: +* BUG: when batch_adding, doesn't give error message on group names? #235 +vBUG: user should not be able to change their own name. #236 +* BUG: should check that one cannot create folders or files with the same name as folders or file. however, using both flash and activerecord validate - look different - consolidate? #238n diff --git a/app/controllers/admin_tool_controller.rb b/app/controllers/admin_tool_controller.rb new file mode 100644 index 0000000..fdc16af --- /dev/null +++ b/app/controllers/admin_tool_controller.rb @@ -0,0 +1,34 @@ +class AdminToolController < ApplicationController + + # uses basic *NIX tools to give quick stats on the server - tested on Linux and OSX + def server_status + @status = "

Logged in users and uptime

" + @status << `w` + @status << "

Status of disks

" + @status << `df` + @status << "

Processes running

" + @status << `ps ax`.gsub!("<","<") # even with
 this messes up HTML
+    @status << "
" + end + + # shows a pretty printed list of directories and sub-dirs + def folder_tree + du_opt = (`uname` == "Darwin\n") ? "d0" : "-summarize" + @trash_size = `du -#{du_opt} -h #{TRASH_PATH}`.match(/(.*?)\t/)[1] + @ferret_size = `du -#{du_opt} -h #{FERRET_PATH}`.match(/(.*?)\t/)[1] + du_opt2 = (`uname` == "Darwin\n") ? "d2" : "-max-depth=2" + @folder_tree = `cd #{UPLOAD_PATH}; du -#{du_opt2} | sort -n` + end + + def show_log + @pages, @usages = paginate_collection(:per_page => 30, :page => params[:page]) do + if params[:id] + @name = (params[:file] ? Myfile.find(params[:id]).filename : Folder.find(params[:id]).name ) + (params[:file] ? Myfile : Folder).find(params[:id]).usages + else + Usage.find(:all,:order => "download_date_time desc") + end + end + end + +end \ No newline at end of file diff --git a/app/controllers/application.rb b/app/controllers/application.rb index 1fb36cd..41546b5 100644 --- a/app/controllers/application.rb +++ b/app/controllers/application.rb @@ -1,12 +1,46 @@ # Application-wide functionality used by controllers. class ApplicationController < ActionController::Base + include ExceptionNotifiable before_filter :authorize # user should be logged in + # Paginates an existing AR result set, returning the Paginator and collection slice. + # + # Based upon: + # http://www.bigbold.com/snippets/posts/show/389 + # + # Options: + # +:collection+: the collection to paginate + # +:per_page+: records per page + # +:page+: page + # + # Example: + # complex_query_result = Customer.find_by_sql('something complex') + # @pages, @customers = paginate_collection(:collection => complex_query_result) + # + # Alternatively, you can specify a block, the result of which will be used as the collection: + # @pages, @customers = paginate_collection { Customer.find_by_sql('something complex') } + def paginate_collection(options = {}, &block) + if block_given? + options[:collection] = block.call + elsif !options.include?(:collection) + raise ArgumentError, 'You must pass a collection in the options or using a block' + end + + default_options = {:per_page => 10, :page => 1} + options = default_options.merge options + + pages = Paginator.new self, options[:collection].size, options[:per_page], options[:page] + first = pages.current.offset + last = [first + options[:per_page], options[:collection].size].min + slice = options[:collection][first...last] + return [pages, slice] + end + # Returns the id of the current folder, which is used by the # CRUD authorize methods to check the logged in user's permissions. def folder_id case params[:controller] + '/' + params[:action] - when 'folder/index', 'folder/list', 'folder/new', 'folder/create', 'folder/update_permissions', 'folder/feed', 'file/upload', 'file/validate_filename' + when 'folder/index', 'folder/list', 'folder/new', 'folder/create', 'folder/update_permissions', 'folder/feed', 'file/upload', 'file/validate_filename','folder/multimove', 'folder/multichange' current_folder_id = 1 unless current_folder_id = params[:id] when 'file/do_the_upload' # This prevents a URL like 0.0.0.0/file/do_the_upload/12, @@ -35,6 +69,7 @@ class ApplicationController < ActionController::Base # AuthenticationController.login or AuthenticationController.create_admin (if no users exist yet). def authorize @logged_in_user = User.find(session[:user_id]) + User.logged_in_user = @logged_in_user rescue reset_session @logged_in_user = nil @@ -86,4 +121,5 @@ class ApplicationController < ActionController::Base redirect_to :controller => 'folder', :action => 'list', :id => folder_id and return false end end + end \ No newline at end of file diff --git a/app/controllers/authentication_controller.rb b/app/controllers/authentication_controller.rb index db2984c..dcd4493 100644 --- a/app/controllers/authentication_controller.rb +++ b/app/controllers/authentication_controller.rb @@ -18,7 +18,8 @@ class AuthenticationController < ApplicationController # Create the session and redirect unless logged_in_user.blank? session[:user_id] = logged_in_user.id - jumpto = session[:jumpto] || { :action => 'list', :controller => 'folder' } + User.logged_in_user = logged_in_user + jumpto = { :action => 'list', :controller => 'frontpage' } session[:jumpto] = nil redirect_to(jumpto) else @@ -49,6 +50,7 @@ class AuthenticationController < ApplicationController Folder.create_root_folder GroupPermission.create_initial_permissions session[:user_id] = @user.id # Login + User.logged_in_user = @user redirect_to(:action => 'list', :controller => 'folder') end diff --git a/app/controllers/file_controller.rb b/app/controllers/file_controller.rb index ed8e38a..74f9356 100644 --- a/app/controllers/file_controller.rb +++ b/app/controllers/file_controller.rb @@ -8,11 +8,12 @@ # [#update] updates the name of a file # [#destroy] delete files # [#preview] preview file; possibly with highlighted search words + class FileController < ApplicationController skip_before_filter :authorize, :only => :progress before_filter :does_folder_exist, :only => [:upload, :do_the_upload] # if the folder DOES exist, @folder is set to it - before_filter :does_file_exist, :except => [:upload, :progress, :do_the_upload, :validate_filename] # if the file DOES exist, @myfile is set to it + before_filter :does_file_exist, :except => [:upload, :progress, :do_the_upload, :validate_filename,] # if the file DOES exist, @myfile is set to it before_filter :authorize_creating, :only => :upload before_filter :authorize_reading, :only => [:download, :preview] before_filter :authorize_updating, :only => [:rename, :update] @@ -25,14 +26,7 @@ class FileController < ApplicationController # (adapted from http://wiki.rubyonrails.com/rails/pages/HowtoUploadFiles) def download # Log the 'usage' and return the file. - usage = Usage.new - usage.download_date_time = Time.now - usage.user = @logged_in_user - usage.myfile = @myfile - - if usage.save - send_file @myfile.path, :filename => @myfile.filename - end + send_file @myfile.path, :filename => @myfile.filename end # Shows upload progress. @@ -47,6 +41,7 @@ class FileController < ApplicationController # Shows the form where a user can select a new file to upload. def upload @myfile = Myfile.new + if USE_UPLOAD_PROGRESS render else @@ -57,28 +52,188 @@ class FileController < ApplicationController # Upload the file and create a record in the database. # The file will be stored in the 'current' folder. def do_the_upload - @myfile = Myfile.new(params[:myfile]) - @myfile.folder_id = folder_id - @myfile.date_modified = Time.now - @myfile.user = @logged_in_user + err = '' + if( @myfile = process_each_file(params[:myfile], Time.now, params[:myfile_newname]) ) + if @myfile.filename =~ FILE_TYPES_BLOCKED + flash[:folder_error] = "This file type is blocked and cannot be uploaded. Contact IT if you believe this is wrong." + @myfile.log_usage("error","user tried to upload file with blocked filetype") + @myfile.destroy + redirect_to :controller => 'file', :action => 'upload', :id => folder_id and return false + end - # change the filename if it already exists - if USE_UPLOAD_PROGRESS and not Myfile.find_by_filename_and_folder_id(@myfile.filename, folder_id).blank? - @myfile.filename = @myfile.filename + ' (' + Time.now.strftime('%Y%m%d%H%M%S') + ')' - end + @to_be_deleted = @myfile + is_zip = true if params[:zip][:yes] == '1' || params[:zip_folders][:yes] == '1' + zip_folders = true if params[:zip_folders][:yes] == '1' - if @myfile.save - if USE_UPLOAD_PROGRESS - return_url = url_for(:controller => 'folder', :action => 'list', :id => folder_id) - render :text => %() - else - redirect_to :controller => 'folder', :action => 'list', :id => folder_id + @folder = Folder.find(@myfile.folder_id) + + # general for all zip files - check if files exist/blocked filetypes + if is_zip + # check that no files of the wrong filetype and that file doesn't exist + zf = Zip::ZipFile.open(@myfile.path) + zf.each_with_index do |entry, index| + next if entry.ftype != :file || entry.name =~ /^\.|\/\./ || entry.name == "__MACOSX" + + name = File.basename(Myfile.base_part_of(entry.name)) + if Myfile.find_by_filename_and_folder_id(name, @folder.id) || Folder.find_by_name_and_parent_id(name, @folder.parent_id) + err = "The file #{name} has the same name as a file or folder in the current folder, and the zip file could not be extracted." + end + + # if zip_folders, only check root files for conflicts + next if entry.name.match(/\//) && zip_folders + if entry.name =~ FILE_TYPES_BLOCKED + err = "The file #{name} is not an allowed file type, and the zip file could not be uploaded. Please contact IT if you believe this is wrong." + @myfile.log_usage("error","user tried to upload file with blocked filetype #{entry.name}") + end + + unless err.empty? + @to_be_deleted.destroy + flash[:folder_error] = err + redirect_to :controller => 'file', :action => 'upload', :id => folder_id and return false + end + end + + unless zip_folders # we already know is_zip + # all's clear, let's do this! :) + zf.each_with_index do |entry, index| + # don't add dirs as files, most people don't want dot files added + # (Mac finder zip adds them) + next if entry.ftype != :file || entry.name =~ /^\.|\/\./ || entry.name == "__MACOSX" + date_time_created = Time.now + filesize = (entry.size / 1000).to_i + filesize = 1 if filesize == 0 + # remove directory paths from the filename if they exist + name = File.basename(entry.name) + + # extract one entry to a file in uploads/ + File.open("#{TEMP_PATH}/#{date_time_created.to_f}.tmp", + 'wb') { |f| f.write(zf.file.open(entry.name).read) } + p "process #{name} #{date_time_created.to_f}" + process_each_file(name, date_time_created, name, filesize) + + end + + else # zip folders + # let's get the directories and make them first + dirs, files = [], [] + zf.each_with_index do |entry, i| + p "entry name #{entry.name} ftype #{entry.ftype}" + dirs << entry.name if entry.ftype == :directory + files << entry if entry.ftype == :file + end + + # # apparently not all dirs are listed as dir entries, so I have to do this. argh. + # TODO: I took this out because it caused problems with normal zip files, but + # there might still be some weird zip files which won't work + # files.each do |f| + # dir, name = File.split(f.name) + # unless dirs.include?(dir) + # fulld = '' + # dir.split("/").each do |d| + # fulld += (fulld.empty? ? '' : "/") + d + # dirs << fulld + "/" unless dirs.include?(fulld) + # end + # end + # end + + level, parent, dirs_created = 1, [], {} + parent[level], old = @folder, @folder + + p dirs + # create new directories necessary + dirs.sort.each do |dir| + newlevel = dir.scan("/").length + parent[newlevel] = old if newlevel > level + level = newlevel + + dirname = dir.split("/").pop + + old = make_new_folder(dirname, parent[level]) + dirs_created[dir] = old + end + + # extract files and put them in the new directories + files.each do |file| + dirname, filename = File.split(file.name) + next if filename =~ /^\.|\/\./ || filename == "__MACOSX" + date_time_created = Time.now + filesize = (file.size / 1000).to_i + filesize = 1 if filesize == 0 + + # remove directory paths from the filename if they exist + name = File.basename(filename) + + # extract one entry to a file in TEMP_PATH + File.open("#{TEMP_PATH}/#{date_time_created.to_f}.tmp", 'wb') do |f| + f.write(zf.file.open(file.name).read) + end + p dirs_created + p dirname + dir = ( (dirname =~ /^\.$|^$/) ? @folder : dirs_created[dirname + "/"] ) + process_each_file( name, date_time_created, name, filesize, dir.id ) + + end + end + zf.close + @to_be_deleted.destroy end + + redirect_to :controller => 'folder', :action => 'list', :id => folder_id + else # @myfile could not be saved + # todo: check activerecord errors for other types of errors? + flash[:folder_error] = "You cannot upload a file with the same name as a folder or a file that already exists." + redirect_to :controller => 'file', :action => 'upload', :id => folder_id and return false + end + end + + def make_new_folder(folder, parent) + newfolder = Folder.new + newfolder.name = folder + newfolder.parent = parent + newfolder.date_modified = Time.now + newfolder.user = @logged_in_user + newfolder.save + copy_permissions_to_new_folder(parent, newfolder) + return newfolder + end + + def process_each_file(file, date_modified, name, size=0, folder=folder_id) + @date_time_created=date_modified + if file.kind_of?(String) + @myfile = Myfile.new else - render :template =>'file/upload_without_progress' unless USE_UPLOAD_PROGRESS + @myfile = Myfile.new(file) + end + @myfile.filename = name + @myfile.user = @logged_in_user + @myfile.date_modified=date_modified if @myfile.date_modified.nil? + @myfile.filename=Myfile.base_part_of(file) if file.kind_of?(String) # zip files + @myfile.folder_id = folder + @myfile.user = @logged_in_user + @myfile.filesize=size if @myfile.filesize.nil? + # change the filename if it already exists + @myfile.save + p @myfile + return (@myfile.save ? @myfile : false) + end + + # Copy the GroupPermissions of the parent folder to the given folder + def copy_permissions_to_new_folder(oldfolder, folder) + # get the 'parent' GroupPermissions + for parent_group_permissions in GroupPermission.find_all_by_folder_id(oldfolder.id) + # create the new GroupPermissions + group_permissions = GroupPermission.new + group_permissions.folder = folder + group_permissions.group = parent_group_permissions.group + group_permissions.can_create = parent_group_permissions.can_create + group_permissions.can_read = parent_group_permissions.can_read + group_permissions.can_update = parent_group_permissions.can_update + group_permissions.can_delete = parent_group_permissions.can_delete + group_permissions.save end end + # Validates a selected file in a file field via an Ajax call def validate_filename filename = CGI::unescape(request.raw_post).chomp('=') @@ -98,7 +253,7 @@ class FileController < ApplicationController # Update the name of the file with the new data. def update if request.post? - if @myfile.update_attributes(:filename => Myfile.base_part_of(params[:myfile][:filename]), :date_modified => Time.now) + if @myfile.rename(Myfile.base_part_of(params[:myfile][:filename])) redirect_to :controller => 'folder', :action => 'list', :id => folder_id else render_action 'rename' @@ -109,6 +264,7 @@ class FileController < ApplicationController # Preview file; possibly with highlighted search words. def preview if @myfile.indexed + @myfile.log_usage("previewed") if params[:search].blank? # normal case @text = @myfile.text else # if we come from the search results page @@ -126,12 +282,13 @@ class FileController < ApplicationController # These methods are private: # [#does_file_exist] Check if a file exists before executing an action private - # Check if a file exists before executing an action. - # If it doesn't exist: redirect to 'list' and show an error message - def does_file_exist - @myfile = Myfile.find(params[:id]) - rescue - flash.now[:folder_error] = 'Someone else deleted the file you are using. Your action was cancelled and you have been taken back to the root folder.' - redirect_to :controller => 'folder', :action => 'list' and return false - end + # Check if a file exists before executing an action. + # If it doesn't exist: redirect to 'list' and show an error message + def does_file_exist + @myfile = Myfile.find(params[:id]) + rescue + flash.now[:folder_error] = 'Someone else deleted the file you are using. Your action was cancelled and you have been taken back to the root folder.' + redirect_to :controller => 'folder', :action => 'list' and return false + end + end \ No newline at end of file diff --git a/app/controllers/folder_controller.rb b/app/controllers/folder_controller.rb index 4f2cd50..2379cc5 100644 --- a/app/controllers/folder_controller.rb +++ b/app/controllers/folder_controller.rb @@ -9,11 +9,12 @@ # [#update] updates the attributes of a folder # [#destroy] delete a folder # [#update_permissions] save the new rights given by the user + class FolderController < ApplicationController skip_before_filter :authorize, :only => :feed before_filter :does_folder_exist, :except => [:list, :feed, :feed_warning] - before_filter :authorize_creating, :only => [:new, :create] + before_filter :authorize_creating, :only => [:new, :create, :multimove] before_filter :authorize_reading, :only => :list before_filter :authorize_updating, :only => [:rename, :update, :update_rights] before_filter :authorize_deleting, :only => :destroy @@ -21,6 +22,98 @@ class FolderController < ApplicationController # Sessions are not needed for feeds session :off, :only => 'feed' layout 'folder', :except => 'feed' + + # do something to selected files in folder list + def multichange + @folder = Folder.find(folder_id) + unless @logged_in_user.can_delete(folder_id) + flash[:folder_error] = "You don't have delete permissions for this folder." + redirect_to :action => 'list', :id => folder_id and return false + end + + checked_files, checked_folders = [], [] + params['checked_file'].each {|k,v| checked_files << Myfile.find(k.to_i) if v == 'yes' } if params['checked_file'] + params['checked_folder'].each {|k,v| checked_folders << Folder.find(k.to_i) if v == 'yes' } if params['checked_folder'] + unless (checked_files.size + checked_folders.size) > 0 + flash[:folder_error] = "You didn't select any files or folders." + redirect_to :action => 'list', :id => folder_id and return false + end + + case params['checked']['action'] + when 'delete' + checked_files.each {|x| x.destroy } + checked_folders.each {|x| x.delete } + + when 'add to clipboard' + flash[:folder_info] = "The files and/or folders you marked have been put on the clipboard. They will not disappear from this folder, until you choose moving them to a new folder." + temp = @logged_in_user.clipboards + already_files, already_folders = temp.collect(&:myfile), temp.collect(&:folder) + checked_files.each do |x| + unless already_files.index(x) + Clipboard.new(:user => @logged_in_user, :myfile => x).save + end + end + + checked_folders.each do |x| + unless already_folders.index(x) + Clipboard.new(:user => @logged_in_user, :folder => x).save + end + end + + when 'download all' + tmpfile = TEMP_PATH + "/zip" + Time.now.to_f.to_s + ".tmp" + folders, files = "", "" + checked_folders.collect(&:name).each {|x| folders << "\"#{x}\" " } + checked_files.collect(&:filename).each {|x| files << "\"#{x}\" " } + + # tricky because we don't want absolute paths in the zip file, but the temp + # dir is a relative path + slashes = @folder.path_on_disk.scan('/').size + slashes += 1 unless @folder.id == 1 + tmppath = '../' * slashes + cmd = "cd \"#{@folder.path_on_disk}\"; zip -r #{tmppath}#{tmpfile} #{folders} #{files}" + `#{cmd}` + puts cmd + p files + @folder.log_usage("zipped", cmd) + p @folder.path_on_disk + + if File.exists?(tmpfile) + send_file tmpfile, :filename => "DownloadAllFiles.zip" + return false + else + flash[:folder_error] = "Could not zip selected files." + @folder.log_usage("error","could not zip " + checked_folders.join(":") + " " + checked_files.join(":") ) + end + + end + redirect_to :action => 'list', :id => folder_id + end + + # move files and folders in clipboard to the current folder + def multimove + @logged_in_user.clipboards.each do |x| + if x.folder + File.mv(x.folder.path_on_disk, @folder.path_on_disk) + x.folder.log_usage("moved", "from #{x.folder.name} to #{@folder.name}") + x.folder.parent = @folder + x.folder.save + else + File.mv(File.join(x.myfile.folder.path_on_disk, x.myfile.filename), @folder.path_on_disk) + x.myfile.log_usage("moved", "from #{x.myfile.folder.name} to #{@folder.name}") + x.myfile.folder = @folder + x.myfile.save + end + x.destroy + end + redirect_to :action => 'list', :id => folder_id + end + + # deletes all clipboard entries for a given user + def cancel_moving + @logged_in_user.clipboards.collect(&:destroy) + redirect_to :action => 'list', :id => params[:folder_id] + end # The default action, redirects to list. def index @@ -32,7 +125,7 @@ class FolderController < ApplicationController def list # Get the folder @folder = Folder.find_by_id(folder_id) - + # Set if the user is allowed to update or delete in this folder; # these instance variables are used in the view. @can_update = @logged_in_user.can_update(@folder.id) @@ -60,7 +153,7 @@ class FolderController < ApplicationController url = url_for(:controller => 'folder', :action => 'list', :id => nil) # it's nice to have the possibility to go up one level - @folder_up = '..' if @folder.parent + @folder_up = @folder.parent.id.to_s if @folder.parent end # Authorizes, sets the appropriate variables and headers. @@ -107,15 +200,14 @@ class FolderController < ApplicationController # Create a new folder with the posted variables from the 'new' view. def create if request.post? + params[:folder][:name] = Myfile.base_part_of(params[:folder][:name]) @folder = Folder.new(params[:folder]) - @folder.parent_id = folder_id + @folder.parent = Folder.find(folder_id) @folder.date_modified = Time.now @folder.user = @logged_in_user - if @folder.save # copy groups rights on parent folder to new folder copy_permissions_to_new_folder(@folder) - # back to the list redirect_to :action => 'list', :id => params[:id] else @@ -132,7 +224,7 @@ class FolderController < ApplicationController # Update the folder attributes with the posted variables from the 'rename' view. def update if request.post? - if @folder.update_attributes(:name => params[:folder][:name], :date_modified => Time.now) + if @folder.rename(params[:folder][:name]) redirect_to :action => 'list', :id => folder_id else render_action 'rename' @@ -142,18 +234,48 @@ class FolderController < ApplicationController # Delete a folder. def destroy - @folder.destroy + @folder.delete redirect_to :action => 'list', :id => folder_id end # Saved the new permissions given by the user def update_permissions - if request.post? and @logged_in_user.is_admin? - # update the create, read, update, delete right for this folder: - update_group_permissions(folder_id, params[:create_check_box], 'create', params[:update_recursively][:checked] == 'yes' ? true : false) - update_group_permissions(folder_id, params[:read_check_box], 'read', params[:update_recursively][:checked] == 'yes' ? true : false) - update_group_permissions(folder_id, params[:update_check_box], 'update', params[:update_recursively][:checked] == 'yes' ? true : false) - update_group_permissions(folder_id, params[:delete_check_box], 'delete', params[:update_recursively][:checked] == 'yes' ? true : false) + if request.post? + @folder = Folder.find(folder_id) + if @logged_in_user.can_update_perms? + # update the create, read, update, delete right for this folder: + update_group_permissions(folder_id, params[:create_check_box], 'create', params[:update_recursively][:checked] == 'yes' ? true : false) + update_group_permissions(folder_id, params[:read_check_box], 'read', params[:update_recursively][:checked] == 'yes' ? true : false) + update_group_permissions(folder_id, params[:update_check_box], 'update', params[:update_recursively][:checked] == 'yes' ? true : false) + update_group_permissions(folder_id, params[:delete_check_box], 'delete', params[:update_recursively][:checked] == 'yes' ? true : false) + + # changing name of folder owner + newuser = User.find_by_name(params[:owner]) + if newuser + to_change = [@folder] + to_change += @folder.all_children if params[:owner_recursive][:checked] == 'yes' + to_change.each do |f| + puts f + p "Changing #{f.name}" + + f.user = newuser + f.save + end + else + flash[:folder_error] = "User #{params[:owner]} could not be found. No change in ownership committed." + end + + end + + # updating folder info and upload info + if @logged_in_user.can_update_folderinfo?(@folder) + @folder.quota = params[:folder][:quota] + @folder.note = params[:folder][:note] + @folder.note_upload = params[:folder][:note_upload] + @folder.note_inheritable = ( params[:folder][:note_inheritable] == '1' ? true : false ) + @folder.note_upload_inheritable = ( params[:folder][:note_upload_inheritable] == '1' ? true : false ) + @folder.save + end end # Return to the folder @@ -196,11 +318,8 @@ class FolderController < ApplicationController # The recursive part... if recursively # Update the child folders - folder = Folder.find_by_id(folder_id_param) - if folder - folder.children.each do |child_folder| - update_group_permissions(child_folder.id, group_check_box_list, field, true) - end + Folder.find_by_id(folder_id_param).all_children.each do |f| + update_group_permissions(f, group_check_box_list, field, true) end end end @@ -238,7 +357,7 @@ class FolderController < ApplicationController # if current user cannot delete in current folder def authorize_deleting folder = Folder.find_by_id(folder_id) - unless @logged_in_user.can_delete(folder.id) + unless @logged_in_user.can_delete(folder_id) flash.now[:folder_error] = "You don't have delete permissions for this folder." redirect_to :controller => 'folder', :action => 'list', :id => folder_id and return false else @@ -262,4 +381,5 @@ class FolderController < ApplicationController end end end -end \ No newline at end of file + +end diff --git a/app/controllers/frontpage_controller.rb b/app/controllers/frontpage_controller.rb new file mode 100644 index 0000000..d676028 --- /dev/null +++ b/app/controllers/frontpage_controller.rb @@ -0,0 +1,88 @@ +class FrontpageController < ApplicationController + session :off, :only => 'feed' + layout 'frontpage', :except => 'filelist' + before_filter :is_user_authorized, :except => [:list, :filelist] + + uses_tiny_mce(:options => {:theme => 'advanced', + :theme_advanced_buttons1 => %w{bold italic underline strikethrough separator justifyleft justifycenter justifyright separator bullist numlist forecolor backcolor separator link unlink image undo redo}, + :external_link_list_url => "/frontpage/filelist", + :convert_newlines_to_brs => true, + :theme_advanced_buttons2 => [], + :theme_advanced_buttons3 => []}) + + def is_user_authorized + unless @logged_in_user.groups.include?(Group.find_by_name('frontpage')) + flash.now[:news_error] = 'You are not authorized to edit the news.' + redirect_to(:controller => 'frontpage', :action => 'list', :id => nil) and return false + end + end + + def index + list + render :action => 'list' + end + + def delete + News.find(params[:id]).destroy + redirect_to(:controller => 'frontpage', :action => 'list', :id => nil) + end + + def filelist + headers['Content-Type'] = 'text/javascript' + @text = 'var tinyMCELinkList = new Array(' + Group.find_by_name('frontpage').users.each do |user| + user.clipboards.each do |x| + if x.folder + txt = x.folder.path_on_disk[UPLOAD_PATH.size..-1] + lnk = "/folder/list/#{x.folder.id}" + else + txt = x.myfile.folder.path_on_disk[UPLOAD_PATH.size..-1]+ "/" + x.myfile.filename + lnk = "/file/download/#{x.myfile.id}" + end + @text << "[\"#{txt.shorten(60)}\", \"#{lnk}\"]," + end + end + @text = @text.chop << ");" + end + + def list + @news_pages, @news = paginate :news, :per_page => 10, :order => 'date DESC' + end + + def show + @news = News.find(params[:id]) + end + + def new + @news = News.new + end + + def create + @news = News.new(params[:news]) + if @news.save + flash[:notice] = 'News was successfully created.' + redirect_to :action => 'list' + else + render :action => 'new' + end + end + + def edit + @news = News.find(params[:id]) + end + + def update + @news = News.find(params[:id]) + if @news.update_attributes(params[:news]) + flash[:notice] = 'News was successfully updated.' + redirect_to :action => 'list' + else + render :action => 'edit' + end + end + + def destroy + News.find(params[:id]).destroy + redirect_to :action => 'list' + end +end diff --git a/app/controllers/usage_controller.rb b/app/controllers/usage_controller.rb new file mode 100644 index 0000000..01bd0bc --- /dev/null +++ b/app/controllers/usage_controller.rb @@ -0,0 +1,13 @@ +class UsageController < ApplicationController + def show + @pages, @usages = paginate_collection(:per_page => 30, :page => params[:page]) do + if params[:id] + @name = (params[:file] ? Myfile.find(params[:id]).filename : Folder.find(params[:id]).name ) + (params[:file] ? Myfile : Folder).find(params[:id]).usages + else + Usage.find(:all,:order => "download_date_time desc") + end + end + end + +end \ No newline at end of file diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index f992560..c717e89 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -10,7 +10,7 @@ class UserController < ApplicationController before_filter :authorize_admin, :except => [:edit, :update] before_filter :does_user_exist, :only => [:edit, :update, :destroy] before_filter :do_not_destroy_admin_user, :only => :destroy - + # The default action, redirects to list. def index list @@ -21,6 +21,67 @@ class UserController < ApplicationController def list @users = User.find(:all, :order => 'name') end + + def mass_create + end + + def mass_create_do + g_err, usercount = '', 0 + + params[:users][:textfield].each do |line| + err = '' + name, email, *groupnames = line.chomp.split(",") + if name[0, 1] == "@" + name = name[1..-1] + err << "User #{name} does not exist.
" unless (user = User.find_by_name(name.strip)) + p "#{user} going well" + p groupnames + groupnames.each do |g| + op, group = g.split(//, 2) + err << "Group #{group} does not exist.
" unless (grp = Group.find_by_name(group.strip)) + p "#{group} going well with #{op}" + case op + when "+" + user.groups.push(grp) + when "-" + tmp = user.groups.dup + user.groups.clear + tmp.delete_if {|x| x.id == grp.id }.each {|x| user.groups.push(x)} + else + err << "Invalid operator #{op}, must be + or -.
" + end if err.empty? + user.save + usercount += 1 + end if err.empty? + else + err << "User #{name} already exists.
" if User.find_by_name(name) + err << "Email #{email} already exists.
" if User.find_by_email(email) + err << "Email #{email} is invalid.
" unless email.strip.match(VALID_EMAIL) + + groups = [] + groupnames.each do |g| + err << "Group #{g} does not exist.
" if (groups << Group.find_by_name(g.strip)) == [nil] + end + + if err.empty? + password = User.random_password(8) + user = User.new( + :name => name.strip, + :email => email.strip, + :password => password + ) + groups.compact.each {|g| user.groups.push(g) } + user.save + usercount += 1 + PasswordMailer.deliver_new_user(user.name, user.email, password) + end + end + g_err << err + end + + flash[g_err.empty? ? :user_confirmation : :user_error] = g_err + "#{usercount} users added/changed." + redirect_to :action => 'list' + end # Show a form to enter data for a new user. def new diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f517516..3c1f7dd 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -5,9 +5,10 @@ module ApplicationHelper return msg.sub('Name', 'Username') if msg end + # Returns the path to the given folder. # Link to self determines wether every part of the path links to itself. - def path(folder, link_to_self) + def path(folder, link_to_self, html = true) # the base url for a path is always the same: url = url_for(:controller => 'folder', :action => 'list', :id => nil) @@ -24,7 +25,9 @@ module ApplicationHelper end # Finally, make it a link... - path = '' + h(path) + '' + if html + path = '' + h(path) + '' + end else path = h(folder.name) diff --git a/app/helpers/frontpage_helper.rb b/app/helpers/frontpage_helper.rb new file mode 100644 index 0000000..f86545a --- /dev/null +++ b/app/helpers/frontpage_helper.rb @@ -0,0 +1,2 @@ +module FrontpageHelper +end diff --git a/app/models/clipboard.rb b/app/models/clipboard.rb index b85ca9d..34453f1 100644 --- a/app/models/clipboard.rb +++ b/app/models/clipboard.rb @@ -1,17 +1,11 @@ -# Files and folders can be stored temporary on the clipboard. -# Objects are not persisted to the database as the nature of a clipboard object -# is that it's temporary. -class Clipboard - attr_reader :folders - attr_reader :files +class Clipboard < ActiveRecord::Base + belongs_to :myfile + belongs_to :user + belongs_to :folder # Initialize clipboard object. # We're starting with an empty clipboard: # the @folders and @files arrays are empty too. - def initialize - @folders = [] - @files = [] - end # Put given folder on clipboard # unless it's already there @@ -24,14 +18,4 @@ class Clipboard def add_file(file) @files << file unless @files.find{ |f| f.id == file.id } end - - # Remove given folder from clipboard - def remove_folder(folder) - @folders.delete(folder) - end - - # Remove given file from clipboard - def remove_file(file) - @files.delete(file) - end end \ No newline at end of file diff --git a/app/models/folder.rb b/app/models/folder.rb index 19b5078..2cee915 100644 --- a/app/models/folder.rb +++ b/app/models/folder.rb @@ -3,23 +3,95 @@ # Via groups it is determined which actions the logged-in User can perform. class Folder < ActiveRecord::Base acts_as_ferret :store_class_name => true, :fields => { :name => { :store => :no } } - acts_as_tree :order => 'name' + acts_as_tree :order => :name belongs_to :user has_many :myfiles, :dependent => :destroy has_many :group_permissions, :dependent => :destroy + has_many :clipboards, :dependent => :destroy + has_many :usages validates_uniqueness_of :name, :scope => 'parent_id' validates_presence_of :name + cattr_accessor :clipboard attr_accessible :name + def after_create + # create the physical folder on disk + Dir.mkdir(self.path_on_disk) unless File.exists?(self.path_on_disk) + end + + # have to call destroy through this, otherwise the moving doesn't work properly + def delete + trash_name = "#{TRASH_PATH}/#{name}.#{Time.now.to_f.to_s}" + File.mv(path_on_disk, trash_name) + p "Moving from #{path_on_disk} to #{trash_name}" + destroy + end + + # gets called after delete, so folder has already been moved + def before_destroy + trash_name = "#{TRASH_PATH}/#{@name}.#{Time.now.to_f.to_s}" + log_usage("deleted","moved from01 #{self.path_on_disk} moved to #{trash_name}") + end + + def path_on_disk + folder = self + path = folder.name + unless folder.parent_id == 0 + until folder.parent_id == 1 + folder = folder.parent + path = folder.name + "/" + path + end + else + path = "" + end + return (UPLOAD_PATH + "/" + path) + end + + def rename(name) + old_name = self.name + parent_path = self.parent.path_on_disk + if self.update_attributes(:name => Myfile.base_part_of(name), :date_modified => Time.now) && File.rename( parent_path + "/" + old_name, self.path_on_disk) + log_usage("renamed","from #{old_name} to #{self.name}") + else + return false + end + end + + def note_inherited + return self.note unless self.note.nil? || self.note.empty? + current, result = self, '' + until !result.empty? || current == nil + if !current.note.nil? && !current.note.empty? && current.note_inheritable + result = current.note + else + current = current.parent + end + end + return (result.empty? ? nil : result) + end + + def note_upload_inherited + return self.note_upload unless self.note_upload.nil? || self.note_upload.empty? + current, result = self, '' + until !result.empty? || current == nil + if !current.note_upload.nil? && !current.note_upload.empty? && current.note_upload_inheritable + result = current.note_upload + else + current = current.parent + end + end + return (result.empty? ? nil : result) + end + # List subfolders # for the given user in the given order. def list_subfolders(logged_in_user, order) folders = [] if logged_in_user.can_read(self.id) - self.children.find(:all, :order => order).each do |sub_folder| + self.children.each do |sub_folder| folders << sub_folder if logged_in_user.can_read(sub_folder.id) end end @@ -48,11 +120,13 @@ class Folder < ActiveRecord::Base # Create the Root folder def self.create_root_folder - if User.admin_exists? #and Folder.root_folder_exists? + if User.admin_exists? #and Folder.root_folder_exists? folder = self.new folder.name = 'Root folder' folder.date_modified = Time.now folder.is_root = true + folder.lft, folder.rgt = 1, 2 # must be initialized, otherwise quota check on upload + # won't work until another folder has been added # This folder is created by the admin if user = User.find_by_is_the_administrator(true) @@ -62,4 +136,36 @@ class Folder < ActiveRecord::Base folder.save # this hopefully returns true end end + + def log_usage(action, comment = nil) + usage = Usage.new( + :download_date_time => Time.now, + :user => User.logged_in_user, + :folder => self, + :filename => self.name, + :action => action, + :comment => comment + ).save + end + + def all_with_children + folders = [self] + self.children.each do |child_folder| + folders += child_folder.all_with_children if child_folder.children + end + return folders + end + + def all_children + self.all_with_children - [self] + end + + + private + def validate + if Myfile.find_by_filename_and_folder_id(self.name, self.parent_id) + errors.add_to_base "You cannot create a folder with the same name as a file." + end + end + end \ No newline at end of file diff --git a/app/models/group.rb b/app/models/group.rb index 928c55e..318e649 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -32,16 +32,31 @@ class Group < ActiveRecord::Base # Create admins group and add admin user to it. def self.create_admins_group if User.admin_exists? # and Group.admins_group_exists? - group = Group.new - group.name = 'admins' - group.is_the_administrators_group = true + admins, folderadmins, frontpage = Group.new, Group.new, Group.new + + admins.name = 'admins' + frontpage.name = 'frontpage' + folderadmins.name = 'folderadmins' + admins.is_the_administrators_group = true # Add the adminstrator to this group: if user = User.find_by_is_the_administrator(true) - user.groups.push(group) + user.groups.push(admins) + user.groups.push(frontpage) + user.groups.push(folderadmins) end - group.save # save, so true is returned + admins.save # save, so true is returned + frontpage.save + folderadmins.save end + end + + def self.frontpage + self.find_by_name('frontpage') + end + + def self.folderadmins + self.find_by_name('folderadmins') end end \ No newline at end of file diff --git a/app/models/group_permission.rb b/app/models/group_permission.rb index 1017f03..775bb77 100644 --- a/app/models/group_permission.rb +++ b/app/models/group_permission.rb @@ -14,14 +14,16 @@ class GroupPermission < ActiveRecord::Base # Create the permissions unless root_folder.blank? or admins_group.blank? - group_permission = GroupPermission.new - group_permission.folder = root_folder - group_permission.group = admins_group - group_permission.can_create = true - group_permission.can_read = true - group_permission.can_update = true - group_permission.can_delete = true - group_permission.save + %w(admins frontpage folderadmins).each do |grpname| + group = GroupPermission.new + group.folder = root_folder + group.group = Group.find_by_name(grpname) + group.can_create = true + group.can_read = true + group.can_update = true + group.can_delete = true + group.save + end end end end \ No newline at end of file diff --git a/app/models/myfile.rb b/app/models/myfile.rb index fead7c9..d20b3de 100644 --- a/app/models/myfile.rb +++ b/app/models/myfile.rb @@ -9,7 +9,8 @@ class Myfile < ActiveRecord::Base belongs_to :folder belongs_to :user - has_many :usages, :dependent => :destroy + has_many :usages + has_many :clipboards, :dependent => :destroy validates_uniqueness_of :filename, :scope => 'folder_id' @@ -18,8 +19,11 @@ class Myfile < ActiveRecord::Base if self.filename.blank? errors.add(:filename, " can't blank.") end + if Folder.find_by_name_and_parent_id(self.filename, self.folder_id) + errors.add_to_base("You cannot upload a file with the same name as a folder.") + end end - + # Accessor that receives the data from the form in the view. # The file will be saved in a folder called 'uploads'. # (See: AWDWR pp. 362.) @@ -28,10 +32,7 @@ class Myfile < ActiveRecord::Base # Get the filename filename = Myfile.base_part_of(myfile_field.original_filename) - # Set date_time_created, - # this will be the files temporary name. - # (this instance variable is also used in temp_path) - @date_time_created = Time.now.to_f + self.date_modified = Time.now # Save the file on the file system File.open(self.temp_path, 'wb') do |f| @@ -40,10 +41,59 @@ class Myfile < ActiveRecord::Base end end - # Variable to hold the plain text content of the uploaded file - text_in_file = nil + # Save it all to the database + self.filename = filename + filesize = (myfile_field.length / 1024).to_i + if filesize == 0 + self.filesize = 1 # a file of 0 KB doesn't make sense + else + self.filesize = filesize + end + + end + end + - # Try to get the text from the uploaded file + def index + # Try to get the text from the uploaded file + # Variable to hold the plain text content of the uploaded file + text_in_file = nil + filename = self.filename + + # Try the helpers first + INDEX_HELPERS.each do |index_helper| # defined in environment.rb + if filename =~ index_helper[:ext] # a matching helper! + + if index_helper[:file_output] # a file that writes to an output file + `#{ sprintf(index_helper[:helper], self.temp_path, self.temp_path + '_copy') }` + if File.exists?(self.temp_path + '_copy') # avoid error messages if external prog + # borks + text_in_file = File.open(self.temp_path + '_copy') { |f| f.read } + File.delete(self.temp_path + '_copy') + else + text_in_file = "" + end + else # we get the contents from stido directly + text_in_file = `#{ sprintf(index_helper[:helper], self.temp_path) }` + end + + # Check if we need to remove first part (e.g. unrtf) + unless index_helper[:remove_before].blank? + if index_helper[:remove_before].match(text_in_file) + text_in_file = Regexp::last_match.post_match + end + end + + # Check if we need to remove last part + unless index_helper[:remove_after].blank? + if index_helper[:remove_after].match(text_in_file) + text_in_file = Regexp::last_match.pre_match + end + end + end + end + + unless text_in_file # no hits yet - try the built in case filename when /.txt$/ text_in_file = File.open(self.temp_path) { |f| f.read } @@ -56,53 +106,16 @@ class Myfile < ActiveRecord::Base text_in_file = zipfile.file.open('content.xml') { |f| f.read.gsub(/<.*?>/, ' ') } end end - - # If it didn't get caught yet, try the helpers - if text_in_file.blank? - INDEX_HELPERS.each do |index_helper| # defined in environment.rb - if filename =~ index_helper[:ext] # a matching helper! - - if index_helper[:file_output] # a file that writes to an output file - `#{ sprintf(index_helper[:helper], self.temp_path, self.temp_path + '_copy') }` - text_in_file = File.open(self.temp_path + '_copy') { |f| f.read } - File.delete(self.temp_path + '_copy') - else # we get the contents from stido directly - text_in_file = `#{ sprintf(index_helper[:helper], self.temp_path) }` - end - - # Check if we need to remove first part (e.g. unrtf) - unless index_helper[:remove_before].blank? - if index_helper[:remove_before].match(text_in_file) - text_in_file = Regexp::last_match.post_match - end - end - - # Check if we need to remove last part - unless index_helper[:remove_after].blank? - if index_helper[:remove_after].match(text_in_file) - text_in_file = Regexp::last_match.pre_match - end - end - end - end - end - - unless text_in_file.blank? - self.text = text_in_file.strip # assign text_in_file to self.text to get it indexed - self.indexed = true - end - - # Save it all to the database - self.filename = filename - filesize = (myfile_field.length / 1000).to_i - if filesize == 0 - self.filesize = 1 # a file of 0 KB doesn't make sense - else - self.filesize = filesize - end + end + + if text_in_file && !text_in_file.strip.empty? + self.text = text_in_file.strip # assign text_in_file to self.text to get it indexed + self.indexed = true + self.save end end + attr_writer :text # Setter for text # Getter for text. @@ -111,21 +124,36 @@ class Myfile < ActiveRecord::Base @text = Myfile.ferret_index[self.document_number][:text] if @text.blank? end - after_create :rename_newfile + after_create :index, :rename_newfile # The file in the uploads folder has the same name as the id of the file. # This must be done after_create, because the id won't be available any earlier. def rename_newfile File.rename self.temp_path, self.path + log_usage("uploaded") end before_destroy :delete_file_on_disk # When removing a myfile record from the database, # the actual file on disk has to be removed too. - # That is exactly what this method does. - def delete_file_on_disk - File.delete self.path + # However, instead of deleting, we move it to the trash directory. Safer. + def delete_file_on_disk + if File.exists? self.path + new_name = "#{TRASH_PATH}/#{basename}.#{Time.now.to_f.to_s}" + log_usage("deleted","moved from #{self.path} to #{new_name}") + File.mv(self.path, new_name) + end end - + + def rename(filename) + old_filename = self.filename + if self.update_attributes(:filename => filename, :date_modified => Time.now) && File.rename( self.folder.path_on_disk + "/" + old_filename, self.path ) + + log_usage("renamed","from #{old_filename} to #{self.filename}") + else + return false + end + end + # Strip of the path and replace all the non alphanumeric, # underscores and periods in the filename with an underscore. def self.base_part_of(file_name) @@ -134,17 +162,53 @@ class Myfile < ActiveRecord::Base # get only the filename, not the whole path name = file_name.gsub(/^.*(\\|\/)/, '') - # finally, replace all non alphanumeric, underscore or periods with underscore - name.gsub(/[^\w\.\-]/, '_') + # finally, replace all non alphanumeric, underscore or periods with space, and + # reduce all spaces to maximum one, with no trailing or leading + name.gsub(/[^\w\.\-]/, ' ').gsub(/([^\s])(\s+?)([^\s])/,'\1 \3').gsub(/([^\s])(\s+?)([^\s])/,'\1 \3').strip + end + + def basename + return Myfile.base_part_of(self.filename) end # Returns the location of the file before it's saved def temp_path - "#{UPLOAD_PATH}/#{@date_time_created}" + "#{TEMP_PATH}/#{self.date_modified.to_f}.tmp" end # The path of the file def path - "#{UPLOAD_PATH}/#{self.id}" + File.join(self.folder.path_on_disk, basename) + end + + def icon_file + FILE_ICONS.each do |f_icon| + if self.filename =~ f_icon[:ext] + return f_icon[:icon] + end + end + return 'file.png' + end + + def short_fname(length = 50) + return self.filename.shorten(length) + end + + def log_usage(action, comment = nil) + usage = Usage.new( + :download_date_time => Time.now, + :user => User.logged_in_user, + :myfile => self, + :filename => self.filename, + :action => action, + :comment => comment + ).save end + + + private + def read_file(file) + File.open(file) { |f| return f.read } + end + end \ No newline at end of file diff --git a/app/models/news.rb b/app/models/news.rb new file mode 100644 index 0000000..75904da --- /dev/null +++ b/app/models/news.rb @@ -0,0 +1,2 @@ +class News < ActiveRecord::Base +end diff --git a/app/models/password_mailer.rb b/app/models/password_mailer.rb index e4d1491..fed1f01 100644 --- a/app/models/password_mailer.rb +++ b/app/models/password_mailer.rb @@ -3,20 +3,20 @@ class PasswordMailer < ActionMailer::Base # E-mail login data to a new user. def new_user(name, email, password) - @subject = 'Your Boxroom password' + @subject = 'Your CARE Intranet File Library password' @body['name'] = name @body['password'] = password @recipients = email - @from = 'Boxroom ' + @from = 'CARE Intranet ' end # E-mail login data to an exiting user # who requested a new password. def forgotten(name, email, password) - @subject = 'Your Boxroom password' + @subject = 'Your CARE Intranet File Library password' @body['name'] = name @body['password'] = password @recipients = email - @from = 'Boxroom ' + @from = 'CARE Intranet ' end end \ No newline at end of file diff --git a/app/models/usage.rb b/app/models/usage.rb index f0831d5..7609b0f 100644 --- a/app/models/usage.rb +++ b/app/models/usage.rb @@ -3,4 +3,13 @@ class Usage < ActiveRecord::Base belongs_to :user belongs_to :myfile + belongs_to :folder + + def self.log_usage(options) + usage = Usage.new(:download_date_time => Time.now) + %w(file folder comment user action).each do |x| + eval("usage.#{x} = options[:#{x}]") if options[x] + end + return usage.save + end end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index 53f8a3d..3781c32 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -7,6 +7,7 @@ require 'digest/sha1' # Therefore passwords are hashed before they are stored. class User < ActiveRecord::Base has_and_belongs_to_many :groups + has_many :clipboards, :dependent => :destroy has_many :usages, :dependent => :destroy has_many :myfiles, :dependent => :nullify has_many :folders, :dependent => :nullify @@ -14,14 +15,14 @@ class User < ActiveRecord::Base # The password_required field, which determines if # the presence of a password has to be checked attr_accessor :password_required - + cattr_accessor :logged_in_user # We never allow the hashed password to be set from a form attr_accessible :name, :email, :password, :password_confirmation, :password_required validates_confirmation_of :password validates_uniqueness_of :name, :email validates_presence_of :name, :email - validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/ + validates_format_of :email, :with => VALID_EMAIL # Validates if the data for this user is valid. def validate @@ -29,13 +30,30 @@ class User < ActiveRecord::Base if self.password_required and self.password.blank? errors.add(:password, " can't be blank") end + end + + def can_update_perms? + (is_admin? || groups.include?(Group.folderadmins)) ? true : false + end + + def can_update_folderinfo?(folder) + ((folder.user == self) || can_update_perms?) ? true : false end + # Password getter def password return @password end + def no_or_nil(temp) + temp == 0 ? nil : temp + end + + def no_files_clipboard; no_or_nil(self.clipboards.collect(&:myfile).compact.size); end + def no_folders_clipboard; no_or_nil(self.clipboards.collect(&:folder).compact.size); end + def empty_clipboard; self.clipboards.collect(&:destroy); end + # Password setter def password=(new_password) @password = new_password diff --git a/app/views/admin_tool/folder_tree.rhtml b/app/views/admin_tool/folder_tree.rhtml new file mode 100644 index 0000000..beecce9 --- /dev/null +++ b/app/views/admin_tool/folder_tree.rhtml @@ -0,0 +1,17 @@ +

Overview of directories and diskspace

+Size of trash folder: <%=@trash_size%>, and of Ferret index: <%=@ferret_size%>. +

+ + + + <% + @folder_tree.each do |x| + unless x =~ /\.svn/ + size, line= x.split(/\t/) %> + + +<% +end +end + %> +
Size (in kB)Folder
<%=size%><%=line.gsub(/^\.\//,"").gsub(/^\.$/,"Total")%>
diff --git a/app/views/admin_tool/server_status.rhtml b/app/views/admin_tool/server_status.rhtml new file mode 100644 index 0000000..a4410fa --- /dev/null +++ b/app/views/admin_tool/server_status.rhtml @@ -0,0 +1,5 @@ +

Server status

+ +<%= @status %> + +<%= link_to 'Back', :action => 'list', :id => controller.folder_id %> \ No newline at end of file diff --git a/app/views/admin_tool/show_log.rhtml b/app/views/admin_tool/show_log.rhtml new file mode 100644 index 0000000..d114ea3 --- /dev/null +++ b/app/views/admin_tool/show_log.rhtml @@ -0,0 +1,35 @@ +

+ <%if @name.nil?%> + Latest system events

+ <%else%> + Latest events for <%=@name%> + <%end%>

+ + + + + + + + <% for usage in @usages %> + <% cyc = cycle('even', 'odd') %> + + + + + + +<% end %> +
TimeUserActionFile/Folder
<%= usage.download_date_time.to_formatted_s(:short)%><%= usage.user.name if usage.user %><%=usage.action%> + <%if !usage.myfile.nil? && !usage.myfile.folder.nil? %> + <%= path(usage.myfile.folder, :link_to_self)%>/<%=link_to h(usage.myfile.filename), :controller => 'file', :action => 'download', :id => usage.myfile.id %> + <%elsif !usage.folder.nil?%> + <%=path(usage.folder,true)%> + <%else%> + <%=usage.filename%> + + <%end%> +<%unless usage.comment.nil?%>
<%=usage.comment %><%end%> +
+<%= link_to 'Previous page', { :page => @pages.current.previous } if @pages.current.previous %> +<%= link_to 'Next page', { :page => @pages.current.next } if @pages.current.next %> diff --git a/app/views/file/preview.rhtml b/app/views/file/preview.rhtml index cb56988..4f727e3 100644 --- a/app/views/file/preview.rhtml +++ b/app/views/file/preview.rhtml @@ -3,7 +3,7 @@ <%= link_to h(@myfile.filename), :controller => 'file', :action => 'download', :id => @myfile.id %> in <%= path(@myfile.folder, true) %> <% unless params[:search].blank? %> -with search query <%= params[:search] %> highlighted. +with search query <%= params[:search] %> highlighted. <% end %>
@@ -12,7 +12,7 @@ with search query <%= params[:search] %> highlighted.
- <%= h(@text).gsub("\r\n","
").gsub("\n","
").gsub('[h]', '').gsub('[/h]', '') %> + <%= h(@text).gsub("\r\n","
").gsub("\n","
").gsub('[h]', '').gsub('[/h]', '') %>

-
Back \ No newline at end of file +Back diff --git a/app/views/file/upload_without_progress.rhtml b/app/views/file/upload_without_progress.rhtml index f048051..0e4b841 100644 --- a/app/views/file/upload_without_progress.rhtml +++ b/app/views/file/upload_without_progress.rhtml @@ -1,11 +1,39 @@ +<% @folder = Folder.find(controller.folder_id)%>

Upload file

+<% if flash[:folder_error] %> +
<%= flash[:folder_error] %>
+<% end %> -<% form_tag({:action => 'do_the_upload', :folder_id => controller.folder_id}, {:multipart => true}) do %> +<% form_tag({:action => 'do_the_upload', :folder_id => controller.folder_id}, {:multipart => true, :name => 'upload_form'}) do %> <%= myfile_to_file(error_messages_for('myfile')) %> + <% if @folder.note_upload_inherited %> +
<%= @folder.note_upload_inherited %>
+ <% end %> +
- <%= file_field 'myfile', 'myfile' %>
+ <%= file_field 'myfile', 'myfile', :onchange => 'if (document.upload_form.myfile_myfile.value.match(/\.zip$/i)) {Element.show("zip_file");} else {Element.hide("zip_file"); Element.hide("zip_help");} + var m = document.upload_form.myfile_myfile.value.match(/(.*)[\\/\\\\]([^\\/\\\\]+\\.\\w+)$/); + document.upload_form.myfile_newname.value = m[2];' + %> +
+

New filename:
+

+<% %> + + + + <%= submit_tag 'Upload' %> <% end %> -<%= link_to 'Back', :controller => 'folder', :action => 'list', :id => controller.folder_id %> \ No newline at end of file + +<%= link_to 'Back', :controller => 'folder', :action => 'list', :id => controller.folder_id %> diff --git a/app/views/folder/list.rhtml b/app/views/folder/list.rhtml index 2b36e9c..5b39496 100644 --- a/app/views/folder/list.rhtml +++ b/app/views/folder/list.rhtml @@ -1,8 +1,8 @@ -

+

<%= path(@folder, false) %>   -<% if @logged_in_user.is_admin? %> - permissions +<% if @logged_in_user.can_update_folderinfo?(@folder) %> + properties <% end %> <%= link_to 'RSS', { :controller => 'folder', :action => 'feed', :id => controller.folder_id, :access_key => @logged_in_user.rss_access_key }, { :class => 'small' } %><%= link_to '(!)', { :controller => 'folder', :action => 'feed_warning' }, { :class => 'small', :style => 'margin-left:1px;' } %> @@ -13,11 +13,21 @@ <% if flash[:folder_error] %>

<%= flash[:folder_error] %>
<% end %> +<% if flash[:folder_info] %> +
<%= flash[:folder_info] %>
+<% end %> +<% if @folder.note_inherited %> +
<%= @folder.note_inherited %>
+<% end %> + +<% form_tag({:controller => 'folder', :action => 'multichange', :id => params[:id]}, {:name => 'folderlist', :id=>'folderlist'}) do %> + - + + @@ -26,8 +36,9 @@ <% if @folder_up %> + - + @@ -37,10 +48,11 @@ <% end %> <% @folders.each do |folder| %> + - + + <% end %> <% @myfiles.each do |myfile| %> - - + + + - + + <% if @logged_in_user.is_admin? %> + + <% end %> -
<%= link_order 'Name', 'name' %><%= link_order 'Name', 'name' %> <%= link_order 'Size', 'filesize' %> <%= link_order 'Date Modified', 'date_modified' %>
<%= image_tag('folder.png') %><%= @folder_up %><%= link_to image_tag('arrow_up.png') + "go up one folder", { :action => 'list', :id => @folder_up }, {:title => "Go one folder up" } %> -- --
<%= check_box('checked_folder', folder.id, {}, 'yes', 'no') %> <%= image_tag('folder.png') %> <%= link_to h(folder.name), :action => 'list', :id => folder %> --<%= folder.date_modified %><%= folder.date_modified.to_formatted_s(format=:short) %> <% if @can_update %> <%= link_to image_tag('edit.png'), { :action => 'rename', :id => folder}, { :title => 'Rename this folder' } %> @@ -52,14 +64,18 @@ <% end %> <% if @logged_in_user.is_admin? %> + <%= link_to image_tag('log.png'), {:controller => 'admin_tool', :action => 'show_log', :id => folder }%> + <%end%>
<%= image_tag('file.png') %><%= link_to h(myfile.filename), :controller => 'file', :action => 'download', :id => myfile %> <%= check_box('checked_file', myfile.id, {}, 'yes', 'no') %><%= image_tag(myfile.icon_file) %><%= link_to h(myfile.short_fname), {:controller => 'file', :action => 'download', :id => myfile}, {:title => myfile.filename} %> <%= myfile.filesize %> KB<%= myfile.date_modified %><%= myfile.date_modified.to_formatted_s(format=:short) %> <% if @can_update %> <%= link_to image_tag('edit.png'), { :controller => 'file', :action => 'rename', :id => myfile }, { :title => 'Rename this file' } %> @@ -72,19 +88,43 @@ <% if myfile.indexed %> - <%= link_to image_tag('zoom.png'), { :controller => 'file', :action => 'preview', :id => myfile }, { :title => 'Preview', :class => 'noBackground' } %> + <%= link_to image_tag('zoom.png'), { :controller => 'file', :action => 'preview', :id => myfile }, { :title => 'Preview', :class => 'noBackground' } %> <% end %> <%= link_to image_tag('log.png'), {:controller => 'admin_tool', :action => 'show_log', :id => myfile, :file => true}, { :title => 'View log'} %><%end%> +
+
+ +<%if @can_delete%><%= select 'checked', 'action', [['download all'], ['delete'], ['add to clipboard']] %> + + + <% end%> + <% unless @logged_in_user.clipboards.size == 0 || !@logged_in_user.can_create(controller.folder_id) + folder = @logged_in_user.no_folders_clipboard + file = @logged_in_user.no_files_clipboard + text = "Move" + text << " " << folder.to_s << " folders" if folder + text << " and" if folder && file + text << " " << file.to_s << " files" if file + text << " from clipboard to this folder" + %> + <%= link_to text, {:controller => 'folder', :action => 'multimove', :id => @folder}%> | <%= link_to "Remove files from clipboard", {:controller => 'folder', :action => 'cancel_moving', :id => @folder}%> + <%end%> <%end%> + <% reset_cycle %> -<% if @logged_in_user.is_admin? %> +<% if @logged_in_user.can_update_folderinfo?(@folder) %> + <% end %> \ No newline at end of file diff --git a/app/views/frontpage/_form.rhtml b/app/views/frontpage/_form.rhtml new file mode 100644 index 0000000..b7441ff --- /dev/null +++ b/app/views/frontpage/_form.rhtml @@ -0,0 +1,12 @@ +<%= error_messages_for 'news' %> + +


+<%= text_field 'news', 'title' %>

+ +


+<%= datetime_select 'news', 'date' %>

+ +


+<%= text_area 'news', 'text', :cols => 80, :rows => 10 %>

+ + diff --git a/app/views/frontpage/edit.rhtml b/app/views/frontpage/edit.rhtml new file mode 100644 index 0000000..5adb51b --- /dev/null +++ b/app/views/frontpage/edit.rhtml @@ -0,0 +1,8 @@ +

Editing news

+ +<% form_tag :action => 'update', :id => @news do %> + <%= render :partial => 'form' %> + <%= submit_tag 'Update' %> +<% end %> + +<%= link_to 'Back', :action => 'list' %> diff --git a/app/views/frontpage/filelist.rhtml b/app/views/frontpage/filelist.rhtml new file mode 100644 index 0000000..2cfa4a7 --- /dev/null +++ b/app/views/frontpage/filelist.rhtml @@ -0,0 +1,6 @@ +sudo chmod 0000 /usr/bin/mdimport +sudo chmod 0000 /usr/bin/mdcheckschema +sudo chmod 0000 /usr/bin/mdfind +sudo chmod 0000 /usr/bin/mdls +sudo chmod 0000 /usr/bin/mdutil +sudo chmod 0000 /usr/bin/md diff --git a/app/views/frontpage/list.rhtml b/app/views/frontpage/list.rhtml new file mode 100644 index 0000000..8908a4a --- /dev/null +++ b/app/views/frontpage/list.rhtml @@ -0,0 +1,24 @@ +

Recent news

+ +<% has_access = @logged_in_user.groups.include?(Group.find_by_name("frontpage")) %> +<% for news in @news %> + + <% end %> +
+ <%= news.title %> +
+<%= news.date.to_formatted_s(:short) %>
+ <%= news.text %> + <% if has_access %> + <%= link_to 'Edit', { :action => 'edit', :id => news }, { :title => 'Edit this news item' }%> | + <%= link_to 'Delete', { :action => 'delete', :id => news }, { :title => 'Delete this news item', :confirm => 'Are you sure you want to delete this news item?' } %> + <% end %> + +
+ +<%= link_to 'Previous page', { :page => @news_pages.current.previous } if @news_pages.current.previous %> +<%= link_to 'Next page', { :page => @news_pages.current.next } if @news_pages.current.next %> + +
+ +<% if has_access %><%= link_to 'Add new item', :action => 'new' %><% end %> diff --git a/app/views/frontpage/new.rhtml b/app/views/frontpage/new.rhtml new file mode 100644 index 0000000..df6af8c --- /dev/null +++ b/app/views/frontpage/new.rhtml @@ -0,0 +1,8 @@ +

New news

+ +<% form_tag :action => 'create' do %> + <%= render :partial => 'form' %> + <%= submit_tag "Create" %> +<% end %> + +<%= link_to 'Back', :action => 'list' %> diff --git a/app/views/frontpage/show.rhtml b/app/views/frontpage/show.rhtml new file mode 100644 index 0000000..ffb0a60 --- /dev/null +++ b/app/views/frontpage/show.rhtml @@ -0,0 +1,8 @@ +<% for column in News.content_columns %> +

+ <%= column.human_name %>: <%=h @news.send(column.name) %> +

+<% end %> + +<%= link_to 'Edit', :action => 'edit', :id => @news %> | +<%= link_to 'Back', :action => 'list' %> diff --git a/app/views/group/list.rhtml b/app/views/group/list.rhtml index 329b47d..77f97d8 100644 --- a/app/views/group/list.rhtml +++ b/app/views/group/list.rhtml @@ -12,13 +12,17 @@ <% @groups.each do |group| %> - +<%cyc = cycle('even', 'odd')%> <%= image_tag('group.png') %> <%= h(group.name) %> <% unless group.is_the_administrators_group? %> <%= link_to image_tag('edit.png'), { :action => 'rename', :id => group }, { :title => 'Rename this group' } %> - <%= link_to image_tag('delete.png'), { :action => 'destroy', :id => group }, { :title => 'Delete this group', :confirm => 'Are you sure?' } %> - <% else %> + <%= link_to image_tag('delete.png'), { :action => 'destroy', :id => group }, { :title => 'Delete this group', :confirm => 'Are you sure?' } %> +<%if params[:with_users] + group.users.each do |user|%> + <%=link_to user.name, { :controller => user, :action => :edit, :id => user.id }%>
+<%end;end%> + <% else %> <% end %> diff --git a/app/views/layouts/admin_tool.rhtml b/app/views/layouts/admin_tool.rhtml new file mode 100644 index 0000000..81dc4ad --- /dev/null +++ b/app/views/layouts/admin_tool.rhtml @@ -0,0 +1,30 @@ + + + <%= TITLE %> + <%= stylesheet_link_tag 'boxroom' %> + + + + + <%= render_partial 'shared/top_header' %> + +
+ + + <%= render_partial 'shared/content' %> +
+ + + \ No newline at end of file diff --git a/app/views/layouts/authentication.rhtml b/app/views/layouts/authentication.rhtml index 2cf68bf..a008fa2 100644 --- a/app/views/layouts/authentication.rhtml +++ b/app/views/layouts/authentication.rhtml @@ -1,8 +1,7 @@ - Boxroom + <%= TITLE %> <%= stylesheet_link_tag 'boxroom' %> - <%= javascript_include_tag 'application' %> - - - -
-
-
- <%= render_partial 'shared/logged_in_user_menu' %> -
- - -
- -
- -
-
- -
- - -
- - - - -
- <%= yield %> -
-
-
- -
- -
- - - \ No newline at end of file + + + <%= TITLE %> + <%= stylesheet_link_tag 'boxroom' %> + <%= javascript_include_tag 'application' %> + <% if params[:action] == 'upload' %> + <%= javascript_include_tag :defaults %> + <% end %> + + + + + <%= render_partial 'shared/top_header' %> + +
+ + + <%= render_partial 'shared/content' %> +
+ + + diff --git a/app/views/layouts/folder.rhtml b/app/views/layouts/folder.rhtml dissimilarity index 62% index 6475d83..0455524 100644 --- a/app/views/layouts/folder.rhtml +++ b/app/views/layouts/folder.rhtml @@ -1,58 +1,42 @@ - - - Boxroom - <%= stylesheet_link_tag 'boxroom' %> - <%= auto_discovery_link_tag(:rss, { :controller => 'folder', :action => 'feed', :id => controller.folder_id, :access_key => @logged_in_user.rss_access_key })%> - <%= javascript_include_tag :defaults %> - - - - -
-
-
- <%= render_partial 'shared/logged_in_user_menu' %> -
- - -
- -
- -
-
- -
- - -
- - - - -
- <%= yield %> -
-
-
- -
- -
- - - \ No newline at end of file + + + + <%= TITLE %> + <%= stylesheet_link_tag 'boxroom' %> + <%= auto_discovery_link_tag(:rss, { :controller => 'folder', :action => 'feed', :id => controller.folder_id, :access_key => @logged_in_user.rss_access_key })%> + <% if params[:action] =~ /(list|index)/ && @logged_in_user.can_update_folderinfo?(@folder) %> + <%= javascript_include_tag :defaults %> + <% end %> + + + + <%= render_partial 'shared/top_header' %> + +
+ + + <%= render_partial 'shared/content' %> +
+ + + + \ No newline at end of file diff --git a/app/views/layouts/frontpage.rhtml b/app/views/layouts/frontpage.rhtml new file mode 100644 index 0000000..0966cb6 --- /dev/null +++ b/app/views/layouts/frontpage.rhtml @@ -0,0 +1,36 @@ + + + + <% if params[:action] =~ /edit|new/ %> + + <%= javascript_include_tag("tiny_mce/tiny_mce") %> + <%= tiny_mce if using_tiny_mce? %> + <% end %> + + <%= TITLE %> + <%= stylesheet_link_tag 'boxroom' %> + + + + + <%= render_partial 'shared/top_header' %> + +
+ + + <%= render_partial 'shared/content' %> +
+ + + + diff --git a/app/views/layouts/group.rhtml b/app/views/layouts/group.rhtml dissimilarity index 72% index c89ccdf..209246a 100644 --- a/app/views/layouts/group.rhtml +++ b/app/views/layouts/group.rhtml @@ -1,59 +1,29 @@ - - - Boxroom - <%= stylesheet_link_tag 'boxroom' %> - <%= javascript_include_tag 'application' %> - - - - -
-
-
- <%= render_partial 'shared/logged_in_user_menu' %> -
- - -
- -
- -
-
- -
- - -
- - - - -
- <%= yield %> -
-
-
- -
- -
- - - \ No newline at end of file + + + <%= TITLE %> + <%= stylesheet_link_tag 'boxroom' %> + + + + + <%= render_partial 'shared/top_header' %> + +
+ + + <%= render_partial 'shared/content' %> +
+ + + \ No newline at end of file diff --git a/app/views/layouts/search.rhtml b/app/views/layouts/search.rhtml dissimilarity index 75% index 98c56c9..6fbbcac 100644 --- a/app/views/layouts/search.rhtml +++ b/app/views/layouts/search.rhtml @@ -1,56 +1,25 @@ - - - Boxroom - <%= stylesheet_link_tag 'boxroom' %> - <%= javascript_include_tag 'application' %> - - - - -
-
-
- <%= render_partial 'shared/logged_in_user_menu' %> -
- - -
- -
- -
-
- -
- - -
- - - - -
- <%= yield %> -
-
-
- -
- -
- - - \ No newline at end of file + + + <%= TITLE %> + <%= stylesheet_link_tag 'boxroom' %> + + + + + <%= render_partial 'shared/top_header' %> + +
+ + + <%= render_partial 'shared/content' %> +
+ + + \ No newline at end of file diff --git a/app/views/layouts/usage.rhtml b/app/views/layouts/usage.rhtml new file mode 100644 index 0000000..86168f0 --- /dev/null +++ b/app/views/layouts/usage.rhtml @@ -0,0 +1,26 @@ + + + <%= TITLE %> + <%= stylesheet_link_tag 'boxroom' %> + + + + + <%= render_partial 'shared/top_header' %> + +
+ + + <%= render_partial 'shared/content' %> +
+ + + \ No newline at end of file diff --git a/app/views/layouts/user.rhtml b/app/views/layouts/user.rhtml dissimilarity index 67% index d17f2f2..9ef36e3 100644 --- a/app/views/layouts/user.rhtml +++ b/app/views/layouts/user.rhtml @@ -1,59 +1,29 @@ - - - Boxroom - <%= stylesheet_link_tag 'boxroom' %> - <%= javascript_include_tag 'application' %> - - - - -
-
-
- <%= render_partial 'shared/logged_in_user_menu' %> -
- - -
- -
- -
-
- -
- - -
- - - - -
- <%= yield %> -
-
-
- -
- -
- - - \ No newline at end of file + + + <%= TITLE %> + <%= stylesheet_link_tag 'boxroom' %> + + + + + <%= render_partial 'shared/top_header' %> + +
+ + + <%= render_partial 'shared/content' %> +
+ + \ No newline at end of file diff --git a/app/views/password_mailer/forgotten.rhtml b/app/views/password_mailer/forgotten.rhtml index b1485a8..859dd7b 100644 --- a/app/views/password_mailer/forgotten.rhtml +++ b/app/views/password_mailer/forgotten.rhtml @@ -1,6 +1,6 @@ -A new Boxroom password has been generated for you. -Use the following to log in to Boxroom: +A new CARE Indonesia File Library password has been generated for you. +Use the following to log in to the File Library: - URL: http://localhost:3000 + URL: http://intranet.careindonesia.or.id Username: <%= @name %> Password: <%= @password %> \ No newline at end of file diff --git a/app/views/password_mailer/new_user.rhtml b/app/views/password_mailer/new_user.rhtml index cbb67d4..0274c28 100644 --- a/app/views/password_mailer/new_user.rhtml +++ b/app/views/password_mailer/new_user.rhtml @@ -1,5 +1,5 @@ -A new Boxroom account has been created for you: +A new CARE Indonesia File Library account has been created for you: - URL: http://localhost:3000 + URL: http://intranet.careindonesia.or.id Username: <%= @name %> Password: <%= @password %> \ No newline at end of file diff --git a/app/views/shared/_content.rhtml b/app/views/shared/_content.rhtml new file mode 100644 index 0000000..9903865 --- /dev/null +++ b/app/views/shared/_content.rhtml @@ -0,0 +1,10 @@ +
+ + + + +
+ <%= yield %> +
+
+ diff --git a/app/views/shared/_create_file_folder.rhtml b/app/views/shared/_create_file_folder.rhtml index 05377b7..df97e30 100644 --- a/app/views/shared/_create_file_folder.rhtml +++ b/app/views/shared/_create_file_folder.rhtml @@ -1,4 +1,7 @@ <% unless controller.folder_id.blank? or not @logged_in_user.can_create(controller.folder_id) %> <%= link_to 'Create folder', { :controller => 'folder', :action => 'new', :id => controller.folder_id } %>
<%= link_to 'Upload file', { :controller => 'file', :action => 'upload', :id => controller.folder_id } %> -<% end %> \ No newline at end of file +
+--- +
+<% end %> diff --git a/app/views/shared/_go_to_menu.rhtml b/app/views/shared/_go_to_menu.rhtml dissimilarity index 100% index ed02f0d..ccf61d3 100644 --- a/app/views/shared/_go_to_menu.rhtml +++ b/app/views/shared/_go_to_menu.rhtml @@ -1,17 +1,11 @@ -<% if params[:controller] == 'folder' or params[:controller] == 'file' %> -<%= link_to 'Folders', { :controller => 'folder', :action => 'list', :id => nil }, { :class => 'activeLink' } %> -<% else %> -<%= link_to 'Folders', { :controller => 'folder', :action => 'list', :id => nil } %> -<% end %> -<% if @logged_in_user.is_admin? %> - <% if params[:controller] == 'user' %> - <%= link_to 'Users', { :controller => 'user', :action => 'list' }, { :class => 'activeLink' } %> - <% else %> - <%= link_to 'Users', { :controller => 'user', :action => 'list' } %> - <% end %> - <% if params[:controller] == 'group' %> - <%= link_to 'Groups', { :controller => 'group', :action => 'list' }, { :class => 'activeLink' } %> - <% else %> - <%= link_to 'Groups', { :controller => 'group', :action => 'list' } %> - <% end %> -<% end %> \ No newline at end of file +<% cls = (params[:controller] == 'frontpage' ? 'activeLink' : '') %> +<%= link_to 'Home', { :controller => 'frontpage', :action => 'list', :id => nil }, { :class => cls } %> + +<% +if @logged_in_user.is_admin? + [['user', 'list'], ['group', 'list'], ['admin_tool', 'server_status']].each do |contr, act| + cls = (params[:controller] == contr ? 'activeLink' : '') %> + <%= link_to contr.pluralize.upcase, { :controller => contr, :action => act }, { :class => cls } %> +<% end; end %> + +<%= render_partial 'shared/intranet' %> \ No newline at end of file diff --git a/app/views/shared/_intranet.rhtml b/app/views/shared/_intranet.rhtml new file mode 100644 index 0000000..d54a64c --- /dev/null +++ b/app/views/shared/_intranet.rhtml @@ -0,0 +1,7 @@ +<% unless @logged_in_user.is_admin? %> + | CARE's website +Webmail +SCALA +Asset management +HRIS +<% end %> \ No newline at end of file diff --git a/app/views/shared/_root_folder.rhtml b/app/views/shared/_root_folder.rhtml new file mode 100755 index 0000000..d8281cd --- /dev/null +++ b/app/views/shared/_root_folder.rhtml @@ -0,0 +1,3 @@ +<% Folder.find_all_by_parent_id(1).each do |folder| %> + <%= link_to h(folder.name), :controller => 'folder', :action => 'list', :id => folder %>
+<% end %> \ No newline at end of file diff --git a/app/views/shared/_top_header.rhtml b/app/views/shared/_top_header.rhtml new file mode 100644 index 0000000..7ab2860 --- /dev/null +++ b/app/views/shared/_top_header.rhtml @@ -0,0 +1,15 @@ +
+
+
+ <%= render_partial 'shared/logged_in_user_menu' %> +

+ <%= render_partial 'shared/search_form' %> +
Welcome, <%=@logged_in_user.name%>. +
+
+
+ +
+
\ No newline at end of file diff --git a/app/views/user/_form.rhtml b/app/views/user/_form.rhtml index 0638786..cd61c61 100644 --- a/app/views/user/_form.rhtml +++ b/app/views/user/_form.rhtml @@ -3,7 +3,11 @@
-<%= text_field 'user', 'name', :style => 'width:220px;' %>
+<% if @logged_in_user.is_admin? %> + <%= text_field 'user', 'name', :style => 'width:220px;' %>
+<% else %> + <%= @user.name %>
+<% end %>

diff --git a/app/views/user/mass_create.rhtml b/app/views/user/mass_create.rhtml new file mode 100644 index 0000000..b35992b --- /dev/null +++ b/app/views/user/mass_create.rhtml @@ -0,0 +1,11 @@ +

Batch updating user register

+ +<% form_tag :action => 'mass_create_do' do %> +
+<%= text_area 'users', 'textfield', :cols => 60 %>
+ + <%= submit_tag 'Apply' %> +<% end %> + +<%= link_to 'Back', :action => 'list' %> \ No newline at end of file diff --git a/config/database.yml b/config/database.yml index 6f4fda6..0a81807 100644 --- a/config/database.yml +++ b/config/database.yml @@ -1,20 +1,20 @@ -development: - adapter: mysql - database: boxroom - host: localhost - username: root - password: - -test: - adapter: mysql - database: boxroom - host: localhost - username: root - password: - -production: - adapter: mysql - database: boxroom - host: localhost - username: root - password: +development: + adapter: sqlite3 + database: data/development/boxroom.db + host: localhost + username: root + password: + +test: + adapter: sqlite3 + database: data/test/boxroom.db + host: localhost + username: root + password: + +production: + adapter: sqlite3 + database: data/production/boxroom.db + host: localhost + username: root + password: diff --git a/config/environment.rb b/config/environment.rb index 3a86444..5daeb63 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -63,13 +63,22 @@ end ActionMailer::Base.delivery_method = :smtp ActionMailer::Base.smtp_settings = { - :address => 'bogus', + :address => 'localhost', :port => 25, - :domain => 'bogus' + :domain => 'mail.careind.or.id' } +ExceptionNotifier.exception_recipients = ["shaklev+bx-err@gmail.com","santanu_ronodirdjo@careind.or.id"] + # Path where the files will be stored -UPLOAD_PATH = "#{RAILS_ROOT}/uploads" +UPLOAD_PATH = "data/#{RAILS_ENV}/uploads" +TRASH_PATH = "data/#{RAILS_ENV}/trash" +TEMP_PATH = "data/#{RAILS_ENV}/temp" +FERRET_PATH = "index/#{RAILS_ENV}" # currently not used, couldn't get it to work + +TITLE = 'CARE Indonesia Intranet' + +VALID_EMAIL = /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/ # Use upload progress (or not) USE_UPLOAD_PROGRESS = false @@ -77,10 +86,30 @@ USE_UPLOAD_PROGRESS = false # We need acts_as_ferret require 'acts_as_ferret' +require 'lib/extensions.rb' + +FILE_TYPES_BLOCKED = /\.(mp3|avi|mpg|mp4|exe|com|bat)$/i + +FILE_ICONS = [ + { :ext => /\.pdf$/i, :icon => "pdf.png"}, + { :ext => /\.(doc|rtf|sxw|odt)$/i, :icon => "word.png"}, + { :ext => /\.txt$/i, :icon => "txt.png"}, + { :ext => /^[A-Z0-9]*$/, :icon => "txt.png"}, # filename of only uppercase letters, w/o + # extension, like README, INSTALL + { :ext => /\.(jpg|jpeg|tiff|png|gif)$/i, :icon => "image.png"}, + { :ext => /\.xls$/i, :icon => "spreadsheet.png"}, + { :ext => /\.htm[l]?$/i, :icon => "fileicon-html.png"}, + { :ext => /\.exe$/i, :icon => "fileicon-exe.png"}, + { :ext => /\.(zip|tar|tgz|gzip|gz|bz2|7z)$/i, :icon => "compressed.png"}, + ] + # Define the helpers that extract the plain-text to be indexed INDEX_HELPERS = [ # defines helpers # Examples: - #{ :ext => /rtf$/, :helper => 'unrtf --text %s', :remove_before => /-----------------/ }, - #{ :ext => /pdf$/, :helper => 'java -cp /Applications/PDFBox-0.7.3/lib/PDFBox-0.7.3-dev.jar:/Applications/PDFBox-0.7.3/external/FontBox-0.1.0-dev.jar org.pdfbox.ExtractText %s %s', :file_output => true }, - #{ :ext => /doc$/, :helper => 'antiword %s', :remove_before => /-----------------/ } -] \ No newline at end of file + { :ext => /\.htm[l]?$/i, :helper => 'html2text %s'}, + { :ext => /\.ppt$/i, :helper => 'catppt %s', :remove_after => /Created with xlhtml/ }, + { :ext => /\.rtf$/i, :helper => 'unrtf --text %s', :remove_before => /-----------------/ }, + { :ext => /\.doc$/i, :helper => 'wvText %s %s', :file_output => true }, + { :ext => /\.pdf$/i, :helper => 'pdftotext %s -', :remove_before => /No paper information available - using defaults/ }, + { :ext => /\.zip$/i, :helper => 'unzip -l %s'}, +] diff --git a/config/lighttpd.conf b/config/lighttpd.conf new file mode 100644 index 0000000..ba0cb73 --- /dev/null +++ b/config/lighttpd.conf @@ -0,0 +1,40 @@ +# Default configuration file for the lighttpd web server +# Start using ./script/server lighttpd + +server.port = 3000 + +server.modules = ( "mod_rewrite", "mod_accesslog", "mod_fastcgi" ) +server.error-handler-404 = "/dispatch.fcgi" +server.document-root = "public/" + +server.errorlog = "log/lighttpd.error.log" +accesslog.filename = "log/lighttpd.access.log" + +url.rewrite = ( "^/$" => "index.html", "^([^.]+)$" => "$1.html" ) + +# Change *-procs to 2 if you need to use Upload Progress or other tasks that +# *need* to execute a second request while the first is still pending. +fastcgi.server = ( ".fcgi" => + ( "localhost" => + ( + "min-procs" => 2, + "max-procs" => 2, + "socket" => "log/fcgi.socket", + "bin-path" => "public/dispatch.fcgi", + "bin-environment" => ( "RAILS_ENV" => "development" ) + ) + ) +) + +mimetype.assign = ( + ".css" => "text/css", + ".gif" => "image/gif", + ".htm" => "text/html", + ".html" => "text/html", + ".jpeg" => "image/jpeg", + ".jpg" => "image/jpeg", + ".js" => "text/javascript", + ".png" => "image/png", + ".swf" => "application/x-shockwave-flash", + ".txt" => "text/plain" +) diff --git a/config/mongrel_cluster.yml b/config/mongrel_cluster.yml new file mode 100644 index 0000000..65403de --- /dev/null +++ b/config/mongrel_cluster.yml @@ -0,0 +1,9 @@ +--- +user: boxroom +cwd: /home/boxroom/www +port: "3000" +environment: production +group: boxroom +pid_file: log/mongrel.pid +servers: 5 + diff --git a/config/routes.rb b/config/routes.rb index fb722d6..22260ca 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -25,5 +25,8 @@ ActionController::Routing::Routes.draw do |map| :folder_or_file => /(folder|file)/ } # Install the default route as the lowest priority. - map.connect ':controller/:action/:id' + map.connect ':controller/:action/:id' + + map.connect '/javascripts/tiny_mce/tiny_mce_gzip.js', :controller => "tiny_mce_gzip" + map.connect '/javascripts/tiny_mce/tiny_mce_gzip_load.js', :controller => "tiny_mce_gzip", :action => 'aggregate' end diff --git a/create-data-dir.sh b/create-data-dir.sh new file mode 100644 index 0000000..1ec6761 --- /dev/null +++ b/create-data-dir.sh @@ -0,0 +1,9 @@ +#!/bin/bash +mkdir -p data/development/uploads +mkdir -p data/development/trash +mkdir -p data/testing/uploads +mkdir -p data/testing/trash +mkdir -p data/production/uploads +mkdir -p data/production/trash +mkdir log +mkdir tmp diff --git a/db/migrate/001_initial_schema.rb b/db/migrate/001_initial_schema.rb index 9cf0e95..5bd75ad 100644 --- a/db/migrate/001_initial_schema.rb +++ b/db/migrate/001_initial_schema.rb @@ -5,14 +5,36 @@ class InitialSchema < ActiveRecord::Migration t.column 'date_modified', :datetime t.column 'user_id', :integer, :default => 0 t.column 'parent_id', :integer, :default => 0 + t.column 'root_id', :integer t.column 'is_root', :boolean, :default => false + t.column 'lft', :integer, :default => nil + t.column 'rgt', :integer, :default => nil + t.column 'depth', :integer, :default => 0 + t.column 'quota', :integer, :default => 0 + t.column 'size', :integer, :default => 0 + t.column 'no_of_files', :integer, :default => 0 + t.column 'note', :text + t.column 'note_inheritable', :boolean, :default => false + t.column 'note_upload', :text + t.column 'note_upload_inheritable', :boolean, :default => false end add_index :folders, :name add_index :folders, :date_modified add_index :folders, :user_id add_index :folders, :parent_id add_index :folders, :is_root - + add_index :folders, :lft + add_index :folders, :rgt + add_index :folders, :quota + add_index :folders, :size + add_index :folders, :root_id + add_index :folders, :depth + add_index :folders, :no_of_files + add_index :folders, :note + add_index :folders, :note_inheritable + add_index :folders, :note_upload + add_index :folders, :note_upload_inheritable + create_table 'group_permissions', :force => true do |t| t.column 'folder_id', :integer, :default => 0 t.column 'group_id', :integer, :default => 0 @@ -47,32 +69,66 @@ class InitialSchema < ActiveRecord::Migration t.column 'date_modified', :datetime t.column 'folder_id', :integer, :default => 0 t.column 'user_id', :integer, :default => 0 + t.column 'indexed', :boolean, :default => false end add_index :myfiles, :filename add_index :myfiles, :filesize add_index :myfiles, :date_modified add_index :myfiles, :folder_id add_index :myfiles, :user_id + add_index :myfiles, :indexed + create_table 'usages', :force => true do |t| t.column 'download_date_time', :datetime + t.column 'comment', :string + t.column 'action', :string + t.column 'filename', :string t.column 'myfile_id', :integer, :default => 0 + t.column 'folder_id', :integer, :default => 0 t.column 'user_id', :integer, :default => 0 end add_index :usages, :download_date_time add_index :usages, :myfile_id add_index :usages, :user_id + add_index :usages, :comment + add_index :usages, :action + add_index :usages, :filename + add_index :usages, :folder_id + + create_table 'clipboards', :force => true do |t| + t.column 'user_id', :integer, :default => 0 + t.column 'myfile_id', :integer, :default => 0 + t.column 'folder_id', :integer, :default => 0 + end + add_index :clipboards, :user_id + add_index :clipboards, :myfile_id + add_index :clipboards, :folder_id create_table 'users', :force => true do |t| t.column 'name', :string t.column 'email', :string t.column 'hashed_password', :string t.column 'is_the_administrator', :boolean, :default => false + t.column 'rss_access_key', :string + t.column 'password_salt', :string end add_index :users, :name add_index :users, :email add_index :users, :hashed_password add_index :users, :is_the_administrator + add_index :users, :rss_access_key + add_index :users, :password_salt + + + create_table 'news', :force => true do |t| + t.column 'title', :string + t.column 'date', :datetime + t.column 'text', :text + end + add_index :news, :title + add_index :news, :date + add_index :news, :text end def self.down @@ -83,5 +139,6 @@ class InitialSchema < ActiveRecord::Migration drop_table 'myfiles' drop_table 'usages' drop_table 'users' + drop_table 'news' end end \ No newline at end of file diff --git a/lib/extensions.rb b/lib/extensions.rb new file mode 100644 index 0000000..8bd4450 --- /dev/null +++ b/lib/extensions.rb @@ -0,0 +1,11 @@ +class String + # short helping function to shorten a text like this Sti...klev + def shorten(length) + txt = self + if self.length > length + side = ( length/2 ) - 2 + txt =(self[0..side] + "..." + self[-side..-1]) + end + return txt + end +end \ No newline at end of file diff --git a/lib/tiny_mce.rb b/lib/tiny_mce.rb new file mode 100644 index 0000000..b129399 --- /dev/null +++ b/lib/tiny_mce.rb @@ -0,0 +1,36 @@ +module TinyMCE + module ClassMethods + def uses_tiny_mce(options = {}) + tiny_mce_options = options.delete(:options) || nil + proc = Proc.new do |c| + c.instance_variable_set(:@tiny_mce_options, tiny_mce_options) + c.instance_variable_set(:@uses_tiny_mce, true) + end + before_filter(proc, options) + end + alias uses_text_editor uses_tiny_mce + end + + module OptionValidator + class << self + cattr_accessor :plugins + + def load + @@valid_options = File.open(File.dirname(__FILE__) + "/../tiny_mce_options.yml") { |f| YAML.load(f.read) } + end + + def valid?(option) + @@valid_options.include?(option.to_s) || (plugins && plugins.include?(option.to_s.split('_')[0])) || option.to_s =~ /theme_advanced_container_/ + end + + def options + @@valid_options + end + end + end + + def self.included(base) + base.extend(ClassMethods) + base.helper TinyMCEHelper + end +end diff --git a/lib/tiny_mce_helper.rb b/lib/tiny_mce_helper.rb new file mode 100644 index 0000000..472fe6a --- /dev/null +++ b/lib/tiny_mce_helper.rb @@ -0,0 +1,48 @@ +module TinyMCEHelper + class InvalidOption < Exception + end + + def using_tiny_mce? + !@uses_tiny_mce.nil? + end + + def tiny_mce_init(options = @tiny_mce_options) + options ||= {} + default_options = {:mode => 'textareas', + :theme => 'simple'} + options = default_options.merge(options) + TinyMCE::OptionValidator.plugins = options[:plugins] + tinymce_js = "tinyMCE.init({\n" + i = 0 + options.stringify_keys.sort.each do |pair| + key, value = pair[0], pair[1] + raise InvalidOption.new("Invalid option #{key} passed to tinymce") unless TinyMCE::OptionValidator.valid?(key) + tinymce_js += "#{key} : " + case value + when String, Symbol, Fixnum + tinymce_js += "'#{value}'" + when Array + tinymce_js += '"' + value.join(',') + '"' + when TrueClass + tinymce_js += 'true' + when FalseClass + tinymce_js += 'false' + else + raise InvalidOption.new("Invalid value of type #{value.class} passed for TinyMCE option #{key}") + end + (i < options.size - 1) ? tinymce_js += ",\n" : "\n" + i += 1 + end + tinymce_js += "\n});" + javascript_tag tinymce_js + end + alias tiny_mce tiny_mce_init + + def javascript_include_tiny_mce + javascript_include_tag RAILS_ENV == 'development' ? "tiny_mce/tiny_mce_src" : "tiny_mce/tiny_mce" + end + + def javascript_include_tiny_mce_if_used + javascript_include_tiny_mce if @uses_tiny_mce + end +end \ No newline at end of file diff --git a/public/images/a.png b/public/images/a.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb7edd3e1356320fbf5532b57de1a722e5b53fd GIT binary patch literal 2894 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 literal 0 HcwPel00001 diff --git a/public/images/alert.black.png b/public/images/alert.black.png new file mode 100644 index 0000000000000000000000000000000000000000..7f70a51d0e924483e6bf25681b59ce5f0b4a871b GIT binary patch literal 2866 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 Q*8l(j07*qoM6N<$f{++@j{pDw literal 0 HcwPel00001 diff --git a/public/images/alert.red.png b/public/images/alert.red.png new file mode 100644 index 0000000000000000000000000000000000000000..ce05e0538806d2b6868a6490c4ee3af5e967eb3e GIT binary patch literal 2866 zcwPZA3(fS2P)4Tx0C=30)_F9Q`x*!E@4E-vJnqQ6Gi4r2q+|{UNy?b8$-HgbmfLFR0f>k4^Cke|tC$g7fOrIurCDK7EPyfq2v~=OCo%yMeE?x$iOe`aqyRuz zTwHt@Ao3Z2Hj~Za0-{O)41E3k8T=#1y#{P&0)m%+)tCW5c>thu=T}X0H=tMq>@WUR z8}R}GfRJrXTxn(s03bx|0BR49H=+g5wgZ#fc)algJlKPaso0!d-ZEj&X*J|GU1va*J_Kr>qon2gi zbMsi_x!7xo_tIrPzJC7x0fEbdRs@HHGQ+}Gu8fF`ijIkmjbp{L6F7;9+@w{>DJiLG zzo)NWy(VMrx^$9^rZ6a`f1-<0np@JXL-A^qI3YHRsOP)?TQqyLjpH>V8W z2JRk$;eo{E;B1@efEY8 zIk_7*{esxOW9P2I!reuC_UzqPTvGB!>Hhy+;@Y+A^*0(C8gJgZ^%J7C^?qA>N5>Bb zKEv}DFM40Tdd)`|_&7N9Y2?e;_X!>d5`{_=5*3${nIgv;H&eoheUwh%gPY`}*+`QG)e7oh& zoxAs1@3*ygbUx^M_~`M|?q@yEdtbipd;9Lg;Lzu>aUQ_G`v4$d4(xIR{JsG0(ZGh4 zfVK&s&<}Wu0p6A%&1Zu|$_H`y3&;dO;@>ThKmiTH5Q7w^K>@1JgdR*`2^%=W6TS#R zG!n5IIoOU89L8B($31l81I7svLWM9P9EkveOKc&kh?_(oiAK^TEheRsDoAZ)kWI-E z)o z$D$6RHDbDA72;~*!e4j*hb9&-m zguV2C?cW#H&w3v}5IX2QG~?5|kv(6uMsvm*zV?6X{oXcSF|lgWWO87tl(&e-0|1af zg&@Qr1vw}|4LUHw99Y8%9`HdhqQS))Y{V{<;W#d$2@lbSF@i=Y5C()T;X|;99HNZ4 zOmq_yBvq0lDV9`7x;;r+pOk z5IiX)A;c28E37ZPMfj75pGc$V9MR)q+G2;q4aDmt7D;@N+$5zfbzRz5`lC!XU5$Qg zT9T}u>}$C{ru)j%j%gVyvDKrsk$TTSHlssyVFnW@eA}Q=M+z z7kY2?KN(CKi5jbzn3=kpv1S#{zF|IOp={|gH`(ggynbt)1u-^9ZQt3?bcl33>NMnR z;gaRr<~GAU(WBXO#^Q9ZXWouWYkYKl_xsBPtPlJa#9i?B6gTXKY=!Bui<1|AzCqn>R(}d2Mwnn7`e4r&1wh_lG@g z`_7aUltz^~mg`i?9uhh{e&pS;_7iodDoz)iU41UDHn?utC66oa*Ot~tG_1Lq-?a1g z);n4E((bQn=XNG^u^zFWBy`931ihI1lKQIt4fm~Lf6aTl4>vwq4pt5cehM5uF!JOJ zF)B4C|CRD};M=9|dE?F#S|Y7kP*pHluuaHVXs6JWFkAS&NSw&1Xr`FBSfRMGc!h+qM7?C7 z3IX*=l`GU@c`^xA1FWF=*r<#MJw%Ztc&DC}3{D7h%BDNm|AQa!`SpAoO-qwcJ+ zP%}^~d*%i0x4MFQ>iSj&iw(n#QjPOXj+x#!8=tLj9z18aMf+R{E6;g5=091WVUuXv zVsGY9?PS03fs426RX1h#WRC})R*MfVk@8Mm+Uw)$d(nSZ!0F}2K}Ul%L&}(%Vbv?0 ze*EK`EH+y`p*QhxQeyJll!>&9>1k`MGI;A6v+}b8a&&ViHnrs)+gebtc6-{+ltOk< z@Lq>vg_5VG*=5QHPE|Np{(0y~RmxGX<7Ox6r-o0roGm|>QM;nf`V#$e&(%HGUF%01 zDsBcgX*Ba%`tG*1o^RXM5%_@KRrkpA@zbZvyPxzddEV4J|7G=S^*1~FCj0%~RlOe= zQ2AQ!e%P{JqHaL|bJXZ6qDzFZw$Gd5@J`PZCp>fg?Nclq8qzHI#QM8HJHr0eAM zDT}EiJVo9X9uMHpivR#&`}o*+4#Umf;U9+E|2N`dlYYK~3_vuTwR8ypX#lfWp&pBV zEg$n@o@$6JiR750~VasO6hBNHr literal 0 HcwPel00001 diff --git a/public/images/apache_pb.png b/public/images/apache_pb.png new file mode 100644 index 0000000000000000000000000000000000000000..2fca511661e09382cebae1f9a04645bebce1d215 GIT binary patch literal 2795 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 T%b|6000000NkvXXu0mjf&f9w2 literal 0 HcwPel00001 diff --git a/public/images/ball.red.png b/public/images/ball.red.png new file mode 100644 index 0000000000000000000000000000000000000000..f373795ef4b7ef6acdc0ae9c81a6fbe4e26b451e GIT binary patch literal 2846 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 literal 0 HcwPel00001 diff --git a/public/images/binary.png b/public/images/binary.png new file mode 100644 index 0000000000000000000000000000000000000000..e054f7249c31bf5731f9c7fed86106adb33ca891 GIT binary patch literal 2889 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 literal 0 HcwPel00001 diff --git a/public/images/binhex.png b/public/images/binhex.png new file mode 100644 index 0000000000000000000000000000000000000000..7b7a04a6ef2c8db03bbb01ecae56a1ce6c9d6a60 GIT binary patch literal 2903 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 Bh>8FJ literal 0 HcwPel00001 diff --git a/public/images/blank.png b/public/images/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..48e5929e96a79d86c5c4df597e84c82c625525f1 GIT binary patch literal 2756 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 KMNUMnLSTX!cS2(T literal 0 HcwPel00001 diff --git a/public/images/bomb.png b/public/images/bomb.png new file mode 100644 index 0000000000000000000000000000000000000000..eea2abcb7d97348cc34d82a31319440cc7e4d692 GIT binary patch literal 2964 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 KMNUMnLSTYn_OA{A literal 0 HcwPel00001 diff --git a/public/images/box1.png b/public/images/box1.png new file mode 100644 index 0000000000000000000000000000000000000000..4716472acdfa7618777246325ddf0d875bba9dab GIT binary patch literal 2875 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 Bi+=zB literal 0 HcwPel00001 diff --git a/public/images/burst.png b/public/images/burst.png new file mode 100644 index 0000000000000000000000000000000000000000..464066e877645eb2af4eb1af0222846087bd2056 GIT binary patch literal 2920 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 AQvd(} literal 0 HcwPel00001 diff --git a/public/images/compressed.png b/public/images/compressed.png new file mode 100644 index 0000000000000000000000000000000000000000..e3c543efd93eb3c65697a51043ecf04e01bbf5b6 GIT binary patch literal 2881 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 literal 0 HcwPel00001 diff --git a/public/images/continued.png b/public/images/continued.png new file mode 100644 index 0000000000000000000000000000000000000000..e35b7d67fe5036c3c55a10561d8fab5556a4cdb4 GIT binary patch literal 2845 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 literal 0 HcwPel00001 diff --git a/public/images/dir.png b/public/images/dir.png new file mode 100644 index 0000000000000000000000000000000000000000..7550354372df5539b84240e2413f2489bc2da68a GIT binary patch literal 2857 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 Hu0mjfUQBZv literal 0 HcwPel00001 diff --git a/public/images/diskimg.png b/public/images/diskimg.png new file mode 100644 index 0000000000000000000000000000000000000000..818f513823fb3aae2dfd24e140f6c3725963c9f2 GIT binary patch literal 2908 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 O0000Tf& literal 0 HcwPel00001 diff --git a/public/images/dvi.png b/public/images/dvi.png new file mode 100644 index 0000000000000000000000000000000000000000..8e9edeba4f0b251443b638a71ef13e841376b0cb GIT binary patch literal 2885 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 literal 0 HcwPel00001 diff --git a/public/images/f.png b/public/images/f.png new file mode 100644 index 0000000000000000000000000000000000000000..301152e365a022630dbd1d33a1bb006b449151d8 GIT binary patch literal 2875 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 literal 0 HcwPel00001 diff --git a/public/images/fileicon-cpp.jpg b/public/images/fileicon-cpp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5c95e57cbb7e8e88ac61d9be5fc42ffb961521c GIT binary patch literal 848 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TyFa9$;m?qC`pZ=er`kTXTjjZH^dHpL<#&jMg@^BwYv!GEDeC01 z_|s2~7cm8Fa=Gn!EJW@KWA}dsmdk%P*{AMr*uVMS(g*8%_6sC^*x$Y6NABrF*O=bZnc#s0SUw`tvl`%Hi2AN*%%wijgY-s7GA o_;zg3w+j{ZA)9Vz%_@Dvt69A|W8#L-PP?7Oo-bomVE%s-09FSs6aWAK literal 0 HcwPel00001 diff --git a/public/images/fileicon-deb.jpg b/public/images/fileicon-deb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..51a83f0c7cdcb1128d5ba4d02c47fd1d5ce4efd1 GIT binary patch literal 924 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Ty>3@W?AIKm4&(QgwVKeiqeMUbrANC7Y%zFKZZ}swZTUS<8o%{8l;mx;SxqDAV zMQ=S4v?5LM#GO8-pF3iY2+sb`!0PaK{ywo9wZC(0G}l#FKV08#qr2wpN4ML)+pm?} z=e_lE`}L^em*SJQ1phR2ouDV!@KeB`%j}l_nTpFRKJuNv8x_6m`rfzI_s?B>dF7X- zJ3G%Zn=9A1Oy9G-{Om`IPoF*)eTp=%i%V7gcyq-(-QNOrH~xwIko;i$Pk`6|QF_ZC z`LcidJFl(N+4`S>=k=_XqY;sBXUd(r`B+|e_o9CvW4)~fCra}DXJ~4!ySY#3@1lRa z748SC#E|6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TyKa;;{{V4sg|9Cvd`iCFQ8@Bih|5*6Pvp8S&=)2iG*PWO}_g(5atfD;0D}Aw{ z?8gWDw_b0svHkEb<>Hq2+%MK}dc#hjMi*x;P-a8sX^OsXFrhmHHO{hej;f|BpUkA(kI*qiI(u_;R} zZH9xGL&N4Co;-Q2IZS@6g%_r3URm97+^u_xX0?@3;QXy#zLv*)*SXA&wfkIoec6V< V!+}%Q-F-55XLPjbb${dkHvw^`Kn4H+ literal 0 HcwPel00001 diff --git a/public/images/fileicon-dvi.jpg b/public/images/fileicon-dvi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e24498410e03d8eb8b80e09c1ae0d9cafb85389 GIT binary patch literal 941 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TykN-0y@VD*f_!IhD`;}DN`VYwm_Y2pl`#zrQbXRZdTOsY;-MXf_xrT~qU2dO_ ztP2fipI*k$np5-ecjn;-+V$<_ztY?5M1PnctlBpBv8|HFS9$)5vTNsFzX=bk+NUt7 zx-?{xrQKf=+-{8@A}Umk@|scO^thX-LBYmy{pcBFZ5&y zTt8cP?VOWOW$aJM#)w)`hweu!_9@mlUa3=ze0^(+VMf%^ zMaR>{=GU@)o%HLLYDln&;2N(p4h)|^3qJYJkeDv~SpMyH3wPd>HT%pnwyb~m?#bo+ i*%?QpS6!Ny?ljHUW|!tpzjJ@}>tok$o4u|6|4jgsKVLck literal 0 HcwPel00001 diff --git a/public/images/fileicon-exe.jpg b/public/images/fileicon-exe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..464ae43ac5eb7f33fc0e6df465b28c7a8588805c GIT binary patch literal 958 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TypZ4Ea@BBk|`M;C5>bq=WKe!*5FJh;VEiYUuD|RYgG;`Z$-)|Z@xhg3g``@c* zeOeK5+2)j=waob+8oc}8{9RGQaPez=%Y4Qy_O1KWF6~o%`O9zns!S={t((rMUEZp0 zc2Xxx_Il~2-P(*zE3Y@lTgJ=x9eQ?UgGGc=;_tsWw-Xdx@NRL@qX9*jpA)}+?iGBZ{T>_^+CP0Y_L~j|ujeZKzS?4^^?wGfP45410svkh BWwHPO literal 0 HcwPel00001 diff --git a/public/images/fileicon-exe.png b/public/images/fileicon-exe.png new file mode 100644 index 0000000000000000000000000000000000000000..437ad22538f85050db753fc08ae2d4084453db8d GIT binary patch literal 3043 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 literal 0 HcwPel00001 diff --git a/public/images/fileicon-h.jpg b/public/images/fileicon-h.jpg new file mode 100644 index 0000000000000000000000000000000000000000..72864b2dcdb152c0aababee134dc7dcf5f51f7f5 GIT binary patch literal 838 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Ty>;E&b?EPW>LI3!CmgU#}Y1J5hnBKk4{-O4jx4r-NF1Q_gM%lYMSSHEctzhBI zj)1~xc3a#3Gq48yu>atFK%V1|{hB{oKe8YCvwN!dz0uisdqGCow@D|NUrs--;;WLe z=0r-b#7c`(%r^qq?EeU7f7|tU_CDqsmFb7)OV}y9KFrPjClu@UCt`p5R_{v*)9&3= zo?Nx&uUN?)8|~6AAa| literal 0 HcwPel00001 diff --git a/public/images/fileicon-html.jpg b/public/images/fileicon-html.jpg new file mode 100644 index 0000000000000000000000000000000000000000..15eae368a0cabfed3e0aab602352b370e99905b4 GIT binary patch literal 908 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 literal 0 HcwPel00001 diff --git a/public/images/fileicon-iso.jpg b/public/images/fileicon-iso.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9d65b2ad93f4112f4cd2ab202876eb5c5ba12911 GIT binary patch literal 921 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Ty-TyeJepvp%z0W@VWS*TujpT>r{ePkhAN%?Vu6}(>L_9Y;Q+DmlKC|-JquzUF zhsZER%-i#<{$Nm@&>!9p{0HP&U&Zt76aL|TAWpkpKJr%V{U61yZ5N+!tu_05OX{;`Q_E z7iYwO@H>C&^tY5B+P`gH#qs`F|IxFC_i?37V*LvDoPQEmOBq$CZ2PvVC+^xk7s-mH z689&b3!fNK{~^f!R{OW4AGbgFAGVYJVfay|;`}keAMY+l?Azkc_i7p^>y)b6FFvoX zmwjCL_svHpW-&_^J;tM_+dgbQf34awE^u>C?v|aYZ0~D>d$w(RX+1-y)Z@WDQQa^3 Or(Q125B)Cx|0V#=>sZkM literal 0 HcwPel00001 diff --git a/public/images/fileicon-java.jpg b/public/images/fileicon-java.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8fd901ac2d1fd6f6558e8dd311fdd72a2e54cc11 GIT binary patch literal 864 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TyC;l@ul~g!?3!MHfW%7~xay7yaWYdp`$Jt$3qnrOHba~Y2qHhn|xR*c8zXf&aK=(y@JyO z+kHPC^I+*&@MURfHQ%}GHtOF@ejNQR@}hpT>-EFuZ+Qn_eEKmb&hUz52( z?%m7I4vAc}d&8F531yv!-FH8`v81tahJBuX?|+6(^Sk~tq}4OmX#Sn|PvPMD`!Dxd zZ@;$Wf{u;p%9q!si8USjsZw$4)iu=#Kd%cunRf5!>0Eikl>uFoXGQHjRW!M)yGr^0 FO#u4EIl2G< literal 0 HcwPel00001 diff --git a/public/images/fileicon-mid.jpg b/public/images/fileicon-mid.jpg new file mode 100644 index 0000000000000000000000000000000000000000..040aadd15b283dc79e7eec016eca2ffec17cf8a3 GIT binary patch literal 849 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TySN}6KMc18|XSLI+JNs*Yr=4Pr=7;^gr8oZM)+bH>b*`KB%4?>mTSmuZugqPr zdxBMJ|Jp+P55fBz@3a4ttvfrP$0qiHeCs~(59S@F_7a&N;^H!*Ow1;EitGw~b6zkd zz)RdEcgeiaS`FsDzis<7&)?jBAbwML_dl*bkw0EPvTwFizh)C#x?=5rhL$y^iYss5 zGAXN$8sULPf=sz-hz4WVjG9TUM p8@tvneRc6pZQE_1-CI8|-LZFjkGI-OB_40_q@x=u6`23u1OQ97FjN2l literal 0 HcwPel00001 diff --git a/public/images/fileicon-mov.jpg b/public/images/fileicon-mov.jpg new file mode 100644 index 0000000000000000000000000000000000000000..86b24a207f8ba559baaaff8d3bbff784fae60c89 GIT binary patch literal 912 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Tyr~flFW&KhAVfpw!!_9Y}{6+uBe6a7UN&U~jnYUW!*Zppjh;^>>=JKvx$Q84) zwsBSvgNmko$-5JWfcj?E82)g4(BCjma_5KogZnxDn17s8FJSV!@~b@Wi@=-Gw>iI@ zbqd(YrNR-VabtCDE?oUoVU0r!s`&aaW z^FP$p-^Tyeui^h8tl$1mrzS9;@sDHsF{!?Vxk44iq5JM9+iqQ?nZ9k?G$Zb#>ZhWW zS*AV-xBSn*s`ht*62Nl{Yp;9bA6@@Uzam zwU3+@u2YWfD*nvGCh~Y<($hDx;?gfq*KK?DZ2P^O58bc1c1_;;K5zQdr~B{J|Gx|6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TyoBuPg?ENA6q4?4KH{Xlxd+Y>%m>-*`T`!eYxNq|#TQ=^S37h+Fomt`)lhXU{ z3D1K(yRDu78CZjUsDEgFn10|q_vr`gTmA`rFz*U~#M`@M*ZQ_E7CB3HZJO?LMa9t2 zl|AprV%6fNQ2(3@?6yFwp8j38Kb^nfKLg`B8_SQ{k9PeKKECoXuX{k(sd(P3?H|u4 zn{HjCn7(z}M7B6h1M@tICq=v|^#{G|v-xk{e*FBPKko~B?mEr&{d)@LS#Q3kzjpD5 jXDgQ<&rcScTg&$}dw0c!MwO2|Y&zxX5-b|6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Ty5C1bH@H72Uzh0jfJ=Z(t2mgcmE<5|#$IY*;Uio9U-}a2RI!CvzpSIq3WkTbh zOXA9tkLw*_``)*IiqluU o;0Ch4jWB>pF literal 0 HcwPel00001 diff --git a/public/images/fileicon-pdf.jpg b/public/images/fileicon-pdf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0586aeb1333f235946c3b6ec47284131b8c1e5de GIT binary patch literal 931 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Ty7ydIeW&L6Kq5qNlo8^zj$MMoNx*y8B{v@Y9vdxp$%{~&vy7%?%HCDB2CTg2> zdG^ZA-1g<^j%OR}A1tqDv*Y+7|1I!`=i~ae{|wwU+7H$Xy^1rv{HD~_+4(}k#<`!D z-rst3&um~k+Blb_zuS`_ICY(UrvBP$?U$#kYu;4Lhc}&5 zo&P@r%g?{-{xR1m{GI>4PP8WS$I|=TIJ z8LbzyGI48#uJ=DK&);7EPTrTS|6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Ty_y03AMb~is;Qc86E$ym}>qqH_;;l8ck6J&TTbe0*Z|%by>)*AmDVx@_f-~rl z!Mnm6;zxsj!( zoFp2#I9bH^uD8ZJ3x?0~H<-W8{5#i9xQ2c5q4~o988URsAF6jvKYFWg(XF)p1+lSf zpRU<W8ma%Wuehx$K_9Q`tAV$%W6oB^9RC>^y$TE`b04O#l|aG+Y1x literal 0 HcwPel00001 diff --git a/public/images/fileicon-rm.jpg b/public/images/fileicon-rm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..304d5a3475c60abd6e5428daa6113878f50433ed GIT binary patch literal 854 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TypX_hUj`%xykLYj1sMqyU|5$F%f%d>8s*$oS;bM&hnFq<`{b!| zpXjV_DvV25_B_zqs4jE-?fG^8&dKTjo%_dreU0MZS?WJnAFa;s5Hp)TDN9al!{t1E zou`-cpJ+?p_ExOeeq2y-TkpZbNy`~z!{3;HJpE1d!u~Yw^R4n*+m#=5L(+4`kb$>Qj2_f5#u4 v{+~fe;iKN}Z@uafUG*E5PFpDDwmClfSQAIoD~rdS(H7PnW%r&i|Gx|6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Tyv;T3He^~#m?Bn+Xm5M)lKV%>N&me545L>Z3e3In*Ki0YBru$~+=O=M{+8j_R zNjrP-8Si|6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TyPyaJKn7@zVhkE62t+3+ZR+CaTjvWC zew8hF{JhiA(ArgGw&&v~DkbXI=CK~uYfC);(ev2dlGlIB-FXVNB6cQLmU-U4@?rhW z=*R5`?D_wl%KdQq_!flenh;VCUu?TQ~PcF4??oYRLP>k0+Jc zwal5L?{E9h@K*W*^YQtc_z&4P?dSPtdirDWu{xQLORU!Zx%8tr^zyfx-M)@>&gJ=1 zKMS{>F;vRe-J&nSp1&~MWNEPS(kZ{~tAvZ5ead|K>@?@kG+tod^N J!=K3iHvt(XTU`JE literal 0 HcwPel00001 diff --git a/public/images/fileicon-tar.jpg b/public/images/fileicon-tar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5880b857ebedfadcf6166c5bd754bed11744abc GIT binary patch literal 903 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Ty<$r{=A3Q&>U$*Y7)v^5_5l z@63gd=Ui9+&%kQ^Bk_atf&UB)HKHs2SpKkoxW4_L()8oowrzS#_5^wre&Kji*1d@Gq3^KtdkzUpsGe^=F~{by*7 z-#l;WL;22n5%*@Bs+z>wmF~+Wu$ze~53h6aEtzFa6`#@nhS5O}#dsy?v{<#M(Eltxt+PpWVIfvPs^|BfN=E vy5&H!myI>+5r3QKmu|WLzP7n;+V=A&w$HMEv;WP%*!=y|UO)dO|NkZcO)pW! literal 0 HcwPel00001 diff --git a/public/images/fileicon-tex.jpg b/public/images/fileicon-tex.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67f57effc933746fe884464b89dc065a3c7dd283 GIT binary patch literal 909 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Ty`~Ner?D^sQ+vLafZ)JP0>@%n_`Y^rACQ!e}G?8uPBYA%JqM%dvZXGV#dS>F3 zUcq;ahb<0Hws^L&{=usKT=wbu%r#se?tVXbzipq`hw{#~`;;<&m94B^@T1OJQ|?x+ z+OLPgXCtn73%~6>7<9_3^wgZP+OYi_zx~xj(i(jq_4bLW>sS* z{*kTn-P%Rr+`6Y2W_QXZDkK*Qf1UO3_^UtXr^nh>RmH~L{i=QA(zkiHr{8;5|NkZc DJ}X@0 literal 0 HcwPel00001 diff --git a/public/images/fileicon-ttf.jpg b/public/images/fileicon-ttf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df88a484b6da9fb817e36d25d5753b96e4491e85 GIT binary patch literal 931 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TypW<)SKm6Xj{O|Pn$L}fs(EafHk?+y_M^5}vPB!nT(VNw`-1O{)?Y&9i=?)W) z#i@m=vo4*i%5XNR?!Hv|p~BymKjfo6n7?`d@O@j=k00G;?W-ylAC|J+BDVQ#I_sP8 zsLDw?n+#?s-gwTJQ09A(Q>Ns3=(Ra2SEt`!cm4VoyXlhc2ZBz0_|YXef6Lr=w`2OJ zKMM5HTsAvC^X2NTm#pG%xPR;aJH>|cw+VmSe+Jn)o%kQ(N5$d=^J?Ok-MsPQ){_4W zMh7!=^Q649Jtw@KCaze{#Py^{FfRLda!uji`FnhS8)U|F*@@P~ZTT_zk=c*q|6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-Ty_x>|9MgC#^q54t#TlQ5O=a1YE?zjA@U%$T3lw0LW>0U1B-K~wfxspkIulx?g zo{;U9k2(d^vayEqhw6vJ->N^D?f-E7A%9z){OjrR0&7iv&vkaauwc`)?6S-GPcpof z+BD)UZnO6+ns(qXP5)n*di3GvfdN literal 0 HcwPel00001 diff --git a/public/images/fileicon.jpg b/public/images/fileicon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..be221d4bb108e4901f947bda90a188b65585fd62 GIT binary patch literal 853 zcwYN||6GPOWC1{Oh9Aw@$+ zHsQcTcBMiQqsEB~Ih36?9uy6__(8=usi=vQOH5osQc6`#T|-mL#MI2(!qUpw#nsK- z!_zA`Bs45MA~GsDB{eNQBQvYGq_nKOqOz*FrM0cSqqA$$>wvIGL?h;Bgn$4Xviky7|5PjD6C}E$RXl1apA^;oXW;QA4HRi zE^>*fm^@Vd2y!*p(ZspAi7ZFM-3)i~{{swy91H>s0?dqx3`~NI%z}*nZ!z#NGXgox zf(-TyZ~ikpn6iKK@dN9->NlHhd=%d)&#_1S@q7XI$7`LAn#$%oZ{IaH!8_V4qWQ#< zH$3kgUU17t9s1AEwC&&d{|qd4B6a8Iv3_JfY~S)v?1S9);*Wfn{derU@FhZ5ZQ9)} zw|`2hRa_BjecZe8vexpg48`#ueD2>4{+9N4zI}Rc_<{Z6`&9ok98!L?a!-2wYWL*- z3>@E9SMIvyogLz7b2>URSu$gZba|e1C9|@{{SP7fx3$0J{asYYTA_b%Kf9eWP;25N sZ+_X^+2&>SANpTSi;G>9`TfF{+3(gaa_&^`$mNNCcFus4LH_?u00UevjQ{`u literal 0 HcwPel00001 diff --git a/public/images/folder.open.png b/public/images/folder.open.png new file mode 100644 index 0000000000000000000000000000000000000000..29045f071c874cd11de531d10907fac1c3882c9c GIT binary patch literal 2902 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 literal 0 HcwPel00001 diff --git a/public/images/generic.png b/public/images/generic.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe28fea43b06986e8159f83a7b3b35627bd2ac7 GIT binary patch literal 2844 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 literal 0 HcwPel00001 diff --git a/public/images/generic.sec.png b/public/images/generic.sec.png new file mode 100644 index 0000000000000000000000000000000000000000..cb2377413d1f2979796d4af767d31db6f34a76f3 GIT binary patch literal 2854 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 literal 0 HcwPel00001 diff --git a/public/images/image2.png b/public/images/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..61a6612e93cb836f1e07a68171d71ec760f4550e GIT binary patch literal 2926 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 Y7yl$yTlZ{V$^ZZW07*qoM6N<$f^{jB#{d8T literal 0 HcwPel00001 diff --git a/public/images/image3.png b/public/images/image3.png new file mode 100644 index 0000000000000000000000000000000000000000..84766dfbf23f01fd43c1b03dd3b47e5ced52e820 GIT binary patch literal 2904 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 literal 0 HcwPel00001 diff --git a/public/images/left.png b/public/images/left.png new file mode 100644 index 0000000000000000000000000000000000000000..ecba46cf397df928400a3acd35b3fe16fc87ebb4 GIT binary patch literal 2806 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 literal 0 HcwPel00001 diff --git a/public/images/logo.jpg b/public/images/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7cae5182e926d088194871de48be4096ce7ed680 GIT binary patch literal 40174 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 literal 0 HcwPel00001 diff --git a/public/images/pie0.png b/public/images/pie0.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2fe461c67b32760756355f7c7dd03b5b538a8f GIT binary patch literal 2837 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 literal 0 HcwPel00001 diff --git a/public/images/pie3.png b/public/images/pie3.png new file mode 100644 index 0000000000000000000000000000000000000000..afa0933c18ba989878a1cdb840985f26c7f1b2a2 GIT binary patch literal 2832 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 literal 0 HcwPel00001 diff --git a/public/images/pie6.png b/public/images/pie6.png new file mode 100644 index 0000000000000000000000000000000000000000..4a113ca46ce518f637fcbbe278b4395dbd7e696f GIT binary patch literal 2823 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 Z10QyoAGMu;Xi5M8002ovPDHLkV1iD*WZnP( literal 0 HcwPel00001 diff --git a/public/images/pie8.png b/public/images/pie8.png new file mode 100644 index 0000000000000000000000000000000000000000..a90baa3b029e10412da446903ebabfc66dba3c24 GIT binary patch literal 2810 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 M07*qoM6N<$f=J6%i~s-t literal 0 HcwPel00001 diff --git a/public/images/portal.png b/public/images/portal.png new file mode 100644 index 0000000000000000000000000000000000000000..03307087b5d2bb4092be7c719fb2a5958c9a83b6 GIT binary patch literal 2872 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 literal 0 HcwPel00001 diff --git a/public/images/ps.png b/public/images/ps.png new file mode 100644 index 0000000000000000000000000000000000000000..1092c54c55f06c3b33c839a825e250957bc69db5 GIT binary patch literal 2880 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 JPDHLkV1gw-j!ggn literal 0 HcwPel00001 diff --git a/public/images/right.png b/public/images/right.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa257bf9c7ea6432499c9c8a6404a3ed580355b GIT binary patch literal 2812 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 literal 0 HcwPel00001 diff --git a/public/images/screw1.png b/public/images/screw1.png new file mode 100644 index 0000000000000000000000000000000000000000..9a90c79ee23aa7b1f6add7802357eb78a91c289d GIT binary patch literal 2909 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 FV1g|xi;(~T literal 0 HcwPel00001 diff --git a/public/images/spreadsheet.png b/public/images/spreadsheet.png new file mode 100644 index 0000000000000000000000000000000000000000..126f1c878a4d7aa2e864c64bba9231b50c593693 GIT binary patch literal 623 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 literal 0 HcwPel00001 diff --git a/public/images/text.png b/public/images/text.png new file mode 100644 index 0000000000000000000000000000000000000000..75ff93cb877a75035286c2440a414791aae707d6 GIT binary patch literal 2867 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 literal 0 HcwPel00001 diff --git a/public/images/txt.png b/public/images/txt.png new file mode 100644 index 0000000000000000000000000000000000000000..f8aaba2e3e3e488dffb292b58a0143b7d8341b91 GIT binary patch literal 601 zcwPZn0;c_mP)|W zK~#9!os+?8Q$ZAlznM&$-n4k90@p_fHN8AuI$lTL5^xTEq<0W-yyWRS{K06j4J| z5K(j#?|nW1Aeb2dmBdfjQ+4q39occ<YoO6Wi zE2UBeQspe2W%l6%07R55>oFMQRI8O~fO8IjVy}S<2_|LE7gs3`@{ur(McwZCG~mKs zep;Y#XN{9zP5SrO$=WFZySrbe>~}gHopNw=Wcb!M`YTWIqB!U9e)zVvwS{vI5usMA zvAMaqKjolvk~6>lf?{co5DJvbvm{9gfL^ahjFEc1&i3}UyRirNUcUY7^rdM^qtO_P n0o=~c&Pu!8{^xPNDhBuiN=!A6_`=~Z00000NkvXXu0mjf*?kWY literal 0 HcwPel00001 diff --git a/public/images/unknown.png b/public/images/unknown.png new file mode 100644 index 0000000000000000000000000000000000000000..fa223f74cd61eec541c005a33db45b4fca738bae GIT binary patch literal 2882 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 literal 0 HcwPel00001 diff --git a/public/images/up.png b/public/images/up.png new file mode 100644 index 0000000000000000000000000000000000000000..36139312f084502064f9e183a848a432223627a1 GIT binary patch literal 2805 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 literal 0 HcwPel00001 diff --git a/public/images/uuencoded.png b/public/images/uuencoded.png new file mode 100644 index 0000000000000000000000000000000000000000..24227375aaa5f4578eb76b15af6caeeb9d494618 GIT binary patch literal 2879 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 literal 0 HcwPel00001 diff --git a/public/images/word.png b/public/images/word.png new file mode 100644 index 0000000000000000000000000000000000000000..2e788c25d9642c6e450a74324f4674fd155a768e GIT binary patch literal 767 zcwPbj0s#GqP)z@;j(q!3lK=n!AY({UO#lFTB>(_`g8%^e{{R4h=>PzA zFaQARU;qF*m;eA5Z<1fdMgRZ;bxA})RCwBA?C^QBY98u;t7z1|CiZ zhA%(U00*9^yw9%1nF_XqM=8U6t^{r~ru;opBIApIZ6X9B82_!=O9n9%)n^ypEB zg^Lz5+_-TQXdW}e??3+-e*O6mq=7C1TKpGi(2rjT7XSnhiUH4_J!5$O{5gZLurR~c zty{rj|NjHM#R&8m3k$>Bw{IEVzkiQnAwU4JAajl%KhEIfj4NLxC=gf_`tAp=T3$L2M#dYx^;`; z<;#~0%a$!;U}9nd#>P*utE{c98RX^V8I~+r0=E<(fZ#4zy?Ql+qoX6(1t2GX{rVNG zFeWC3K}JRf?3G!wW-XKmfsAFlEXV1~oM`20=kV22oK_23=iUhO1Yv zGW7QLGF-cMjUg*53v3Wb4af^H01!ZM1I*0K7!Dph$nf#wN3iXn08L9v1IGDZhDVPc zF=S+9fMW<`dwP00+yH<8Vgw~+P)Y=W@87?JHGusF40R3;4sbg7{rflA>D#t#Lx}-U zi~$4?JPf{l`v!3m6U0#0e*gd49y?_5I`(2L1F>2W)J`fFaY)h3~i7l>`edw002ovPDHLkV1nS3IdcF2 literal 0 HcwPel00001 diff --git a/public/images/world1.png b/public/images/world1.png new file mode 100644 index 0000000000000000000000000000000000000000..df069c7b46f0a4bf0a6f307276fd7cb89163a98a GIT binary patch literal 2939 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 + + blank_page + + + + + + diff --git a/public/javascripts/tiny_mce/langs/en.js b/public/javascripts/tiny_mce/langs/en.js new file mode 100755 index 0000000..c093eaf --- /dev/null +++ b/public/javascripts/tiny_mce/langs/en.js @@ -0,0 +1,41 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +bold_desc : 'Bold (Ctrl+B)', +italic_desc : 'Italic (Ctrl+I)', +underline_desc : 'Underline (Ctrl+U)', +striketrough_desc : 'Strikethrough', +justifyleft_desc : 'Align left', +justifycenter_desc : 'Align center', +justifyright_desc : 'Align right', +justifyfull_desc : 'Align full', +bullist_desc : 'Unordered list', +numlist_desc : 'Ordered list', +outdent_desc : 'Outdent', +indent_desc : 'Indent', +undo_desc : 'Undo (Ctrl+Z)', +redo_desc : 'Redo (Ctrl+Y)', +link_desc : 'Insert/edit link', +unlink_desc : 'Unlink', +image_desc : 'Insert/edit image', +cleanup_desc : 'Cleanup messy code', +focus_alert : 'A editor instance must be focused before using this command.', +edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?', +insert_link_title : 'Insert/edit link', +insert : 'Insert', +update : 'Update', +cancel : 'Cancel', +insert_link_url : 'Link URL', +insert_link_target : 'Target', +insert_link_target_same : 'Open link in the same window', +insert_link_target_blank : 'Open link in a new window', +insert_image_title : 'Insert/edit image', +insert_image_src : 'Image URL', +insert_image_alt : 'Image description', +help_desc : 'Help', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/public/javascripts/tiny_mce/langs/readme.txt b/public/javascripts/tiny_mce/langs/readme.txt new file mode 100755 index 0000000..9c3a9d9 --- /dev/null +++ b/public/javascripts/tiny_mce/langs/readme.txt @@ -0,0 +1,9 @@ +Beginning with version 2.0.5 the language packs are no +longer included with the core distribution. +Language packs can be downloaded from the TinyMCE website: +http://tinymce.moxiecode.com/download.php + +The language pack codes are based on ISO-639-1: +http://www.loc.gov/standards/iso639-2/englangn.html + +Plrease try using entities if possible. Like å etc for non a-z characters. diff --git a/public/javascripts/tiny_mce/license.txt b/public/javascripts/tiny_mce/license.txt new file mode 100755 index 0000000..60d6d4c --- /dev/null +++ b/public/javascripts/tiny_mce/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/public/javascripts/tiny_mce/plugins/_template/editor_plugin.js b/public/javascripts/tiny_mce/plugins/_template/editor_plugin.js new file mode 100644 index 0000000..59e2ceb --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/_template/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('template','en,tr,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl');var TinyMCE_TemplatePlugin={getInfo:function(){return{longname:'Template plugin',author:'Your name',authorurl:'http://www.yoursite.com',infourl:'http://www.yoursite.com/docs/template.html',version:"1.0"};},initInstance:function(inst){alert("Initialization parameter:"+tinyMCE.getParam("template_someparam",false));inst.addShortcut('ctrl','t','lang_template_desc','mceTemplate');},getControlHTML:function(cn){switch(cn){case"template":return tinyMCE.getButtonHTML(cn,'lang_template_desc','{$pluginurl}/images/template.gif','mceTemplate',true);}return"";},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceTemplate":if(user_interface){var template=new Array();template['file']='../../plugins/template/popup.htm';template['width']=300;template['height']=200;tinyMCE.openWindow(template,{editor_id:editor_id,some_custom_arg:"somecustomdata"});tinyMCE.triggerNodeChange(false);}else{alert("execCommand: mceTemplate gets called from popup.");}return true;}return false;},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node.parentNode.nodeName=="STRONG"||node.parentNode.nodeName=="B"){tinyMCE.switchClass(editor_id+'_template','mceButtonSelected');return true;}tinyMCE.switchClass(editor_id+'_template','mceButtonNormal');},setupContent:function(editor_id,body,doc){},onChange:function(inst){},handleEvent:function(e){top.status="template plugin event: "+e.type;return true;},cleanup:function(type,content,inst){switch(type){case"get_from_editor":alert("[FROM] Value HTML string: "+content);break;case"insert_to_editor":alert("[TO] Value HTML string: "+content);break;case"get_from_editor_dom":alert("[FROM] Value DOM Element "+content.innerHTML);break;case"insert_to_editor_dom":alert("[TO] Value DOM Element: "+content.innerHTML);break;}return content;},_someInternalFunction:function(a,b){return 1;}};tinyMCE.addPlugin("template",TinyMCE_TemplatePlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/_template/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/_template/editor_plugin_src.js new file mode 100644 index 0000000..e69f1fc --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/_template/editor_plugin_src.js @@ -0,0 +1,238 @@ +/** + * $RCSfile: editor_plugin_src.js,v $ + * $Revision: 1.12 $ + * $Date: 2006/02/22 20:06:23 $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('template', 'en,tr,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl'); // <- Add a comma separated list of all supported languages + +/**** + * Steps for creating a plugin from this template: + * + * 1. Change all "template" to the name of your plugin. + * 2. Remove all the callbacks in this file that you don't need. + * 3. Remove the popup.htm file if you don't need any popups. + * 4. Add your custom logic to the callbacks you needed. + * 5. Write documentation in a readme.txt file on how to use the plugin. + * 6. Upload it under the "Plugins" section at sourceforge. + * + ****/ + +// Singleton class +var TinyMCE_TemplatePlugin = { + /** + * Returns information about the plugin as a name/value array. + * The current keys are longname, author, authorurl, infourl and version. + * + * @returns Name/value array containing information about the plugin. + * @type Array + */ + getInfo : function() { + return { + longname : 'Template plugin', + author : 'Your name', + authorurl : 'http://www.yoursite.com', + infourl : 'http://www.yoursite.com/docs/template.html', + version : "1.0" + }; + }, + + /** + * Gets executed when a TinyMCE editor instance is initialized. + * + * @param {TinyMCE_Control} Initialized TinyMCE editor control instance. + */ + initInstance : function(inst) { + // You can take out plugin specific parameters + alert("Initialization parameter:" + tinyMCE.getParam("template_someparam", false)); + + // Register custom keyboard shortcut + inst.addShortcut('ctrl', 't', 'lang_template_desc', 'mceTemplate'); + }, + + /** + * Returns the HTML code for a specific control or empty string if this plugin doesn't have that control. + * A control can be a button, select list or any other HTML item to present in the TinyMCE user interface. + * The variable {$editor_id} will be replaced with the current editor instance id and {$pluginurl} will be replaced + * with the URL of the plugin. Language variables such as {$lang_somekey} will also be replaced with contents from + * the language packs. + * + * @param {string} cn Editor control/button name to get HTML for. + * @return HTML code for a specific control or empty string. + * @type string + */ + getControlHTML : function(cn) { + switch (cn) { + case "template": + return tinyMCE.getButtonHTML(cn, 'lang_template_desc', '{$pluginurl}/images/template.gif', 'mceTemplate', true); + } + + return ""; + }, + + /** + * Executes a specific command, this function handles plugin commands. + * + * @param {string} editor_id TinyMCE editor instance id that issued the command. + * @param {HTMLElement} element Body or root element for the editor instance. + * @param {string} command Command name to be executed. + * @param {string} user_interface True/false if a user interface should be presented. + * @param {mixed} value Custom value argument, can be anything. + * @return true/false if the command was executed by this plugin or not. + * @type + */ + execCommand : function(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + // Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser. + case "mceTemplate": + // Show UI/Popup + if (user_interface) { + // Open a popup window and send in some custom data in a window argument + var template = new Array(); + + template['file'] = '../../plugins/template/popup.htm'; // Relative to theme + template['width'] = 300; + template['height'] = 200; + + tinyMCE.openWindow(template, {editor_id : editor_id, some_custom_arg : "somecustomdata"}); + + // Let TinyMCE know that something was modified + tinyMCE.triggerNodeChange(false); + } else { + // Do a command this gets called from the template popup + alert("execCommand: mceTemplate gets called from popup."); + } + + return true; + } + + // Pass to next handler in chain + return false; + }, + + /** + * Gets called ones the cursor/selection in a TinyMCE instance changes. This is useful to enable/disable + * button controls depending on where the user are and what they have selected. This method gets executed + * alot and should be as performance tuned as possible. + * + * @param {string} editor_id TinyMCE editor instance id that was changed. + * @param {HTMLNode} node Current node location, where the cursor is in the DOM tree. + * @param {int} undo_index The current undo index, if this is -1 custom undo/redo is disabled. + * @param {int} undo_levels The current undo levels, if this is -1 custom undo/redo is disabled. + * @param {boolean} visual_aid Is visual aids enabled/disabled ex: dotted lines on tables. + * @param {boolean} any_selection Is there any selection at all or is there only a cursor. + */ + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + // Select template button if parent node is a strong or b + if (node.parentNode.nodeName == "STRONG" || node.parentNode.nodeName == "B") { + tinyMCE.switchClass(editor_id + '_template', 'mceButtonSelected'); + return true; + } + + // Deselect template button + tinyMCE.switchClass(editor_id + '_template', 'mceButtonNormal'); + }, + + /** + * Gets called when a TinyMCE editor instance gets filled with content on startup. + * + * @param {string} editor_id TinyMCE editor instance id that was filled with content. + * @param {HTMLElement} body HTML body element of editor instance. + * @param {HTMLDocument} doc HTML document instance. + */ + setupContent : function(editor_id, body, doc) { + }, + + /** + * Gets called when the contents of a TinyMCE area is modified, in other words when a undo level is + * added. + * + * @param {TinyMCE_Control} inst TinyMCE editor area control instance that got modified. + */ + onChange : function(inst) { + }, + + /** + * Gets called when TinyMCE handles events such as keydown, mousedown etc. TinyMCE + * doesn't listen on all types of events so custom event handling may be required for + * some purposes. + * + * @param {Event} e HTML editor event reference. + * @return true - pass to next handler in chain, false - stop chain execution + * @type boolean + */ + handleEvent : function(e) { + // Display event type in statusbar + top.status = "template plugin event: " + e.type; + + return true; // Pass to next handler + }, + + /** + * Gets called when HTML contents is inserted or retrived from a TinyMCE editor instance. + * The type parameter contains what type of event that was performed and what format the content is in. + * Possible valuses for type is get_from_editor, insert_to_editor, get_from_editor_dom, insert_to_editor_dom. + * + * @param {string} type Cleanup event type. + * @param {mixed} content Editor contents that gets inserted/extracted can be a string or DOM element. + * @param {TinyMCE_Control} inst TinyMCE editor instance control that performes the cleanup. + * @return New content or the input content depending on action. + * @type string + */ + cleanup : function(type, content, inst) { + switch (type) { + case "get_from_editor": + alert("[FROM] Value HTML string: " + content); + + // Do custom cleanup code here + + break; + + case "insert_to_editor": + alert("[TO] Value HTML string: " + content); + + // Do custom cleanup code here + + break; + + case "get_from_editor_dom": + alert("[FROM] Value DOM Element " + content.innerHTML); + + // Do custom cleanup code here + + break; + + case "insert_to_editor_dom": + alert("[TO] Value DOM Element: " + content.innerHTML); + + // Do custom cleanup code here + + break; + } + + return content; + }, + + // Private plugin internal methods + + /** + * This is just a internal plugin method, prefix all internal methods with a _ character. + * The prefix is needed so they doesn't collide with future TinyMCE callback functions. + * + * @param {string} a Some arg1. + * @param {string} b Some arg2. + * @return Some return. + * @type string + */ + _someInternalFunction : function(a, b) { + return 1; + } +}; + +// Adds the plugin class to the list of available TinyMCE plugins +tinyMCE.addPlugin("template", TinyMCE_TemplatePlugin); diff --git a/public/javascripts/tiny_mce/plugins/_template/images/template.gif b/public/javascripts/tiny_mce/plugins/_template/images/template.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ab5da4461113d2af579898528246fdbe52ecd00 GIT binary patch literal 87 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*pGzw+SQ`#f{}FJ-?!v#V)e mtsGNfpJeCKSAiOz**>0`XR2{OVa>-G_df0vaY_ */ + +tinyMCE.addToLang('',{ +template_title : 'This is just a template popup', +template_desc : 'This is just a template button' +}); diff --git a/public/javascripts/tiny_mce/plugins/_template/popup.htm b/public/javascripts/tiny_mce/plugins/_template/popup.htm new file mode 100644 index 0000000..b07467f --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/_template/popup.htm @@ -0,0 +1,48 @@ + + + {$lang_template_title} + + + + + +
+

{$lang_template_title}

+ + +
+ The selected element name: +
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/_template/readme.txt b/public/javascripts/tiny_mce/plugins/_template/readme.txt new file mode 100644 index 0000000..2ee1505 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/_template/readme.txt @@ -0,0 +1 @@ +This is a template/tutorial plugin that where created to help you in the development of own plugins for TinyMCE. \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/advhr/css/advhr.css b/public/javascripts/tiny_mce/plugins/advhr/css/advhr.css new file mode 100755 index 0000000..7ff36bd --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advhr/css/advhr.css @@ -0,0 +1,23 @@ +input.radio { + border: 1px none #000000; + background-color: transparent; + vertical-align: middle; +} + +.panel_wrapper div.current { + height: 80px; +} + +#width { + width: 50px; + vertical-align: middle; +} + +#width2 { + width: 50px; + vertical-align: middle; +} + +#size { + width: 100px; +} diff --git a/public/javascripts/tiny_mce/plugins/advhr/editor_plugin.js b/public/javascripts/tiny_mce/plugins/advhr/editor_plugin.js new file mode 100755 index 0000000..0f77b47 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advhr/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('advhr');var TinyMCE_AdvancedHRPlugin={getInfo:function(){return{longname:'Advanced HR',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_advhr.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"advhr":return tinyMCE.getButtonHTML(cn,'lang_insert_advhr_desc','{$pluginurl}/images/advhr.gif','mceAdvancedHr')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceAdvancedHr":var template=new Array();template['file']='../../plugins/advhr/rule.htm';template['width']=250;template['height']=160;template['width']+=tinyMCE.getLang('lang_advhr_delta_width',0);template['height']+=tinyMCE.getLang('lang_advhr_delta_height',0);var size="",width="",noshade="";if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="hr"){tinyMCE.hrElement=tinyMCE.selectedElement;if(tinyMCE.hrElement){size=tinyMCE.hrElement.getAttribute('size')?tinyMCE.hrElement.getAttribute('size'):"";width=tinyMCE.hrElement.getAttribute('width')?tinyMCE.hrElement.getAttribute('width'):"";noshade=tinyMCE.hrElement.getAttribute('noshade')?tinyMCE.hrElement.getAttribute('noshade'):""}tinyMCE.openWindow(template,{editor_id:editor_id,size:size,width:width,noshade:noshade,mceDo:'update'})}else{if(tinyMCE.isMSIE){tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,'
')}else{tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",size:size,width:width,noshade:noshade,mceDo:'insert'})}}return true}return false},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;do{if(node.nodeName=="HR"){tinyMCE.switchClass(editor_id+'_advhr','mceButtonSelected');return true}}while((node=node.parentNode));tinyMCE.switchClass(editor_id+'_advhr','mceButtonNormal');return true}};tinyMCE.addPlugin("advhr",TinyMCE_AdvancedHRPlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/advhr/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/advhr/editor_plugin_src.js new file mode 100755 index 0000000..6a5987c --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advhr/editor_plugin_src.js @@ -0,0 +1,90 @@ +/** + * $Id: editor_plugin_src.js 126 2006-10-22 16:19:55Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('advhr'); + +var TinyMCE_AdvancedHRPlugin = { + getInfo : function() { + return { + longname : 'Advanced HR', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_advhr.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + } + }, + + getControlHTML : function(cn) { + switch (cn) { + case "advhr": + return tinyMCE.getButtonHTML(cn, 'lang_insert_advhr_desc', '{$pluginurl}/images/advhr.gif', 'mceAdvancedHr'); + } + + return ""; + }, + + /** + * Executes the mceAdvanceHr command. + */ + execCommand : function(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceAdvancedHr": + var template = new Array(); + + template['file'] = '../../plugins/advhr/rule.htm'; // Relative to theme + template['width'] = 250; + template['height'] = 160; + + template['width'] += tinyMCE.getLang('lang_advhr_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_advhr_delta_height', 0); + + var size = "", width = "", noshade = ""; + if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "hr") { + tinyMCE.hrElement = tinyMCE.selectedElement; + + if (tinyMCE.hrElement) { + size = tinyMCE.hrElement.getAttribute('size') ? tinyMCE.hrElement.getAttribute('size') : ""; + width = tinyMCE.hrElement.getAttribute('width') ? tinyMCE.hrElement.getAttribute('width') : ""; + noshade = tinyMCE.hrElement.getAttribute('noshade') ? tinyMCE.hrElement.getAttribute('noshade') : ""; + } + + tinyMCE.openWindow(template, {editor_id : editor_id, size : size, width : width, noshade : noshade, mceDo : 'update'}); + } else { + if (tinyMCE.isMSIE) { + tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false,'
'); + } else { + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", size : size, width : width, noshade : noshade, mceDo : 'insert'}); + } + } + + return true; + } + + // Pass to next handler in chain + return false; + }, + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + if (node == null) + return; + + do { + if (node.nodeName == "HR") { + tinyMCE.switchClass(editor_id + '_advhr', 'mceButtonSelected'); + return true; + } + } while ((node = node.parentNode)); + + tinyMCE.switchClass(editor_id + '_advhr', 'mceButtonNormal'); + + return true; + } +}; + +tinyMCE.addPlugin("advhr", TinyMCE_AdvancedHRPlugin); diff --git a/public/javascripts/tiny_mce/plugins/advhr/images/advhr.gif b/public/javascripts/tiny_mce/plugins/advhr/images/advhr.gif new file mode 100755 index 0000000000000000000000000000000000000000..e2f8658f463e2a260c22ae8affec1ece193886e3 GIT binary patch literal 153 zcwPaS0A~M3Nk%w1VH5xq0K*0VGD>2SnzBNA;8Vse6Vn)2G_{+hP(f{&eIlJZiD z@^XTb!rK0Vs`8@3@&Et;A^8LW000jFEC2ui02BZe000C=@X1N5y*TU5yZ@jS1PDT$ z1fZ?}K?R1v3{E24f>IpLLLoCp!-h*V90LY|vTz&<3Y;K;WW)lL6ibC7lt!VjcuX#v H%Mk!OxywD6 literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/advhr/jscripts/rule.js b/public/javascripts/tiny_mce/plugins/advhr/jscripts/rule.js new file mode 100755 index 0000000..ddaacd7 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advhr/jscripts/rule.js @@ -0,0 +1,43 @@ +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var formObj = document.forms[0]; + formObj.width.value = tinyMCE.getWindowArg('width'); + formObj.size.value = tinyMCE.getWindowArg('size'); + formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('mceDo'),'Insert',true); + if (tinyMCE.getWindowArg('noshade')) { + formObj.noshade.checked = true; + } + if (tinyMCE.getWindowArg('width').lastIndexOf('%')!=-1) { + formObj.width2.value = "%"; + formObj.width.value = formObj.width.value.substring(0,formObj.width.value.length-1); + } +} + +function insertHR() { + var formObj = document.forms[0]; + var width = formObj.width.value; + var size = formObj.size.value; + var html = ' + + {$lang_insert_advhr_desc} + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + +
+ + +
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/advimage/css/advimage.css b/public/javascripts/tiny_mce/plugins/advimage/css/advimage.css new file mode 100755 index 0000000..abf4405 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advimage/css/advimage.css @@ -0,0 +1,66 @@ +/* CSS file for advimage plugin popup */ + +.mceImageList { + width: 280px; +} + +.mceActionPanel { + margin-top: 7px; +} + +.alignPreview { + border: 1px solid black; + width: 140px; + height: 140px; + overflow: hidden; + padding: 5px; +} + +.checkbox { + border: 0; +} + +.panel_wrapper div.current { + height: 305px; +} + +#prev { + margin: 0; + border: 1px + solid black; + width: 99%; + height: 150px; + overflow: auto; +} + +#align, #classlist { + width: 150px; +} + +#width, #height { + vertical-align: middle; + width: 50px; + text-align: center; +} + +#vspace, #hspace, #border { + vertical-align: middle; + width: 30px; + text-align: center; +} + +#classlist { + width: 180px; +} + +input { + width: 280px; +} + +#constrain, #onmousemovecheck { + width: auto; +} + +#id, #dir, #lang, #usemap, #longdesc { + width: 200px; +} diff --git a/public/javascripts/tiny_mce/plugins/advimage/editor_plugin.js b/public/javascripts/tiny_mce/plugins/advimage/editor_plugin.js new file mode 100755 index 0000000..0edb65a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advimage/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('advimage');var TinyMCE_AdvancedImagePlugin={getInfo:function(){return{longname:'Advanced image',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_advimage.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"image":return tinyMCE.getButtonHTML(cn,'lang_image_desc','{$themeurl}/images/image.gif','mceAdvImage')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceAdvImage":var template=new Array();template['file']='../../plugins/advimage/image.htm';template['width']=480;template['height']=380;template['width']+=tinyMCE.getLang('lang_advimage_delta_width',0);template['height']+=tinyMCE.getLang('lang_advimage_delta_height',0);var inst=tinyMCE.getInstanceById(editor_id);var elm=inst.getFocusElement();if(elm!=null&&tinyMCE.getAttrib(elm,'class').indexOf('mceItem')!=-1)return true;tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true}return false},cleanup:function(type,content){switch(type){case"insert_to_editor_dom":var imgs=content.getElementsByTagName("img"),src,i;for(i=0;i + + {$lang_insert_image_title} + + + + + + + + + +
+ + +
+
+
+ {$lang_advimage_general} + + + + + + + + + + + + + + + + + + +
+ + + + +
 
 
+
+ +
+ {$lang_advimage_preview} + +
+
+ +
+
+ {$lang_advimage_tab_appearance} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ {$lang_advimage_example_img} + Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam + nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum + edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam + erat volutpat. +
+
+ x + px +
  + + + + +
+
+ +
+
+
+ +
+
+ {$lang_advimage_swap_image} + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
 
+ + + + +
 
 
+
+ +
+ {$lang_advimage_misc} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ + + + +
 
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/advimage/images/sample.gif b/public/javascripts/tiny_mce/plugins/advimage/images/sample.gif new file mode 100755 index 0000000000000000000000000000000000000000..53bf6890b507741c10910c9e2217ad8247b98e8d GIT binary patch literal 1624 zcwPZm2B-N)Nk%w1VJ!eH0OkMy|NsB}{r&v>{Q3F$`1ttq^YifV@ayaA>FMd_=H}w! z;^5%m-rnBb-QC>W+}qpR+S=OL+1c3G*w@$B*4Eb4)YQ|{)zHw=&d$%x&CScp%gV~i z$;rvc$jHXV#>B+L!^6YE!otD9!N9=4zrVk|y}i7=yt})*y1Kf#xw*Hux3;#nwY9ah zw6wFcv$C?Xv9YnRu&}SMudc4Ht*x!BtgNf6tE#H1si~={sjjD|r>3T+rKP2$q@<&x zqobp!qN1Xqp`oFnrJ$goprE6lpP!zdp`MSWoSd7Ro12@UnwpxLnw^=MnV6WE zmzS58mX?*3mz9;3mX?*2l$4W`lai8@l9G~eg|M^H&l zLpBo?51@vfgB2q_TVh*dNP<;cR$Wg!vYsMHR!qvvOis>GNH`+ zJ3B|tqgANiBSy@x>Q#;x7+DuU7&rwlf#S04)VZvA$XoUy8Y&f7)SqP<}Lw@L# zA(@Cohl`6CZyedUu^BlmK|DG5$Kl2f8z@uCc)^k-3m7$G!njf7$;XhOW>^`rV#UFh zEN#eG;bP?tCs>{+)q)ceg9$aDAaTZ{MGK5rU8ty$qz8){MT#gHGX{#XEJHLonBXFa zj+#9GE&^pq!`qG`K5iiC!gq}sRY|1yD8?j++_^oR0g+)NNtZN`)08!0q=}AA4HhIo zFaa9NYu8%97=oos5f?O`lwre~4VfoIei+FyK|urxj@C(-q(sS(!$5uL3j&jg7&XY% zlr17;3GGL;2K8>CB87G97;W(2VZ((D+3Hz;L;bylfhf(kFNV8at)h;hdM z85WX(#*Hq@@BYePt3t_l{ zCL3|YVWydA0Fz{rTl65n00)c^)^-jJn1c zRVXtA6mkUMEDLU|v7{JK&_IJ2ciiCy7BOT1fdUBh8b=yrbYaCAchCU_7?H`b1`}4q zLB|_mI2!;7W4QCq6F1O+MW||6AwmKafUrReUA&QotxQZI8D$G)AuSVV@X<&A9v;~H zKnWjo&;bljq=29aCeV-t5GBYkL=Q}q(S~FLd2t39MyRmC%_GFHkPc7CfIt8P*emqV z0YK2j9A+kmW^!tn(ZmG+L=6DZR99W}8p9?Utr=#t@rE2=zxf3QQ(JBJ&<{Z2>8EUP zeX1B)2w_3gXV)D-0Tt+=#@cV-0f!PU#MglZ3m6b}0e08zK^x;9(u?Tga{%?&nNTXhcEuM_#J>yL>p*a zuZJ2pliCGSp!Ye8>YFq@)ZOW-uT~OrjFQK!)UyVGFt7ni'); + } +} + +function convertURL(url, node, on_save) { + return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);"); +} + +function getImageSrc(str) { + var pos = -1; + + if (!str) + return ""; + + if ((pos = str.indexOf('this.src=')) != -1) { + var src = str.substring(pos + 10); + + src = src.substring(0, src.indexOf('\'')); + + if (tinyMCE.getParam('convert_urls')) + src = convertURL(src, null, true); + + return src; + } + + return ""; +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var formObj = document.forms[0]; + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var elm = inst.getFocusElement(); + var action = "insert"; + var html = ""; + + // Image list src + html = getImageListHTML('imagelistsrc','src','onSelectMainImage'); + if (html == "") + document.getElementById("imagelistsrcrow").style.display = 'none'; + else + document.getElementById("imagelistsrccontainer").innerHTML = html; + + // Image list oversrc + html = getImageListHTML('imagelistover','onmouseoversrc'); + if (html == "") + document.getElementById("imagelistoverrow").style.display = 'none'; + else + document.getElementById("imagelistovercontainer").innerHTML = html; + + // Image list outsrc + html = getImageListHTML('imagelistout','onmouseoutsrc'); + if (html == "") + document.getElementById("imagelistoutrow").style.display = 'none'; + else + document.getElementById("imagelistoutcontainer").innerHTML = html; + + // Src browser + html = getBrowserHTML('srcbrowser','src','image','advimage'); + document.getElementById("srcbrowsercontainer").innerHTML = html; + + // Over browser + html = getBrowserHTML('oversrcbrowser','onmouseoversrc','image','advimage'); + document.getElementById("onmouseoversrccontainer").innerHTML = html; + + // Out browser + html = getBrowserHTML('outsrcbrowser','onmouseoutsrc','image','advimage'); + document.getElementById("onmouseoutsrccontainer").innerHTML = html; + + // Longdesc browser + html = getBrowserHTML('longdescbrowser','longdesc','file','advimage'); + document.getElementById("longdesccontainer").innerHTML = html; + + // Resize some elements + if (isVisible('srcbrowser')) + document.getElementById('src').style.width = '260px'; + + if (isVisible('oversrcbrowser')) + document.getElementById('onmouseoversrc').style.width = '260px'; + + if (isVisible('outsrcbrowser')) + document.getElementById('onmouseoutsrc').style.width = '260px'; + + if (isVisible('longdescbrowser')) + document.getElementById('longdesc').style.width = '180px'; + + // Check action + if (elm != null && elm.nodeName == "IMG") + action = "update"; + + formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); + + if (action == "update") { + var src = tinyMCE.getAttrib(elm, 'src'); + var onmouseoversrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover'))); + var onmouseoutsrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout'))); + + src = convertURL(src, elm, true); + + // Use mce_src if found + var mceRealSrc = tinyMCE.getAttrib(elm, 'mce_src'); + if (mceRealSrc != "") { + src = mceRealSrc; + + if (tinyMCE.getParam('convert_urls')) + src = convertURL(src, elm, true); + } + + if (onmouseoversrc != "" && tinyMCE.getParam('convert_urls')) + onmouseoversrc = convertURL(onmouseoversrc, elm, true); + + if (onmouseoutsrc != "" && tinyMCE.getParam('convert_urls')) + onmouseoutsrc = convertURL(onmouseoutsrc, elm, true); + + // Setup form data + var style = tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style")); + + // Store away old size + orgImageWidth = trimSize(getStyle(elm, 'width')) + orgImageHeight = trimSize(getStyle(elm, 'height')); + + formObj.src.value = src; + formObj.alt.value = tinyMCE.getAttrib(elm, 'alt'); + formObj.title.value = tinyMCE.getAttrib(elm, 'title'); + formObj.border.value = trimSize(getStyle(elm, 'border', 'borderWidth')); + formObj.vspace.value = tinyMCE.getAttrib(elm, 'vspace'); + formObj.hspace.value = tinyMCE.getAttrib(elm, 'hspace'); + formObj.width.value = orgImageWidth; + formObj.height.value = orgImageHeight; + formObj.onmouseoversrc.value = onmouseoversrc; + formObj.onmouseoutsrc.value = onmouseoutsrc; + formObj.id.value = tinyMCE.getAttrib(elm, 'id'); + formObj.dir.value = tinyMCE.getAttrib(elm, 'dir'); + formObj.lang.value = tinyMCE.getAttrib(elm, 'lang'); + formObj.longdesc.value = tinyMCE.getAttrib(elm, 'longdesc'); + formObj.usemap.value = tinyMCE.getAttrib(elm, 'usemap'); + formObj.style.value = tinyMCE.serializeStyle(style); + + // Select by the values + if (tinyMCE.isMSIE) + selectByValue(formObj, 'align', getStyle(elm, 'align', 'styleFloat')); + else + selectByValue(formObj, 'align', getStyle(elm, 'align', 'cssFloat')); + + addClassesToList('classlist', 'advimage_styles'); + + selectByValue(formObj, 'classlist', tinyMCE.getAttrib(elm, 'class')); + selectByValue(formObj, 'imagelistsrc', src); + selectByValue(formObj, 'imagelistover', onmouseoversrc); + selectByValue(formObj, 'imagelistout', onmouseoutsrc); + + updateStyle(); + showPreviewImage(src, true); + changeAppearance(); + + window.focus(); + } else + addClassesToList('classlist', 'advimage_styles'); + + // If option enabled default contrain proportions to checked + if (tinyMCE.getParam("advimage_constrain_proportions", true)) + formObj.constrain.checked = true; + + // Check swap image if valid data + if (formObj.onmouseoversrc.value != "" || formObj.onmouseoutsrc.value != "") + setSwapImageDisabled(false); + else + setSwapImageDisabled(true); +} + +function setSwapImageDisabled(state) { + var formObj = document.forms[0]; + + formObj.onmousemovecheck.checked = !state; + + setBrowserDisabled('overbrowser', state); + setBrowserDisabled('outbrowser', state); + + if (formObj.imagelistover) + formObj.imagelistover.disabled = state; + + if (formObj.imagelistout) + formObj.imagelistout.disabled = state; + + formObj.onmouseoversrc.disabled = state; + formObj.onmouseoutsrc.disabled = state; +} + +function setAttrib(elm, attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib]; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + if (value != "") { + elm.setAttribute(attrib, value); + + if (attrib == "style") + attrib = "style.cssText"; + + if (attrib == "longdesc") + attrib = "longDesc"; + + if (attrib == "width") { + attrib = "style.width"; + value = value + "px"; + } + + if (attrib == "height") { + attrib = "style.height"; + value = value + "px"; + } + + if (attrib == "class") + attrib = "className"; + + eval('elm.' + attrib + "=value;"); + } else + elm.removeAttribute(attrib); +} + +function makeAttrib(attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib]; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + if (value == "") + return ""; + + // XML encode it + value = value.replace(/&/g, '&'); + value = value.replace(/\"/g, '"'); + value = value.replace(//g, '>'); + + return ' ' + attrib + '="' + value + '"'; +} + +function insertAction() { + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var elm = inst.getFocusElement(); + var formObj = document.forms[0]; + var src = formObj.src.value; + var onmouseoversrc = formObj.onmouseoversrc.value; + var onmouseoutsrc = formObj.onmouseoutsrc.value; + + if (!AutoValidator.validate(formObj)) { + alert(tinyMCE.getLang('lang_invalid_data')); + return false; + } + + if (tinyMCE.getParam("accessibility_warnings")) { + if (formObj.alt.value == "") { + var answer = confirm(tinyMCE.getLang('lang_advimage_missing_alt', '', true)); + if (answer == true) { + formObj.alt.value = " "; + } + } else { + var answer = true; + } + + if (!answer) + return; + } + + if (onmouseoversrc && onmouseoversrc != "") + onmouseoversrc = "this.src='" + convertURL(onmouseoversrc, tinyMCE.imgElement) + "';"; + + if (onmouseoutsrc && onmouseoutsrc != "") + onmouseoutsrc = "this.src='" + convertURL(onmouseoutsrc, tinyMCE.imgElement) + "';"; + + if (elm != null && elm.nodeName == "IMG") { + setAttrib(elm, 'src', convertURL(src, tinyMCE.imgElement)); + setAttrib(elm, 'mce_src', src); + setAttrib(elm, 'alt'); + setAttrib(elm, 'title'); + setAttrib(elm, 'border'); + setAttrib(elm, 'vspace'); + setAttrib(elm, 'hspace'); + setAttrib(elm, 'width'); + setAttrib(elm, 'height'); + setAttrib(elm, 'onmouseover', onmouseoversrc); + setAttrib(elm, 'onmouseout', onmouseoutsrc); + setAttrib(elm, 'id'); + setAttrib(elm, 'dir'); + setAttrib(elm, 'lang'); + setAttrib(elm, 'longdesc'); + setAttrib(elm, 'usemap'); + setAttrib(elm, 'style'); + setAttrib(elm, 'class', getSelectValue(formObj, 'classlist')); + setAttrib(elm, 'align', getSelectValue(formObj, 'align')); + + //tinyMCEPopup.execCommand("mceRepaint"); + + // Repaint if dimensions changed + if (formObj.width.value != orgImageWidth || formObj.height.value != orgImageHeight) + inst.repaint(); + + // Refresh in old MSIE + if (tinyMCE.isMSIE5) + elm.outerHTML = elm.outerHTML; + } else { + var html = "' + + getImageData(src); +} + +function getImageData(src) { + preloadImg = new Image(); + + tinyMCE.addEvent(preloadImg, "load", updateImageData); + tinyMCE.addEvent(preloadImg, "error", resetImageData); + + preloadImg.src = src; +} + +function updateImageData() { + var formObj = document.forms[0]; + + if (formObj.width.value == "") + formObj.width.value = preloadImg.width; + + if (formObj.height.value == "") + formObj.height.value = preloadImg.height; + + updateStyle(); +} + +function resetImageData() { + var formObj = document.forms[0]; + formObj.width.value = formObj.height.value = ""; +} + +function getSelectValue(form_obj, field_name) { + var elm = form_obj.elements[field_name]; + + if (elm == null || elm.options == null) + return ""; + + return elm.options[elm.selectedIndex].value; +} + +function getImageListHTML(elm_id, target_form_element, onchange_func) { + if (typeof(tinyMCEImageList) == "undefined" || tinyMCEImageList.length == 0) + return ""; + + var html = ""; + + html += ''; + + return html; + + // tinyMCE.debug('-- image list start --', html, '-- image list end --'); +} + +// While loading +preinit(); diff --git a/public/javascripts/tiny_mce/plugins/advimage/langs/en.js b/public/javascripts/tiny_mce/plugins/advimage/langs/en.js new file mode 100755 index 0000000..ffd7e30 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advimage/langs/en.js @@ -0,0 +1,27 @@ +// UK lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'General', +tab_appearance : 'Appearance', +tab_advanced : 'Advanced', +general : 'General', +title : 'Title', +preview : 'Preview', +constrain_proportions : 'Constrain proportions', +langdir : 'Language direction', +langcode : 'Language code', +long_desc : 'Long description link', +style : 'Style', +classes : 'Classes', +ltr : 'Left to right', +rtl : 'Right to left', +id : 'Id', +image_map : 'Image map', +swap_image : 'Swap image', +alt_image : 'Alternative image', +mouseover : 'for mouse over', +mouseout : 'for mouse out', +misc : 'Miscellaneous', +example_img : 'Appearance preview image', +missing_alt : 'Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.' +}); diff --git a/public/javascripts/tiny_mce/plugins/advimage/readme.txt b/public/javascripts/tiny_mce/plugins/advimage/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advimage/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/advlink/css/advlink.css b/public/javascripts/tiny_mce/plugins/advlink/css/advlink.css new file mode 100755 index 0000000..0cb37bd --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advlink/css/advlink.css @@ -0,0 +1,35 @@ +/* CSS file for advimage plugin popup */ + +.mceLinkList, .mceAnchorList, #targetlist { + width: 280px; +} + +.mceActionPanel { + margin-top: 7px; +} + +.panel_wrapper div.current { + height: 320px; +} + +#classlist, #title, #href { + width: 280px; +} + +#popupurl, #popupname { + width: 200px; +} + +#popupwidth, #popupheight, #popupleft, #popuptop { + width: 30px; + vertical-align: middle; + text-align: center; +} + +#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey { + width: 200px; +} + +#events_panel input { + width: 200px; +} diff --git a/public/javascripts/tiny_mce/plugins/advlink/editor_plugin.js b/public/javascripts/tiny_mce/plugins/advlink/editor_plugin.js new file mode 100755 index 0000000..8092d1c --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advlink/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('advlink');var TinyMCE_AdvancedLinkPlugin={getInfo:function(){return{longname:'Advanced link',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_advlink.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){inst.addShortcut('ctrl','k','lang_advlink_desc','mceAdvLink')},getControlHTML:function(cn){switch(cn){case"link":return tinyMCE.getButtonHTML(cn,'lang_link_desc','{$themeurl}/images/link.gif','mceAdvLink')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceAdvLink":var anySelection=false;var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();var selectedText=inst.selection.getSelectedText();if(tinyMCE.selectedElement)anySelection=(tinyMCE.selectedElement.nodeName.toLowerCase()=="img")||(selectedText&&selectedText.length>0);if(anySelection||(focusElm!=null&&focusElm.nodeName=="A")){var template=new Array();template['file']='../../plugins/advlink/link.htm';template['width']=480;template['height']=400;template['width']+=tinyMCE.getLang('lang_advlink_delta_width',0);template['height']+=tinyMCE.getLang('lang_advlink_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"})}return true}return false},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;do{if(node.nodeName=="A"&&tinyMCE.getAttrib(node,'href')!=""){tinyMCE.switchClass(editor_id+'_advlink','mceButtonSelected');return true}}while((node=node.parentNode));if(any_selection){tinyMCE.switchClass(editor_id+'_advlink','mceButtonNormal');return true}tinyMCE.switchClass(editor_id+'_advlink','mceButtonDisabled');return true}};tinyMCE.addPlugin("advlink",TinyMCE_AdvancedLinkPlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/advlink/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/advlink/editor_plugin_src.js new file mode 100755 index 0000000..7700f34 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advlink/editor_plugin_src.js @@ -0,0 +1,88 @@ +/** + * $Id: editor_plugin_src.js 126 2006-10-22 16:19:55Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('advlink'); + +var TinyMCE_AdvancedLinkPlugin = { + getInfo : function() { + return { + longname : 'Advanced link', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_advlink.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + initInstance : function(inst) { + inst.addShortcut('ctrl', 'k', 'lang_advlink_desc', 'mceAdvLink'); + }, + + getControlHTML : function(cn) { + switch (cn) { + case "link": + return tinyMCE.getButtonHTML(cn, 'lang_link_desc', '{$themeurl}/images/link.gif', 'mceAdvLink'); + } + + return ""; + }, + + execCommand : function(editor_id, element, command, user_interface, value) { + switch (command) { + case "mceAdvLink": + var anySelection = false; + var inst = tinyMCE.getInstanceById(editor_id); + var focusElm = inst.getFocusElement(); + var selectedText = inst.selection.getSelectedText(); + + if (tinyMCE.selectedElement) + anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (selectedText && selectedText.length > 0); + + if (anySelection || (focusElm != null && focusElm.nodeName == "A")) { + var template = new Array(); + + template['file'] = '../../plugins/advlink/link.htm'; + template['width'] = 480; + template['height'] = 400; + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_advlink_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_advlink_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + } + + return true; + } + + return false; + }, + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + if (node == null) + return; + + do { + if (node.nodeName == "A" && tinyMCE.getAttrib(node, 'href') != "") { + tinyMCE.switchClass(editor_id + '_advlink', 'mceButtonSelected'); + return true; + } + } while ((node = node.parentNode)); + + if (any_selection) { + tinyMCE.switchClass(editor_id + '_advlink', 'mceButtonNormal'); + return true; + } + + tinyMCE.switchClass(editor_id + '_advlink', 'mceButtonDisabled'); + + return true; + } +}; + +tinyMCE.addPlugin("advlink", TinyMCE_AdvancedLinkPlugin); diff --git a/public/javascripts/tiny_mce/plugins/advlink/jscripts/functions.js b/public/javascripts/tiny_mce/plugins/advlink/jscripts/functions.js new file mode 100755 index 0000000..58a2c9e --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advlink/jscripts/functions.js @@ -0,0 +1,568 @@ +/* Functions for the advlink plugin popup */ + +var templates = { + "window.open" : "window.open('${url}','${target}','${options}')" +}; + +function preinit() { + // Initialize + tinyMCE.setWindowArg('mce_windowresize', false); + + // Import external list url javascript + var url = tinyMCE.getParam("external_link_list_url"); + if (url != null) { + // Fix relative + if (url.charAt(0) != '/' && url.indexOf('://') == -1) + url = tinyMCE.documentBasePath + "/" + url; + + document.write(''); + } +} + +function changeClass() { + var formObj = document.forms[0]; + formObj.classes.value = getSelectValue(formObj, 'classlist'); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var formObj = document.forms[0]; + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var elm = inst.getFocusElement(); + var action = "insert"; + var html; + + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink'); + document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink'); + document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href'); + document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href'); + document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target'); + + // Link list + html = getLinkListHTML('linklisthref','href'); + if (html == "") + document.getElementById("linklisthrefrow").style.display = 'none'; + else + document.getElementById("linklisthrefcontainer").innerHTML = html; + + // Resize some elements + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '260px'; + + if (isVisible('popupurlbrowser')) + document.getElementById('popupurl').style.width = '180px'; + + elm = tinyMCE.getParentElement(elm, "a"); + if (elm != null && elm.nodeName == "A") + action = "update"; + + formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); + + setPopupControlsDisabled(true); + + if (action == "update") { + var href = tinyMCE.getAttrib(elm, 'href'); + + href = convertURL(href, elm, true); + + // Use mce_href if found + var mceRealHref = tinyMCE.getAttrib(elm, 'mce_href'); + if (mceRealHref != "") { + href = mceRealHref; + + if (tinyMCE.getParam('convert_urls')) + href = convertURL(href, elm, true); + } + + var onclick = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onclick')); + + // Setup form data + setFormValue('href', href); + setFormValue('title', tinyMCE.getAttrib(elm, 'title')); + setFormValue('id', tinyMCE.getAttrib(elm, 'id')); + setFormValue('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style")))); + setFormValue('rel', tinyMCE.getAttrib(elm, 'rel')); + setFormValue('rev', tinyMCE.getAttrib(elm, 'rev')); + setFormValue('charset', tinyMCE.getAttrib(elm, 'charset')); + setFormValue('hreflang', tinyMCE.getAttrib(elm, 'hreflang')); + setFormValue('dir', tinyMCE.getAttrib(elm, 'dir')); + setFormValue('lang', tinyMCE.getAttrib(elm, 'lang')); + setFormValue('tabindex', tinyMCE.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); + setFormValue('accesskey', tinyMCE.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); + setFormValue('type', tinyMCE.getAttrib(elm, 'type')); + setFormValue('onfocus', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onfocus'))); + setFormValue('onblur', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onblur'))); + setFormValue('onclick', onclick); + setFormValue('ondblclick', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'ondblclick'))); + setFormValue('onmousedown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousedown'))); + setFormValue('onmouseup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseup'))); + setFormValue('onmouseover', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover'))); + setFormValue('onmousemove', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousemove'))); + setFormValue('onmouseout', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout'))); + setFormValue('onkeypress', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeypress'))); + setFormValue('onkeydown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeydown'))); + setFormValue('onkeyup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeyup'))); + setFormValue('target', tinyMCE.getAttrib(elm, 'target')); + setFormValue('classes', tinyMCE.getAttrib(elm, 'class')); + + // Parse onclick data + if (onclick != null && onclick.indexOf('window.open') != -1) + parseWindowOpen(onclick); + else + parseFunction(onclick); + + // Select by the values + selectByValue(formObj, 'dir', tinyMCE.getAttrib(elm, 'dir')); + selectByValue(formObj, 'rel', tinyMCE.getAttrib(elm, 'rel')); + selectByValue(formObj, 'rev', tinyMCE.getAttrib(elm, 'rev')); + selectByValue(formObj, 'linklisthref', href); + + if (href.charAt(0) == '#') + selectByValue(formObj, 'anchorlist', href); + + addClassesToList('classlist', 'advlink_styles'); + + selectByValue(formObj, 'classlist', tinyMCE.getAttrib(elm, 'class'), true); + selectByValue(formObj, 'targetlist', tinyMCE.getAttrib(elm, 'target'), true); + } else + addClassesToList('classlist', 'advlink_styles'); + + window.focus(); +} + +function setFormValue(name, value) { + document.forms[0].elements[name].value = value; +} + +function convertURL(url, node, on_save) { + return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);"); +} + +function parseWindowOpen(onclick) { + var formObj = document.forms[0]; + + // Preprocess center code + if (onclick.indexOf('return false;') != -1) { + formObj.popupreturn.checked = true; + onclick = onclick.replace('return false;', ''); + } else + formObj.popupreturn.checked = false; + + var onClickData = parseLink(onclick); + + if (onClickData != null) { + formObj.ispopup.checked = true; + setPopupControlsDisabled(false); + + var onClickWindowOptions = parseOptions(onClickData['options']); + var url = onClickData['url']; + + if (tinyMCE.getParam('convert_urls')) + url = convertURL(url, null, true); + + formObj.popupname.value = onClickData['target']; + formObj.popupurl.value = url; + formObj.popupwidth.value = getOption(onClickWindowOptions, 'width'); + formObj.popupheight.value = getOption(onClickWindowOptions, 'height'); + + formObj.popupleft.value = getOption(onClickWindowOptions, 'left'); + formObj.popuptop.value = getOption(onClickWindowOptions, 'top'); + + if (formObj.popupleft.value.indexOf('screen') != -1) + formObj.popupleft.value = "c"; + + if (formObj.popuptop.value.indexOf('screen') != -1) + formObj.popuptop.value = "c"; + + formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes"; + formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes"; + formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes"; + formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes"; + formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes"; + formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes"; + formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes"; + + buildOnClick(); + } +} + +function parseFunction(onclick) { + var formObj = document.forms[0]; + var onClickData = parseLink(onclick); + + // TODO: Add stuff here +} + +function getOption(opts, name) { + return typeof(opts[name]) == "undefined" ? "" : opts[name]; +} + +function setPopupControlsDisabled(state) { + var formObj = document.forms[0]; + + formObj.popupname.disabled = state; + formObj.popupurl.disabled = state; + formObj.popupwidth.disabled = state; + formObj.popupheight.disabled = state; + formObj.popupleft.disabled = state; + formObj.popuptop.disabled = state; + formObj.popuplocation.disabled = state; + formObj.popupscrollbars.disabled = state; + formObj.popupmenubar.disabled = state; + formObj.popupresizable.disabled = state; + formObj.popuptoolbar.disabled = state; + formObj.popupstatus.disabled = state; + formObj.popupreturn.disabled = state; + formObj.popupdependent.disabled = state; + + setBrowserDisabled('popupurlbrowser', state); +} + +function parseLink(link) { + link = link.replace(new RegExp(''', 'g'), "'"); + + var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1"); + + // Is function name a template function + var template = templates[fnName]; + if (template) { + // Build regexp + var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi")); + var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\("; + var replaceStr = ""; + for (var i=0; i'); + for (var i=0; i'; + html += ''; + + for (var i=0; i' + name + ''; + } + + html += ''; + + return html; +} + +function insertAction() { + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var elm = inst.getFocusElement(); + + elm = tinyMCE.getParentElement(elm, "a"); + + tinyMCEPopup.execCommand("mceBeginUndoLevel"); + + // Create new anchor elements + if (elm == null) { + if (tinyMCE.isSafari) + tinyMCEPopup.execCommand("mceInsertContent", false, '' + inst.selection.getSelectedHTML() + ''); + else + tinyMCEPopup.execCommand("createlink", false, "#mce_temp_url#"); + + var elementArray = tinyMCE.getElementsByAttributeValue(inst.getBody(), "a", "href", "#mce_temp_url#"); + for (var i=0; i' + tinyMCELinkList[i][0] + ''; + + html += ''; + + return html; + + // tinyMCE.debug('-- image list start --', html, '-- image list end --'); +} + +function getTargetListHTML(elm_id, target_form_element) { + var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';'); + var html = ''; + + html += ''; + + return html; +} + +// While loading +preinit(); diff --git a/public/javascripts/tiny_mce/plugins/advlink/langs/en.js b/public/javascripts/tiny_mce/plugins/advlink/langs/en.js new file mode 100755 index 0000000..0e68e5a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advlink/langs/en.js @@ -0,0 +1,46 @@ +// UK lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'General', +popup_tab : 'Popup', +events_tab : 'Events', +advanced_tab : 'Advanced', +general_props : 'General properties', +popup_props : 'Popup properties', +event_props : 'Events', +advanced_props : 'Advanced properties', +popup_opts : 'Options', +anchor_names : 'Anchors', +target_same : 'Open in this window / frame', +target_parent : 'Open in parent window / frame', +target_top : 'Open in top frame (replaces all frames)', +target_blank : 'Open in new window', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'Window name', +popup_return : 'Insert \'return false\'', +popup_scrollbars : 'Show scrollbars', +popup_statusbar : 'Show status bar', +popup_toolbar : 'Show toolbars', +popup_menubar : 'Show menu bar', +popup_location : 'Show location bar', +popup_resizable : 'Make window resizable', +popup_dependent : 'Dependent (Mozilla/Firefox only)', +popup_size : 'Size', +popup_position : 'Position (X/Y)', +id : 'Id', +style: 'Style', +classes : 'Classes', +target_name : 'Target name', +langdir : 'Language direction', +target_langcode : 'Target language', +langcode : 'Language code', +encoding : 'Target character encoding', +mime : 'Target MIME type', +rel : 'Relationship page to target', +rev : 'Relationship target to page', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Left to right', +rtl : 'Right to left' +}); diff --git a/public/javascripts/tiny_mce/plugins/advlink/link.htm b/public/javascripts/tiny_mce/plugins/advlink/link.htm new file mode 100755 index 0000000..fa97b73 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advlink/link.htm @@ -0,0 +1,337 @@ + + + {$lang_insert_link_title} + + + + + + + + +
+ + +
+
+
+ {$lang_advlink_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
 
 
 
+ +
+
+
+ + + +
+
+ {$lang_advlink_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+ +
+
+ {$lang_advlink_event_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/advlink/readme.txt b/public/javascripts/tiny_mce/plugins/advlink/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/advlink/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/autosave/editor_plugin.js b/public/javascripts/tiny_mce/plugins/autosave/editor_plugin.js new file mode 100755 index 0000000..439e23a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/autosave/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('autosave');var TinyMCE_AutoSavePlugin={getInfo:function(){return{longname:'Auto save',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_autosave.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},_beforeUnloadHandler:function(){var n,inst,anyDirty=false,msg=tinyMCE.getLang("lang_autosave_unload_msg");if(tinyMCE.getParam("fullscreen_is_enabled"))return;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.isDirty())return msg}return}};window.onbeforeunload=TinyMCE_AutoSavePlugin._beforeUnloadHandler;tinyMCE.addPlugin("autosave",TinyMCE_AutoSavePlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/autosave/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/autosave/editor_plugin_src.js new file mode 100755 index 0000000..68563f9 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/autosave/editor_plugin_src.js @@ -0,0 +1,46 @@ +/** + * $Id: editor_plugin_src.js 126 2006-10-22 16:19:55Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('autosave'); + +var TinyMCE_AutoSavePlugin = { + getInfo : function() { + return { + longname : 'Auto save', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_autosave.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + // Private plugin internal methods + + _beforeUnloadHandler : function() { + var n, inst, anyDirty = false, msg = tinyMCE.getLang("lang_autosave_unload_msg"); + + if (tinyMCE.getParam("fullscreen_is_enabled")) + return; + + for (n in tinyMCE.instances) { + inst = tinyMCE.instances[n]; + + if (!tinyMCE.isInstance(inst)) + continue; + + if (inst.isDirty()) + return msg; + } + + return; + } +}; + +window.onbeforeunload = TinyMCE_AutoSavePlugin._beforeUnloadHandler; + +tinyMCE.addPlugin("autosave", TinyMCE_AutoSavePlugin); diff --git a/public/javascripts/tiny_mce/plugins/autosave/langs/en.js b/public/javascripts/tiny_mce/plugins/autosave/langs/en.js new file mode 100755 index 0000000..0195133 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/autosave/langs/en.js @@ -0,0 +1,5 @@ +// EN lang variables + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'The changes you made will be lost if you navigate away from this page.' +}); diff --git a/public/javascripts/tiny_mce/plugins/autosave/readme.txt b/public/javascripts/tiny_mce/plugins/autosave/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/autosave/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/blockquote/editor_plugin.js b/public/javascripts/tiny_mce/plugins/blockquote/editor_plugin.js new file mode 100755 index 0000000..3b86673 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/blockquote/editor_plugin.js @@ -0,0 +1,95 @@ +/** + * Blockquote plugin + * + * Some code is based on the Heading plugin by Andrey G and ggoodd. + * + * @author Bit Santos + * @copyright Copyright © 2006, Bit Santos, All rights reserved. + */ + +tinyMCE.importPluginLanguagePack('blockquote', 'en'); +var TinyMCE_BlockquotePlugin = { + + getInfo : function() { + return { + longname : 'Blockquote plugin', + author : 'Bit Santos', + authorurl : 'http://bitdesigns.net/', + infourl : 'mailto:bit@bitdesigns.net', + version : '0.2' + }; + }, + + initInstance : function(inst) { + inst.addShortcut('alt', 'q', 'lang_blockquote_desc', 'mceBlockquote', false, 1); + }, + + getControlHTML : function(cn) { + switch (cn) { + case "blockquote": return tinyMCE.getButtonHTML(cn, 'lang_blockquote_desc', '{$pluginurl}/images/quote.gif', 'mceBlockquote', false, 1); + } + + return ''; + }, + + + execCommand : function(editor_id, element, command, user_interface, value) { + switch (command) { + case "mceBlockquote": { + var ct = tinyMCE.getParam("blockquote_clear_tag", false) ? tinyMCE.getParam("blockquote_clear_tag","") : "p"; + + var currentNode = tinyMCE.selectedElement; + + // alert("Selected node: " + currentNode.nodeName.toLowerCase()); + + var n = currentNode; + while(n.nodeName.toLowerCase() != 'body') { + if(n.nodeName.toLowerCase() == 'blockquote') { + break; + } + n = n.parentNode; + } + + if(n.nodeName.toLowerCase() != 'body') { + if(currentNode == n) { + //alert("I am a blockquote."); + onlyChild = (currentNode.childNodes.length == 1); + + tinyMCE.execInstanceCommand(editor_id, 'mceRemoveNode', false); + + if(onlyChild) + tinyMCE.execInstanceCommand(editor_id, 'FormatBlock', false, "<"+ct+">"); + }else { + //alert("My parent is a blockquote."); + + var blockquote = n; + var parent = blockquote.parentNode; + + for(var i = 0; i < blockquote.childNodes.length; i++) { + // alert("Child #" + i + ": " + blockquote.childNodes[i].nodeName); + parent.insertBefore(blockquote.childNodes[i].cloneNode(true), blockquote); + } + parent.removeChild(blockquote); + } + }else { + tinyMCE.execInstanceCommand(editor_id, 'FormatBlock', false, "
"); + } + + return true; + } + } + return false; + }, + + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + if (node == null) + return; + + tinyMCE.switchClass(editor_id + '_blockquote', tinyMCE.getParentElement(node, "blockquote") ? 'mceButtonSelected' : 'mceButtonNormal'); + + return true; + } +}; + +tinyMCE.addPlugin("blockquote", TinyMCE_BlockquotePlugin); diff --git a/public/javascripts/tiny_mce/plugins/blockquote/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/blockquote/editor_plugin_src.js new file mode 100644 index 0000000..a826e4a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/blockquote/editor_plugin_src.js @@ -0,0 +1,95 @@ +/** + * Blockquote plugin + * + * Some code is based on the Heading plugin by Andrey G and ggoodd. + * + * @author Bit Santos + * @copyright Copyright © 2006, Bit Santos, All rights reserved. + */ + +tinyMCE.importPluginLanguagePack('blockquote', 'en'); +var TinyMCE_BlockquotePlugin = { + + getInfo : function() { + return { + longname : 'Blockquote plugin', + author : 'Bit Santos', + authorurl : 'http://bitdesigns.net/', + infourl : 'mailto:bit@bitdesigns.net', + version : '0.2' + }; + }, + + initInstance : function(inst) { + inst.addShortcut('alt', 'q', 'lang_blockquote_desc', 'mceBlockquote', false, 1); + }, + + getControlHTML : function(cn) { + switch (cn) { + case "blockquote": return tinyMCE.getButtonHTML(cn, 'lang_blockquote_desc', '{$pluginurl}/images/quote.gif', 'mceBlockquote', false, 1); + } + + return ''; + }, + + + execCommand : function(editor_id, element, command, user_interface, value) { + switch (command) { + case "mceBlockquote": { + var ct = tinyMCE.getParam("blockquote_clear_tag", false) ? tinyMCE.getParam("blockquote_clear_tag","") : "p"; + + var currentNode = tinyMCE.selectedElement; + + // alert("Selected node: " + currentNode.nodeName.toLowerCase()); + + var n = currentNode; + while(n.nodeName.toLowerCase() != 'body') { + if(n.nodeName.toLowerCase() == 'blockquote') { + break; + } + n = n.parentNode; + } + + if(n.nodeName.toLowerCase() != 'body') { + if(currentNode == n) { + //alert("I am a blockquote."); + onlyChild = (currentNode.childNodes.length == 1); + + tinyMCE.execInstanceCommand(editor_id, 'mceRemoveNode', false); + + if(onlyChild) + tinyMCE.execInstanceCommand(editor_id, 'FormatBlock', false, "<"+ct+">"); + }else { + //alert("My parent is a blockquote."); + + var blockquote = n; + var parent = blockquote.parentNode; + + for(var i = 0; i < blockquote.childNodes.length; i++) { + // alert("Child #" + i + ": " + blockquote.childNodes[i].nodeName); + parent.insertBefore(blockquote.childNodes[i].cloneNode(true), blockquote); + } + parent.removeChild(blockquote); + } + }else { + tinyMCE.execInstanceCommand(editor_id, 'FormatBlock', false, "
"); + } + + return true; + } + } + return false; + }, + + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + if (node == null) + return; + + tinyMCE.switchClass(editor_id + '_blockquote', tinyMCE.getParentElement(node, "blockquote") ? 'mceButtonSelected' : 'mceButtonNormal'); + + return true; + } +}; + +tinyMCE.addPlugin("blockquote", TinyMCE_BlockquotePlugin); diff --git a/public/javascripts/tiny_mce/plugins/blockquote/images/quote.gif b/public/javascripts/tiny_mce/plugins/blockquote/images/quote.gif new file mode 100755 index 0000000000000000000000000000000000000000..3ead23070f5f401a6c8ee2c035852dbad99094ea GIT binary patch literal 159 zcwPaY0AT+|Nk%w1VH5xq0J9DNs;a7ph=?L0BFxOpGcz+)RaJL)cSJ-)-QC@pnVGx0 zyYBAp5fKpp00960{{R30A^8LW000gEEC2ui02BZe000C`(8)=wy*TU5yZ@lI9DoA| z)6z6R&@fa%EDK|#Yx`16;v}#NqXY;#R0BtVP(d^lN|Z#^7`Tj%0tz9xO;^_4l#m1* NLg=)5&2CR306U}JJUIXW literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/blockquote/langs/en.js b/public/javascripts/tiny_mce/plugins/blockquote/langs/en.js new file mode 100755 index 0000000..6406eba --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/blockquote/langs/en.js @@ -0,0 +1,3 @@ +tinyMCE.addToLang('',{ +blockquote_desc : 'Blockquote' +}); diff --git a/public/javascripts/tiny_mce/plugins/blockquote/readme.txt b/public/javascripts/tiny_mce/plugins/blockquote/readme.txt new file mode 100755 index 0000000..6514aa5 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/blockquote/readme.txt @@ -0,0 +1,65 @@ +Blockquote Plugin +============================================================ + +This adds a blockquote button to tinyMCE. +Developed by Bit Santos + +Instead of using the indent/outdent buttons to insert +content into blockquote tags, IMHO, it's a much better idea +to have a dedicated button for it. + +Click it once, and it adds the selected block/s of content +into a blockquote tag. Click it again and the selected +block/s are removed from the blockquote tag. + + + +Version History +------------------------------------------------------------ + +0.2 + - Can apply blockquote tags to multiple block-level + elements. + - Will apply the paragraph tag when the blockquote tag + is removed and the remaining content doesn't have a + parent block-level element. + - Much better support for nested tags. + +0.1 (not released) + - Apply blockquote tags to content, one block-level + element at a time. + - Could not properly handle content nested tags, including + lists. + + + +Plugin-specific Parameters +------------------------------------------------------------ + +blockquote_clear_tag : + (optional) the HTML tag to be applied when the + blockquote tag is removed and the remaining content does + not have a block-level parent. Defaults to 'p'. + + + +Installation +------------------------------------------------------------ + +1. Copy the blockquote directory to the tinyMCE plugins + directory. +2. Add 'blockquote' to the plugin list. +3. Add 'blockquote' to the button list. + + + +Sample initialization +------------------------------------------------------------ + +tinyMCE.init({ + theme : "advanced", + mode : "textareas", + plugins : "blockquote", + blockquote_clear_tag : "p", + theme_advanced_buttons1_add : "blockquote", +}); diff --git a/public/javascripts/tiny_mce/plugins/cleanup/editor_plugin.js b/public/javascripts/tiny_mce/plugins/cleanup/editor_plugin.js new file mode 100755 index 0000000..e69de29 diff --git a/public/javascripts/tiny_mce/plugins/cleanup/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/cleanup/editor_plugin_src.js new file mode 100755 index 0000000..c672a6e --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/cleanup/editor_plugin_src.js @@ -0,0 +1,10 @@ +/** + * $Id: editor_plugin_src.js 18 2006-06-29 14:11:23Z spocke $ + * + * Experimental plugin for new Cleanup routine, this logic will be moved into the core ones it's stable enougth. + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Dummy file since cleanup is now moved to core */ diff --git a/public/javascripts/tiny_mce/plugins/cleanup/readme.txt b/public/javascripts/tiny_mce/plugins/cleanup/readme.txt new file mode 100755 index 0000000..d1a6466 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/cleanup/readme.txt @@ -0,0 +1 @@ +Dummy plugin since cleanup is now moved into core. diff --git a/public/javascripts/tiny_mce/plugins/codeblock/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/codeblock/editor_plugin_src.js new file mode 100644 index 0000000..65b4b77 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/codeblock/editor_plugin_src.js @@ -0,0 +1,98 @@ +/** + * Codeblock plugin + * + * Some code is based on the Heading plugin by Andrey G and ggoodd. + * Base code stolen from Bit Santos blockquote plugin. + * + * @author Blake Watters + * @copyright Copyright © 2006, Blake Watters, All rights reserved. + */ + +tinyMCE.importPluginLanguagePack('codeblock', 'en'); +var TinyMCE_CodeblockPlugin = { + + getInfo : function() { + return { + longname : 'Codeblock plugin', + author : 'Blake Watters', + authorurl : 'http://thatswhatimtalkingabout.org/', + infourl : 'mailto:blake@near-time.com', + version : '0.1' + }; + }, + + initInstance : function(inst) { + inst.addShortcut('alt', '|', 'lang_codeblock_desc', 'mceCodeblock', false, 1); + }, + + getControlHTML : function(cn) { + switch (cn) { + case "codeblock": return tinyMCE.getButtonHTML(cn, 'lang_codeblock_desc', '{$pluginurl}/images/code.gif', 'mceCodeblock', false, 1); + } + + return ''; + }, + + + execCommand : function(editor_id, element, command, user_interface, value) { + switch (command) { + case "mceCodeblock": { + //debugger; + var currentNode = tinyMCE.selectedElement; + + // alert("Selected node: " + currentNode.nodeName.toLowerCase()); + + var n = currentNode; + while(n.nodeName.toLowerCase() != 'body') { + if(n.nodeName.toLowerCase() == 'pre') { + break; + } + n = n.parentNode; + } + + if(n.nodeName.toLowerCase() != 'body') { + if(currentNode == n) { + //alert("I am a codeblock."); + onlyChild = (currentNode.childNodes.length == 1); + + tinyMCE.execInstanceCommand(editor_id, 'mceRemoveNode', false); + + if(onlyChild){ + tinyMCE.execInstanceCommand(editor_id, 'FormatBlock', false, "
");
+														tinyMCE.execInstanceCommand(editor_id, 'FormatBlock', false, "");
+												}
+                    }else {
+                        //alert("My parent is a codeblock.");
+                    
+                        var codeblock = n;
+                        var parent = codeblock.parentNode;
+
+                        for(var i = 0; i < codeblock.childNodes.length; i++) {
+                            // alert("Child #" + i + ": " + codeblock.childNodes[i].nodeName);
+                            parent.insertBefore(codeblock.childNodes[i].cloneNode(true), codeblock);
+                        }
+                        parent.removeChild(codeblock);
+                    }
+                }else {
+                    tinyMCE.execInstanceCommand(editor_id, 'FormatBlock', false, "");
+										tinyMCE.execInstanceCommand(editor_id, 'FormatBlock', false, "
");
+                }
+
+                return true;
+            }
+        }
+        return false;
+    },
+
+
+    handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
+        if (node == null)
+            return;
+
+        tinyMCE.switchClass(editor_id + '_codeblock', tinyMCE.getParentElement(node, "pre") ? 'mceButtonSelected' : 'mceButtonNormal');
+
+        return true;
+    }
+};
+
+tinyMCE.addPlugin("codeblock", TinyMCE_CodeblockPlugin);
diff --git a/public/javascripts/tiny_mce/plugins/codeblock/images/code.gif b/public/javascripts/tiny_mce/plugins/codeblock/images/code.gif
new file mode 100644
index 0000000000000000000000000000000000000000..bd12ffac7fa3474f077b1b6fe08214965e646022
GIT binary patch
literal 261
zcwPYo0s8(&Nk%w1VH5xq0J9GOtE;Q;@9*X0<;BIt_xJaVjEpoiGFMd@Px!A^8LW000jFEC2ui02BZe000EC@X1MQB{<^{7)uJ$AWO4o
z8P_Fc(+K8?s-M!j2sv{DFto6RK#|aJ4u%4tU@#nBifC~YKsFRG#NmJ#CK3)Ra$v&^
z4vWRtQB*Zqqu4LXcBlr<^r)0pIO=vB0C_JkHd23o91M6*LIMkjU|=2$4hu~&kwgxb
zo(YyVV|_%RotB*rWeu5WU;_n-9;!eMNJ;<)0EwMoK(2q4sHuN0nqa4k!<~CJk-@X4
LlnfTt)e!(Yrg(86

literal 0
HcwPel00001

diff --git a/public/javascripts/tiny_mce/plugins/codeblock/langs/en.js b/public/javascripts/tiny_mce/plugins/codeblock/langs/en.js
new file mode 100755
index 0000000..352b56a
--- /dev/null
+++ b/public/javascripts/tiny_mce/plugins/codeblock/langs/en.js
@@ -0,0 +1,3 @@
+tinyMCE.addToLang('',{
+codeblock_desc : 'Code block'
+});
diff --git a/public/javascripts/tiny_mce/plugins/codeblock/readme.txt b/public/javascripts/tiny_mce/plugins/codeblock/readme.txt
new file mode 100755
index 0000000..6514aa5
--- /dev/null
+++ b/public/javascripts/tiny_mce/plugins/codeblock/readme.txt
@@ -0,0 +1,65 @@
+Blockquote Plugin
+============================================================
+
+This adds a blockquote button to tinyMCE.
+Developed by Bit Santos 
+
+Instead of using the indent/outdent buttons to insert
+content into blockquote tags, IMHO, it's a much better idea
+to have a dedicated button for it.
+
+Click it once, and it adds the selected block/s of content
+into a blockquote tag. Click it again and the selected
+block/s are removed from the blockquote tag.
+
+
+
+Version History
+------------------------------------------------------------
+
+0.2
+    - Can apply blockquote tags to multiple block-level
+      elements.
+    - Will apply the paragraph tag when the blockquote tag
+      is removed and the remaining content doesn't have a
+      parent block-level element.
+    - Much better support for nested tags.
+
+0.1 (not released)
+    - Apply blockquote tags to content, one block-level
+      element at a time.
+    - Could not properly handle content nested tags, including
+      lists.
+      
+      
+      
+Plugin-specific Parameters
+------------------------------------------------------------
+
+blockquote_clear_tag :
+    (optional) the HTML tag to be applied when the
+    blockquote tag is removed and the remaining content does
+    not have a block-level parent. Defaults to 'p'.
+
+
+
+Installation
+------------------------------------------------------------
+
+1. Copy the blockquote directory to the tinyMCE plugins
+   directory.
+2. Add 'blockquote' to the plugin list.
+3. Add 'blockquote' to the button list.
+
+      
+      
+Sample initialization
+------------------------------------------------------------
+
+tinyMCE.init({
+    theme : "advanced",
+    mode : "textareas",
+    plugins : "blockquote",
+    blockquote_clear_tag : "p",
+    theme_advanced_buttons1_add : "blockquote",
+});
diff --git a/public/javascripts/tiny_mce/plugins/contextmenu/css/contextmenu.css b/public/javascripts/tiny_mce/plugins/contextmenu/css/contextmenu.css
new file mode 100755
index 0000000..fb37214
--- /dev/null
+++ b/public/javascripts/tiny_mce/plugins/contextmenu/css/contextmenu.css
@@ -0,0 +1,74 @@
+.contextMenuIEPopup {
+	padding: 0;
+	margin: 0;
+	border: 0;
+	overflow: hidden;
+}
+
+.contextMenu {
+	position: absolute;
+	cursor: default;
+	z-index: 1000;
+	border: 1px solid #D4D0C8;
+	background-color: #FFFFFF;
+}
+
+.contextMenuItem, .contextMenuItemOver {
+}
+
+.contextMenuSeparator {
+	width: 100%;
+	background-color: #D4D0C8;
+	border: 0;
+}
+
+.contextMenuImage, .contextMenuItemDisabled {
+	border: 0;
+}
+
+.contextMenuIcon {
+	background-color: #F0F0EE;
+}
+
+.contextMenuItemOver .contextMenuIcon {
+	background-color: #B6BDD2;
+}
+
+.contextMenuIcon {
+	background-color: #F0F0EE;
+}
+
+.contextMenuItemDisabled img {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	-moz-opacity:0.3;
+	opacity: 0.3;
+}
+
+.contextMenuText {
+	font-family: Tahoma, Verdana, Arial, Helvetica;
+	font-size: 11px;
+	line-height: 20px;
+}
+
+.contextMenuItemDisabled {
+	color: #AAAAAA;
+}
+
+.contextMenuText a {
+	display: block;
+	line-height: 20px;
+	width: 100%;
+	text-decoration: none;
+	color: black;
+	font-weight: normal;
+	margin: 0;
+	padding: 0;
+}
+
+.contextMenuText a:hover {
+	background-color: #B6BDD2;
+	text-decoration: none !important;
+	font-weight: normal;
+	margin: 0;
+	padding: 0;
+}
diff --git a/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin.js b/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin.js
new file mode 100755
index 0000000..cd65ef8
--- /dev/null
+++ b/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin.js
@@ -0,0 +1 @@
+if(!tinyMCE.settings['contextmenu_skip_plugin_css']){tinyMCE.loadCSS(tinyMCE.baseURL+"/plugins/contextmenu/css/contextmenu.css")}var TinyMCE_ContextMenuPlugin={_contextMenu:null,getInfo:function(){return{longname:'Context menus',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_contextmenu.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(tinyMCE.isMSIE5_0&&tinyMCE.isOpera)return;TinyMCE_ContextMenuPlugin._contextMenu=new TinyMCE_ContextMenu({commandhandler:"TinyMCE_ContextMenuPlugin._commandHandler",spacer_image:tinyMCE.baseURL+"/plugins/contextmenu/images/spacer.gif"});tinyMCE.addEvent(inst.getDoc(),"click",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keypress",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keydown",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(document,"click",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(document,"keypress",TinyMCE_ContextMenuPlugin._hideContextMenu);tinyMCE.addEvent(document,"keydown",TinyMCE_ContextMenuPlugin._hideContextMenu);if(tinyMCE.isGecko){tinyMCE.addEvent(inst.getDoc(),"contextmenu",function(e){TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE?inst.contentWindow.event:e,inst)})}else tinyMCE.addEvent(inst.getDoc(),"contextmenu",TinyMCE_ContextMenuPlugin._onContextMenu)},_onContextMenu:function(e){var elm=tinyMCE.isMSIE?e.srcElement:e.target;var targetInst,body;if((body=tinyMCE.getParentElement(elm,"body"))!=null){for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(body==inst.getBody()){targetInst=inst;break}}return TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE?targetInst.contentWindow.event:e,targetInst)}},_showContextMenu:function(e,inst){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):""}var x,y,elm,contextMenu;var pos=tinyMCE.getAbsPosition(inst.iframeElement);x=tinyMCE.isMSIE?e.screenX:pos.absLeft+(e.pageX-inst.getBody().scrollLeft);y=tinyMCE.isMSIE?e.screenY:pos.absTop+(e.pageY-inst.getBody().scrollTop);elm=tinyMCE.isMSIE?e.srcElement:e.target;contextMenu=this._contextMenu;contextMenu.inst=inst;window.setTimeout(function(){var theme=tinyMCE.getParam("theme");contextMenu.clearAll();var sel=inst.selection.getSelectedText().length!=0||elm.nodeName=="IMG";contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_cut_desc","Cut","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_copy_desc","Copy","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_paste_desc","Paste","",false);if(sel||(elm?(elm.nodeName=='A')||(elm.nodeName=='IMG'):false)){contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/themes/advanced/images/link.gif","$lang_link_desc",inst.hasPlugin("advlink")?"mceAdvLink":"mceLink");contextMenu.addItem(tinyMCE.baseURL+"/themes/advanced/images/unlink.gif","$lang_unlink_desc","unlink","",(elm?(elm.nodeName!='A')&&(elm.nodeName!='IMG'):true))}elm=tinyMCE.getParentElement(elm,"img,table,td"+(inst.hasPlugin("advhr")?',hr':''));if(elm){switch(elm.nodeName){case"IMG":contextMenu.addSeparator();if(tinyMCE.hasPlugin('flash')&&tinyMCE.getAttrib(elm,'class').indexOf('mceItemFlash')!=-1)contextMenu.addItem(tinyMCE.baseURL+"/plugins/flash/images/flash.gif","$lang_flash_props","mceFlash");else if(tinyMCE.hasPlugin('media')&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(elm,'class')))contextMenu.addItem(tinyMCE.baseURL+"/plugins/flash/images/flash.gif","$lang_media_title","mceMedia");else contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/image.gif","$lang_image_props_desc",inst.hasPlugin("advimage")?"mceAdvImage":"mceImage");break;case"HR":contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/advhr/images/advhr.gif","$lang_insert_advhr_desc","mceAdvancedHr");break;case"TABLE":case"TD":if(inst.hasPlugin("table")){var colspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"colspan");var rowspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_table_cut_row_desc","mceTableCutRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_table_copy_row_desc","mceTableCopyRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_before_desc","mceTablePasteRowBefore","",inst.tableRowClipboard==null);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_after_desc","mceTablePasteRowAfter","",inst.tableRowClipboard==null);contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_desc","mceInsertTable","insert");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_props_desc","mceInsertTable");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_cell_props.gif","$lang_table_cell_desc","mceTableCellProps");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete.gif","$lang_table_del","mceTableDelete");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_row_props.gif","$lang_table_row_desc","mceTableRowProps");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_before.gif","$lang_table_row_before_desc","mceTableInsertRowBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_after.gif","$lang_table_row_after_desc","mceTableInsertRowAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_row.gif","$lang_table_delete_row_desc","mceTableDeleteRow");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_before.gif","$lang_table_col_before_desc","mceTableInsertColBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_after.gif","$lang_table_col_after_desc","mceTableInsertColAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_col.gif","$lang_table_delete_col_desc","mceTableDeleteCol");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_split_cells.gif","$lang_table_split_cells_desc","mceTableSplitCells","",(colspan=="1"&&rowspan=="1"));contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_merge_cells.gif","$lang_table_merge_cells_desc","mceTableMergeCells","",false)}break}}else{if(inst.hasPlugin("table")){contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_desc","mceInsertTable","insert")}}contextMenu.show(x,y)},10);tinyMCE.cancelEvent(e);return false},_hideContextMenu:function(){if(TinyMCE_ContextMenuPlugin._contextMenu)TinyMCE_ContextMenuPlugin._contextMenu.hide()},_commandHandler:function(command,value){var cm=TinyMCE_ContextMenuPlugin._contextMenu;cm.hide();var ui=false;if(command=="mceInsertTable"||command=="mceTableCellProps"||command=="mceTableRowProps"||command=="mceTableMergeCells")ui=true;if(command=="Paste")value=null;if(tinyMCE.getParam("dialog_type")=="modal"&&tinyMCE.isMSIE){window.setTimeout(function(){cm.inst.execCommand(command,ui,value)},100)}else cm.inst.execCommand(command,ui,value)}};tinyMCE.addPlugin("contextmenu",TinyMCE_ContextMenuPlugin);function TinyMCE_ContextMenu(settings){var doc,self=this;function defParam(key,def_val){settings[key]=typeof(settings[key])!="undefined"?settings[key]:def_val}this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.contextMenuDiv=document.createElement("div");this.contextMenuDiv.className="contextMenu";this.contextMenuDiv.setAttribute("class","contextMenu");this.contextMenuDiv.style.display="none";this.contextMenuDiv.style.position='absolute';this.contextMenuDiv.style.zindex=1000;this.contextMenuDiv.style.left='0';this.contextMenuDiv.style.top='0';this.contextMenuDiv.unselectable="on";document.body.appendChild(this.contextMenuDiv);defParam("commandhandler","");defParam("spacer_image","images/spacer.gif");this.items=new Array();this.settings=settings;this.html="";if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera){this.pop=window.createPopup();doc=this.pop.document;doc.open();doc.write('');doc.close()}};TinyMCE_ContextMenu.prototype={clearAll:function(){this.html="";this.contextMenuDiv.innerHTML=""},addSeparator:function(){this.html+=''},addItem:function(icon,title,command,value,disabled){if(title.charAt(0)=='$')title=tinyMCE.getLang(title.substring(1));var onMouseDown='';var html='';if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0)onMouseDown='contextMenu.execCommand(\''+command+'\', \''+value+'\');return false;';else onMouseDown=this.settings['commandhandler']+'(\''+command+'\', \''+value+'\');return false;';if(icon=="")icon=this.settings['spacer_image'];if(!disabled)html+='';else html+='';html+='';html+='
';html+=' ';html+=title;html+=' ';html+='
';html+='';this.html+=html},show:function(x,y){var vp,width,height,yo;if(this.html=="")return;var html='';html+='';html+=this.html;html+='
';this.contextMenuDiv.innerHTML=html;this.contextMenuDiv.style.display="block";width=this.contextMenuDiv.offsetWidth;height=this.contextMenuDiv.offsetHeight;this.contextMenuDiv.style.display="none";if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera){this.pop.document.body.innerHTML='
'+html+"
";this.pop.document.tinyMCE=tinyMCE;this.pop.document.contextMenu=this;this.pop.show(x,y,width,height)}else{vp=this.getViewPort();yo=tinyMCE.isMSIE5_0?document.body.scrollTop:self.pageYOffset;this.contextMenuDiv.style.left=(x>vp.left+vp.width-width?vp.left+vp.width-width:x)+'px';this.contextMenuDiv.style.top=(y>vp.top+vp.height-height?vp.top+vp.height-height:y)+'px';this.contextMenuDiv.style.display="block"}},getViewPort:function(){return{left:self.pageXOffset||self.document.documentElement.scrollLeft||self.document.body.scrollLeft,top:self.pageYOffset||self.document.documentElement.scrollTop||self.document.body.scrollTop,width:document.documentElement.offsetWidth||document.body.offsetWidth,height:self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight}},hide:function(){if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera)this.pop.hide();else this.contextMenuDiv.style.display="none"},execCommand:function(command,value){eval(this.settings['commandhandler']+"(command, value);")}}; \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js new file mode 100755 index 0000000..2ba0205 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js @@ -0,0 +1,357 @@ +/** + * $Id: editor_plugin_src.js 129 2006-10-23 09:45:17Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +if (!tinyMCE.settings['contextmenu_skip_plugin_css']) { + tinyMCE.loadCSS(tinyMCE.baseURL + "/plugins/contextmenu/css/contextmenu.css"); +} + +var TinyMCE_ContextMenuPlugin = { + // Private fields + _contextMenu : null, + + getInfo : function() { + return { + longname : 'Context menus', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_contextmenu.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + initInstance : function(inst) { + // Is not working on MSIE 5.0 or Opera no contextmenu event + if (tinyMCE.isMSIE5_0 && tinyMCE.isOpera) + return; + + TinyMCE_ContextMenuPlugin._contextMenu = new TinyMCE_ContextMenu({ + commandhandler : "TinyMCE_ContextMenuPlugin._commandHandler", + spacer_image : tinyMCE.baseURL + "/plugins/contextmenu/images/spacer.gif" + }); + + // Add hide event handles + tinyMCE.addEvent(inst.getDoc(), "click", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(inst.getDoc(), "keydown", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(document, "click", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(document, "keypress", TinyMCE_ContextMenuPlugin._hideContextMenu); + tinyMCE.addEvent(document, "keydown", TinyMCE_ContextMenuPlugin._hideContextMenu); + + // Attach contextmenu event + if (tinyMCE.isGecko) { + tinyMCE.addEvent(inst.getDoc(), "contextmenu", function(e) {TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE ? inst.contentWindow.event : e, inst);}); + } else + tinyMCE.addEvent(inst.getDoc(), "contextmenu", TinyMCE_ContextMenuPlugin._onContextMenu); + }, + + // Private plugin internal methods + + _onContextMenu : function(e) { + var elm = tinyMCE.isMSIE ? e.srcElement : e.target; + var targetInst, body; + + // Find instance + if ((body = tinyMCE.getParentElement(elm, "body")) != null) { + for (var n in tinyMCE.instances) { + var inst = tinyMCE.instances[n]; + if (!tinyMCE.isInstance(inst)) + continue; + + if (body == inst.getBody()) { + targetInst = inst; + break; + } + } + + return TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE ? targetInst.contentWindow.event : e, targetInst); + } + }, + + _showContextMenu : function(e, inst) { + function getAttrib(elm, name) { + return elm.getAttribute(name) ? elm.getAttribute(name) : ""; + } + + var x, y, elm, contextMenu; + var pos = tinyMCE.getAbsPosition(inst.iframeElement); + + x = tinyMCE.isMSIE ? e.screenX : pos.absLeft + (e.pageX - inst.getBody().scrollLeft); + y = tinyMCE.isMSIE ? e.screenY : pos.absTop + (e.pageY - inst.getBody().scrollTop); + elm = tinyMCE.isMSIE ? e.srcElement : e.target; + + contextMenu = this._contextMenu; + contextMenu.inst = inst; + + // Mozilla needs some time + window.setTimeout(function () { + var theme = tinyMCE.getParam("theme"); + + contextMenu.clearAll(); + var sel = inst.selection.getSelectedText().length != 0 || elm.nodeName == "IMG"; + + // Default items + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_cut_desc", "Cut", "", !sel); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_copy_desc", "Copy", "", !sel); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_paste_desc", "Paste", "", false); + + if (sel || (elm ? (elm.nodeName == 'A') || (elm.nodeName == 'IMG') : false)) { + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/themes/advanced/images/link.gif", "$lang_link_desc", inst.hasPlugin("advlink") ? "mceAdvLink" : "mceLink"); + contextMenu.addItem(tinyMCE.baseURL + "/themes/advanced/images/unlink.gif", "$lang_unlink_desc", "unlink", "", (elm ? (elm.nodeName != 'A') && (elm.nodeName != 'IMG') : true)); + } + + // Get element + elm = tinyMCE.getParentElement(elm, "img,table,td" + (inst.hasPlugin("advhr") ? ',hr' : '')); + if (elm) { + switch (elm.nodeName) { + case "IMG": + contextMenu.addSeparator(); + + // If flash + if (tinyMCE.hasPlugin('flash') && tinyMCE.getAttrib(elm, 'class').indexOf('mceItemFlash') != -1) + contextMenu.addItem(tinyMCE.baseURL + "/plugins/flash/images/flash.gif", "$lang_flash_props", "mceFlash"); + else if (tinyMCE.hasPlugin('media') && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(elm, 'class'))) + contextMenu.addItem(tinyMCE.baseURL + "/plugins/flash/images/flash.gif", "$lang_media_title", "mceMedia"); + else + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/image.gif", "$lang_image_props_desc", inst.hasPlugin("advimage") ? "mceAdvImage" : "mceImage"); + break; + + case "HR": + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/advhr/images/advhr.gif", "$lang_insert_advhr_desc", "mceAdvancedHr"); + break; + + case "TABLE": + case "TD": + // Is table plugin loaded + if (inst.hasPlugin("table")) { + var colspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "colspan"); + var rowspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "rowspan"); + + colspan = colspan == "" ? "1" : colspan; + rowspan = rowspan == "" ? "1" : rowspan; + + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_table_cut_row_desc", "mceTableCutRow"); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_table_copy_row_desc", "mceTableCopyRow"); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_before_desc", "mceTablePasteRowBefore", "", inst.tableRowClipboard == null); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_after_desc", "mceTablePasteRowAfter", "", inst.tableRowClipboard == null); + + /* contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyleft.gif", "$lang_justifyleft_desc", "JustifyLeft", "", false); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifycenter.gif", "$lang_justifycenter_desc", "JustifyCenter", "", false); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyright.gif", "$lang_justifyright_desc", "JustifyRight", "", false); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyfull.gif", "$lang_justifyfull_desc", "JustifyFull", "", false);*/ + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_props_desc", "mceInsertTable"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_cell_props.gif", "$lang_table_cell_desc", "mceTableCellProps"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete.gif", "$lang_table_del", "mceTableDelete"); + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_row_props.gif", "$lang_table_row_desc", "mceTableRowProps"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_before.gif", "$lang_table_row_before_desc", "mceTableInsertRowBefore"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_after.gif", "$lang_table_row_after_desc", "mceTableInsertRowAfter"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_row.gif", "$lang_table_delete_row_desc", "mceTableDeleteRow"); + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_before.gif", "$lang_table_col_before_desc", "mceTableInsertColBefore"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_after.gif", "$lang_table_col_after_desc", "mceTableInsertColAfter"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_col.gif", "$lang_table_delete_col_desc", "mceTableDeleteCol"); + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_split_cells.gif", "$lang_table_split_cells_desc", "mceTableSplitCells", "", (colspan == "1" && rowspan == "1")); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_merge_cells.gif", "$lang_table_merge_cells_desc", "mceTableMergeCells", "", false); + } + break; + } + } else { + // Add table specific + if (inst.hasPlugin("table")) { + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert"); + } + } + + contextMenu.show(x, y); + }, 10); + + // Cancel default handeling + tinyMCE.cancelEvent(e); + return false; + }, + + _hideContextMenu : function() { + if (TinyMCE_ContextMenuPlugin._contextMenu) + TinyMCE_ContextMenuPlugin._contextMenu.hide(); + }, + + _commandHandler : function(command, value) { + var cm = TinyMCE_ContextMenuPlugin._contextMenu; + + cm.hide(); + + // UI must be true on these + var ui = false; + if (command == "mceInsertTable" || command == "mceTableCellProps" || command == "mceTableRowProps" || command == "mceTableMergeCells") + ui = true; + + if (command == "Paste") + value = null; + + if (tinyMCE.getParam("dialog_type") == "modal" && tinyMCE.isMSIE) { + // Cell properties will generate access denied error is this isn't done?! + window.setTimeout(function() { + cm.inst.execCommand(command, ui, value); + }, 100); + } else + cm.inst.execCommand(command, ui, value); + } +}; + +tinyMCE.addPlugin("contextmenu", TinyMCE_ContextMenuPlugin); + +// Context menu class + +function TinyMCE_ContextMenu(settings) { + var doc, self = this; + + // Default value function + function defParam(key, def_val) { + settings[key] = typeof(settings[key]) != "undefined" ? settings[key] : def_val; + } + + this.isMSIE = (navigator.appName == "Microsoft Internet Explorer"); + + // Setup contextmenu div + this.contextMenuDiv = document.createElement("div"); + this.contextMenuDiv.className = "contextMenu"; + this.contextMenuDiv.setAttribute("class", "contextMenu"); + this.contextMenuDiv.style.display = "none"; + this.contextMenuDiv.style.position = 'absolute'; + this.contextMenuDiv.style.zindex = 1000; + this.contextMenuDiv.style.left = '0'; + this.contextMenuDiv.style.top = '0'; + this.contextMenuDiv.unselectable = "on"; + + document.body.appendChild(this.contextMenuDiv); + + // Setup default values + defParam("commandhandler", ""); + defParam("spacer_image", "images/spacer.gif"); + + this.items = new Array(); + this.settings = settings; + this.html = ""; + + // IE Popup + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) { + this.pop = window.createPopup(); + doc = this.pop.document; + doc.open(); + doc.write(''); + doc.close(); + } +}; + +TinyMCE_ContextMenu.prototype = { + clearAll : function() { + this.html = ""; + this.contextMenuDiv.innerHTML = ""; + }, + + addSeparator : function() { + this.html += ''; + }, + + addItem : function(icon, title, command, value, disabled) { + if (title.charAt(0) == '$') + title = tinyMCE.getLang(title.substring(1)); + + var onMouseDown = ''; + var html = ''; + + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0) + onMouseDown = 'contextMenu.execCommand(\'' + command + '\', \'' + value + '\');return false;'; + else + onMouseDown = this.settings['commandhandler'] + '(\'' + command + '\', \'' + value + '\');return false;'; + + if (icon == "") + icon = this.settings['spacer_image']; + + if (!disabled) + html += ''; + else + html += ''; + + html += ''; + html += ''; + html += ''; + + // Add to main + this.html += html; + }, + + show : function(x, y) { + var vp, width, height, yo; + + if (this.html == "") + return; + + var html = ''; + + html += ''; + html += this.html; + html += '
'; + + this.contextMenuDiv.innerHTML = html; + + // Get dimensions + this.contextMenuDiv.style.display = "block"; + width = this.contextMenuDiv.offsetWidth; + height = this.contextMenuDiv.offsetHeight; + this.contextMenuDiv.style.display = "none"; + + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) { + // Setup popup and show + this.pop.document.body.innerHTML = '
' + html + "
"; + this.pop.document.tinyMCE = tinyMCE; + this.pop.document.contextMenu = this; + this.pop.show(x, y, width, height); + } else { + vp = this.getViewPort(); + yo = tinyMCE.isMSIE5_0 ? document.body.scrollTop : self.pageYOffset; + this.contextMenuDiv.style.left = (x > vp.left + vp.width - width ? vp.left + vp.width - width : x) + 'px'; + this.contextMenuDiv.style.top = (y > vp.top + vp.height - height ? vp.top + vp.height - height : y) + 'px'; + this.contextMenuDiv.style.display = "block"; + } + }, + + getViewPort : function() { + return { + left : self.pageXOffset || self.document.documentElement.scrollLeft || self.document.body.scrollLeft, + top: self.pageYOffset || self.document.documentElement.scrollTop || self.document.body.scrollTop, + width : document.documentElement.offsetWidth || document.body.offsetWidth, + height : self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight + }; + }, + + hide : function() { + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) + this.pop.hide(); + else + this.contextMenuDiv.style.display = "none"; + }, + + execCommand : function(command, value) { + eval(this.settings['commandhandler'] + "(command, value);"); + } +}; diff --git a/public/javascripts/tiny_mce/plugins/contextmenu/images/spacer.gif b/public/javascripts/tiny_mce/plugins/contextmenu/images/spacer.gif new file mode 100755 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncwTe&bhEHbWMp7un7{x9ia%KxMS!#phy#*gU}AD%WUvMRb)f_x literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/contextmenu/readme.txt b/public/javascripts/tiny_mce/plugins/contextmenu/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/contextmenu/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/devkit/css/devkit.css b/public/javascripts/tiny_mce/plugins/devkit/css/devkit.css new file mode 100755 index 0000000..27eaac0 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/devkit/css/devkit.css @@ -0,0 +1,117 @@ +body { + overflow: hidden; +} + +h1 { + font-size: 14px; + margin: 0 0 10px 0; +} + +h2 { + font-size: 12px; + margin: 3px 0 3px 0; +} + +h3 { + font-size: 11px; + margin: 3px 0 3px 0; +} + +#log { + font-family: Verdana; + border: 1px solid gray; + width: 100%; height: 240px; + overflow: scroll; + white-space: nowrap; +} + +#log span { + display: block; +} + +#log span.msg { + float: left; +} + +#log span.time { + float: left; +} + +#log br { + clear: both; +} + +#logfilter { + width: 350px; +} + +#logenabled { + border: 0; +} + +#settings_panel span, #info_panel span, #content_panel span, #command_states_panel span, #undo_redo_panel span { + display: block; + margin: 5px 0 5px 0; +} + +div.data { + width: 100%; height: 240px; + overflow: scroll; + border: 1px solid gray; +} + +#misc_panel div.data { + height: 270px; +} + +.data input { + width: 265px; + border: 0; +} + +.data h2 { + margin-left: 5px; +} + +.data h3 { + margin-left: 7px; +} + +.data div { + margin-left: 7px; +} + +.data table { + margin: 0 0 15px 15px; +} + +.data p { + margin: 0; padding: 0; + margin-top: 5px; + margin-left: 5px; +} + +table, td { + border: 1px solid gray; + border-collapse: collapse; +} + +#flip { + position: absolute; + left: 295; top: 384px; +} + +.bspec { + color: gray; +} + +.dep { + color: #880000; +} + +.col1 { + width: 265px; +} + +div.undodata { +} diff --git a/public/javascripts/tiny_mce/plugins/devkit/css/devkit_ui.css b/public/javascripts/tiny_mce/plugins/devkit/css/devkit_ui.css new file mode 100755 index 0000000..6713abc --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/devkit/css/devkit_ui.css @@ -0,0 +1,15 @@ +#devkit { + position: absolute; + top: -385px; right: 0; + width: 640px; height: 390px; + border: 1px solid black; + z-index: 10000; +} + +.devkitup { + top: -385px !important; +} + +.devkitdown { + top: 0 !important; +} diff --git a/public/javascripts/tiny_mce/plugins/devkit/devkit.htm b/public/javascripts/tiny_mce/plugins/devkit/devkit.htm new file mode 100755 index 0000000..92a339b --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/devkit/devkit.htm @@ -0,0 +1,140 @@ + + + {$lang_devkit_title} + + + + + + + + + +
+

{$lang_devkit_title}

+ + + +
+
+
+ {$lang_devkit_log_tab} + +
+ +
+ +
+ +
+ + + +
+ +
+
+ + +
+
+ +
+
+ {$lang_devkit_info_tab} + + [{$lang_devkit_refresh}] + +
+

{$lang_devkit_info_help}

+
+
+
+ +
+
+ {$lang_devkit_settings_tab} + + [{$lang_devkit_refresh}] + +
+

{$lang_devkit_settings_help}

+
+
+
+ +
+
+ {$lang_devkit_content_tab} + + [{$lang_devkit_refresh}] + +
+

{$lang_devkit_content_help}

+
+
+
+ +
+
+ {$lang_devkit_command_states_tab} + + [{$lang_devkit_refresh}] + +
+

{$lang_devkit_command_states_help}

+
+
+
+ +
+
+ {$lang_devkit_undo_redo_tab} + + [{$lang_devkit_refresh}] + +
+

{$lang_devkit_undo_redo_help}

+
+ + +
+
+ +
+
+ {$lang_devkit_misc_tab} + +
+

{$lang_devkit_misc_help}

+
+

Selection: [Store selection] [Restore selection]

+
+
Insert custom HTML content
+
+ +
+
Eval JS:
+
+ +
+
+
+
+
+ +
+ + diff --git a/public/javascripts/tiny_mce/plugins/devkit/editor_plugin.js b/public/javascripts/tiny_mce/plugins/devkit/editor_plugin.js new file mode 100755 index 0000000..cbca9b1 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/devkit/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('devkit');var TinyMCE_DevKitPlugin={_logFilter:'\\[(importCSS|execCommand|execInstanceCommand|debug)\\]',_logPadding:'',_startTime:null,_benchMark:false,_winLoaded:false,_isDebugEvents:false,getInfo:function(){return{longname:'Development Kit',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_devkit.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){this._setup()},_setup:function(){if(this._loaded)return;this._loaded=true;document.___TinyMCE=tinyMCE;this._logFilter=tinyMCE.getParam('devkit_log_filter',this._logFilter);this._benchMark=tinyMCE.getParam('devkit_bench_mark',false);var ifr=document.createElement('iframe');ifr.setAttribute("id","devkit");ifr.setAttribute("frameBorder","0");ifr.setAttribute("src",tinyMCE.baseURL+'/plugins/devkit/devkit.htm');document.body.appendChild(ifr);tinyMCE.importCSS(document,tinyMCE.baseURL+'/plugins/devkit/css/devkit_ui.css')},_start:function(){this._logPadding+='\u00a0';return new Date().getTime()},_end:function(st){if(this._logPadding.length>0)this._logPadding=this._logPadding.substring(0,this._logPadding.length-1);if(this._benchMark)this._log("benchmark","Execution time: "+(new Date().getTime()-st))},_log:function(t){var m,a,i,e=document.getElementById('devkit'),now=new Date().getTime();if(!this._startTime)this._startTime=now;m=(this._logPadding.length>1?this._logPadding:'')+'['+(now-this._startTime)+'] ['+t+'] ';a=this._log.arguments;for(i=1;i1)m+=', ';m+=a[i]}if(!new RegExp(this._logFilter,'gi').test(m)){if(this._logPadding.length>0)this._logPadding=this._logPadding.substring(0,this._logPadding.length-1);return}if(!this._winLoaded)tinyMCE.log[tinyMCE.log.length]=m;else e.contentWindow.debug(m)},_debugEvents:function(s){var i,ld,inst,n,ev=['CheckboxStateChange','DOMAttrModified','DOMMenuItemActive','DOMMenuItemInactive','DOMMouseScroll','DOMNodeInserted','DOMNodeRemoved','RadioStateChange','blur','broadcast','change','click','close','command','commandupdate','contextmenu','dblclick','dragdrop','dragenter','dragexit','draggesture','dragover','focus','input','keydown','keypress','keyup','load','mousedown','mouseout','mouseover','mouseup','overflow','overflowchanged','popuphidden','popuphiding','popupshowing','popupshown','select','syncfrompreference','synctopreference','underflow','unload','abort','activate','afterprint','afterupdate','beforeactivate','beforecopy','beforecut','beforedeactivate','beforeeditfocus','beforepaste','beforeprint','beforeunload','beforeupdate','bounce','cellchange','controlselect','copy','cut','dataavailable','datasetchanged','datasetcomplete','deactivate','dragend','dragleave','dragstart','drop','error','errorupdate','filterchange','finish','focusin','focusout','help','layoutcomplete','losecapture','mouseenter','mouseleave','mousewheel','move','moveend','movestart','paste','propertychange','readystatechange','reset','resize','resizeend','resizestart','rowenter','rowexit','rowsdelete','rowsinserted','scroll','selectionchange','selectstart','start','stop','submit'];if(TinyMCE_DevKitPlugin._isDebugEvents==s)return;TinyMCE_DevKitPlugin._isDebugEvents=s;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst)||inst.getDoc()==ld)continue;ld=inst.getDoc();for(i=0;i0?',':'')+s(o[i]);return v+']'}v='{';for(i in o)v+=typeof o[i]!='function'?(v.length>1?',"':'"')+i+'":'+s(o[i]):'';return v+'}'}return''+o}};tinyMCE.__debug=tinyMCE.debug;tinyMCE.debug=function(){var a,i,m='',now=new Date().getTime(),start=TinyMCE_DevKitPlugin._startTime;if(!start)TinyMCE_DevKitPlugin._startTime=start=now;a=this.debug.arguments;for(i=0;i0)m+=', ';m+=a[i]}TinyMCE_DevKitPlugin._log('debug',m)};tinyMCE.dump=function(o){tinyMCE.debug(TinyMCE_DevKitPlugin._serialize(o))};tinyMCE.sleep=function(t){var s=new Date().getTime(),b;while(new Date().getTime()-s 0) + this._logPadding = this._logPadding.substring(0, this._logPadding.length - 1); + + if (this._benchMark) + this._log("benchmark", "Execution time: " + (new Date().getTime() - st)); + }, + + _log : function(t) { + var m, a, i, e = document.getElementById('devkit'), now = new Date().getTime(); + + if (!this._startTime) + this._startTime = now; + + m = (this._logPadding.length > 1 ? this._logPadding : '') + '[' + (now - this._startTime) + '] [' + t + '] '; + + a = this._log.arguments; + for (i=1; i 1) + m += ', '; + + m += a[i]; + } + + if (!new RegExp(this._logFilter, 'gi').test(m)) { + if (this._logPadding.length > 0) + this._logPadding = this._logPadding.substring(0, this._logPadding.length - 1); + + return; + } + + if (!this._winLoaded) + tinyMCE.log[tinyMCE.log.length] = m; + else + e.contentWindow.debug(m); + }, + + _debugEvents : function(s) { + var i, ld, inst, n, ev = ['CheckboxStateChange','DOMAttrModified','DOMMenuItemActive', + 'DOMMenuItemInactive','DOMMouseScroll','DOMNodeInserted','DOMNodeRemoved', + 'RadioStateChange','blur','broadcast','change','click','close','command', + 'commandupdate','contextmenu','dblclick','dragdrop','dragenter','dragexit', + 'draggesture','dragover','focus','input','keydown','keypress','keyup','load', + 'mousedown','mouseout','mouseover','mouseup','overflow','overflowchanged','popuphidden', + 'popuphiding','popupshowing','popupshown','select','syncfrompreference','synctopreference', + 'underflow','unload','abort','activate','afterprint','afterupdate','beforeactivate', + 'beforecopy','beforecut','beforedeactivate','beforeeditfocus','beforepaste','beforeprint', + 'beforeunload','beforeupdate','bounce','cellchange','controlselect','copy','cut', + 'dataavailable','datasetchanged','datasetcomplete','deactivate','dragend','dragleave', + 'dragstart','drop','error','errorupdate','filterchange','finish','focusin','focusout', + 'help','layoutcomplete','losecapture','mouseenter','mouseleave','mousewheel', + 'move','moveend','movestart','paste','propertychange','readystatechange','reset','resize', + 'resizeend','resizestart','rowenter','rowexit','rowsdelete','rowsinserted','scroll', + 'selectionchange','selectstart','start','stop','submit']; + // mousemove + + if (TinyMCE_DevKitPlugin._isDebugEvents == s) + return; + + TinyMCE_DevKitPlugin._isDebugEvents = s; + + for (n in tinyMCE.instances) { + inst = tinyMCE.instances[n]; + + if (!tinyMCE.isInstance(inst) || inst.getDoc() == ld) + continue; + + ld = inst.getDoc(); + + for (i=0; i 0 ? ',' : '') + s(o[i]); + + return v + ']'; + } + + v = '{'; + + for (i in o) + v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : ''; + + return v + '}'; + } + + return '' + o; + } +}; + +// Patch and piggy back functions +tinyMCE.__debug = tinyMCE.debug; +tinyMCE.debug = function() { + var a, i, m = '', now = new Date().getTime(), start = TinyMCE_DevKitPlugin._startTime; + + if (!start) + TinyMCE_DevKitPlugin._startTime = start = now; + + a = this.debug.arguments; + for (i=0; i 0) + m += ', '; + + m += a[i]; + } + + TinyMCE_DevKitPlugin._log('debug', m); +}; + +tinyMCE.dump = function(o) { + tinyMCE.debug(TinyMCE_DevKitPlugin._serialize(o)); +}; + +tinyMCE.sleep = function(t) { + var s = new Date().getTime(), b; + + while (new Date().getTime() - s < t) b=1; +}; + +tinyMCE.__execCommand = tinyMCE.execCommand; +tinyMCE.execCommand = function(command, user_interface, value) { + var r, st, dk = TinyMCE_DevKitPlugin; + + st = dk._start(); + dk._log('execCommand', command, user_interface, value); + r = tinyMCE.__execCommand(command, user_interface, value); + dk._end(st); + + return r; +}; + +tinyMCE.__execInstanceCommand = tinyMCE.execInstanceCommand; +tinyMCE.execInstanceCommand = function(editor_id, command, user_interface, value, focus) { + var r, st, dk = TinyMCE_DevKitPlugin; + + st = dk._start(); + dk._log('execInstanceCommand', editor_id, command, user_interface, value); + r = tinyMCE.__execInstanceCommand(editor_id, command, user_interface, value); + dk._end(st); + + return r; +}; + +TinyMCE_Engine.prototype.__handleEvent = TinyMCE_Engine.prototype.handleEvent; +TinyMCE_Engine.prototype.handleEvent = function(e) { + var r, st, dk = TinyMCE_DevKitPlugin; + + st = dk._start(); + dk._log('handleEvent', e.type); + r = tinyMCE.__handleEvent(e); + dk._end(st); + + return r; +}; + +tinyMCE.__importCSS = tinyMCE.importCSS; +tinyMCE.importCSS = function(doc, css) { + var r, st, dk = TinyMCE_DevKitPlugin; + + st = dk._start(); + dk._log('importCSS', doc, css); + r = tinyMCE.__importCSS(doc, css); + dk._end(st); + + return r; +}; + +tinyMCE.__triggerNodeChange = tinyMCE.triggerNodeChange; +tinyMCE.triggerNodeChange = function(focus, setup_content) { + var r, st, dk = TinyMCE_DevKitPlugin; + + st = dk._start(); + dk._log('triggerNodeChange', focus, setup_content); + r = tinyMCE.__triggerNodeChange(focus, setup_content); + dk._end(st); + + return r; +}; + +tinyMCE.__dispatchCallback = tinyMCE.dispatchCallback; +tinyMCE.dispatchCallback = function(i, p, n) { + var r, st, dk = TinyMCE_DevKitPlugin; + + st = dk._start(); + dk._log('dispatchCallback', i, p, n); + r = tinyMCE.__dispatchCallback(i, p, n); + dk._end(st); + + return r; +}; + +tinyMCE.__executeCallback = tinyMCE.executeCallback; +tinyMCE.executeCallback = function(i, p, n) { + var r, st, dk = TinyMCE_DevKitPlugin; + + st = dk._start(); + dk._log('executeCallback', i, p, n); + r = tinyMCE.__executeCallback(i, p, n); + dk._end(st); + + return r; +}; + +tinyMCE.__execCommandCallback = tinyMCE.execCommandCallback; +tinyMCE.execCommandCallback = function(i, p, n) { + var r, st, dk = TinyMCE_DevKitPlugin; + + st = dk._start(); + dk._log('execCommandCallback', i, p, n); + r = tinyMCE.__execCommandCallback(i, p, n); + dk._end(st); + + return r; +}; + +tinyMCE.addPlugin("devkit", TinyMCE_DevKitPlugin); diff --git a/public/javascripts/tiny_mce/plugins/devkit/images/flip_down.gif b/public/javascripts/tiny_mce/plugins/devkit/images/flip_down.gif new file mode 100755 index 0000000000000000000000000000000000000000..29a2d746bad9936f08fdde4ab0b944fe28a4652a GIT binary patch literal 179 zcwTe&bhEHbG-6<9IKsg2`t|Emr%u`1+sDVpzj*N?BqU__?%ik3oO$!+&7nhwva+%c zA3nTi&z{MXC$C+*_W%F?r%#_|AO+}v2#{S2tQHF{^`vCZ%UCt3i)n9x&iRtu!*6Sa r{oe~)Me9W{|Bz!)(lrP<*W>ZL=jEhRd>u|$Vb zTj0=}k~uG9)uaZ2y#+ew^FJC?tb1>B?~+5*;UvQ^eS6~zDmeu@J5C#&$cSBcV@=rW c8X@M}AIcI%XP?g~WMPQddH;i;0t'; + h += ''; + + h += addRenderInfo('editorId', inst.editorId); + h += addRenderInfo('visualAid', inst.visualAid); + h += addRenderInfo('foreColor', inst.foreColor); + h += addRenderInfo('backColor', inst.backColor); + h += addRenderInfo('formTargetElementId', inst.formTargetElementId); + h += addRenderInfo('linkElement', inst.linkElement ? inst.linkElement.nodeName : null, 'dep'); + h += addRenderInfo('imgElement', inst.imgElement ? inst.imgElement.nodeName : null, 'dep'); + h += addRenderInfo('selectedNode', inst.selectedNode ? inst.selectedNode.nodeName : null, 'dep'); + h += addRenderInfo('targetElement', inst.targetElement ? inst.targetElement.nodeName : null); + h += addRenderInfo('getBody().nodeName', inst.getBody() ? inst.getBody().nodeName : null); + h += addRenderInfo('getBody().getAttribute("id")', inst.getBody() ? inst.getBody().getAttribute("id") : null); + h += addRenderInfo('getDoc().location', inst.getDoc() ? inst.getDoc().location : null); + h += addRenderInfo('startContent', inst.startContent); + h += addRenderInfo('isHidden()', inst.isHidden()); + h += addRenderInfo('isDirty()', inst.isDirty()); + h += addRenderInfo('undoRedo.undoLevels.length', inst.undoRedo.undoLevels.length); + h += addRenderInfo('undoRedo.undoIndex', inst.undoRedo.undoIndex); + h += addRenderInfo('selection.getSelectedHTML()', inst.selection.getSelectedHTML()); + h += addRenderInfo('selection.getSelectedText()', inst.selection.getSelectedText()); + h += addRenderInfo('selection.getFocusElement().nodeName', inst.selection.getFocusElement().nodeName); + h += addRenderInfo('selection.getFocusElement().outerHTML', tinyMCE.getOuterHTML(inst.selection.getFocusElement())); + + if ((tinyMCE.isGecko || tinyMCE.isOpera) && sel && rng) { + h += addRenderInfo('selection.getSel().anchorNode.nodeName', sel.anchorNode ? sel.anchorNode.nodeName : null, 'bspec'); + h += addRenderInfo('selection.getSel().anchorOffset', sel.anchorOffset, 'bspec'); + h += addRenderInfo('selection.getSel().focusNode.nodeName', sel.focusNode ? sel.focusNode.nodeName : null, 'bspec'); + h += addRenderInfo('selection.getSel().focusOffset', sel.focusOffset, 'bspec'); + h += addRenderInfo('selection.getRng().startContainer.nodeName', rng.startContainer ? rng.startContainer.nodeName : null, 'bspec'); + h += addRenderInfo('selection.getRng().startOffset', rng.startOffset, 'bspec'); + h += addRenderInfo('selection.getRng().endContainer.nodeName', rng.endContainer ? rng.endContainer.nodeName : null, 'bspec'); + h += addRenderInfo('selection.getRng().endOffset', rng.endOffset, 'bspec'); + } + + if (typeof(rng.item) != 'undefined' || typeof(rng.htmlText) != 'undefined') { + if (!rng.item) { + h += addRenderInfo('selection.getSel().type', sel.type, 'bspec'); + h += addRenderInfo('selection.getRng().htmlText', rng.htmlText, 'bspec'); + h += addRenderInfo('selection.getRng().text', rng.text, 'bspec'); + } else + h += addRenderInfo('selection.getRng().item(0).nodeName', rng.item(0).nodeName, 'bspec'); + } + + h += '
'; + } + + h += '

Fields marked in gray is not cross browser and should be used with care.

'; + h += '

Fields marked red are marked deprecated and will be removed in the future.


'; + + se.innerHTML = h; +} + +function addRenderInfo(n, v, c) { + return '' + n + ''; +} + +function renderSettings() { + var se = document.getElementById('settings'), n, sn, inst, h = '', v; + + for (n in tinyMCE.instances) { + inst = tinyMCE.instances[n]; + + if (!tinyMCE.isInstance(inst)) + continue; + + h += '

Instance id: ' + inst.editorId + '

'; + h += ''; + + for (sn in inst.settings) { + v = inst.settings[sn]; + + h += ''; + } + + h += '
' + tinyMCE.xmlEncode(sn) + '
'; + } + + se.innerHTML = h; +} + +function renderContent() { + var se = document.getElementById('content'), n, inst, h = ''; + + for (n in tinyMCE.instances) { + inst = tinyMCE.instances[n]; + + if (!tinyMCE.isInstance(inst)) + continue; + + h += '

Instance id: ' + inst.editorId + '

'; + + h += '

Start content - inst.startContent:

'; + h += '
' + tinyMCE.xmlEncode(inst.startContent) + '
'; + + h += '

Raw content - inst.getBody().innerHTML or inst.getHTML(true):

'; + h += '
' + tinyMCE.xmlEncode(inst.getHTML(true)) + '
'; + + h += '

Cleaned content - inst.getHTML():

'; + h += '
' + tinyMCE.xmlEncode(inst.getHTML()) + '
'; + + if (inst.serializedHTML) { + h += '

Serialized HTML content - inst.serializedHTML:

'; + h += '
' + tinyMCE.xmlEncode(inst.serializedHTML) + '
'; + } + } + + se.innerHTML = h; +} + +function renderCommandStates() { + var se = document.getElementById('command_states'), n, inst, h = '', v, ex; + var cmds = new Array('2D-Position','AbsolutePosition','BackColor','BlockDirLTR','BlockDirRTL','Bold','BrowseMode','Copy','CreateBookmark','CreateLink','Cut','Delete','DirLTR','DirRTL','EditMode','enableInlineTableEditing','enableObjectResizing','FontName','FontSize','ForeColor','FormatBlock','Indent','InsertButton','InsertFieldset','InsertHorizontalRule','InsertIFrame','InsertImage','InsertInputButton','InsertInputCheckbox','InsertInputFileUpload','InsertInputHidden','InsertInputImage','InsertInputPassword','InsertInputRadio','InsertInputReset','InsertInputSubmit','InsertInputText','InsertMarquee','InsertOrderedList','InsertParagraph','InsertSelectDropdown','InsertSelectListbox','InsertTextArea','InsertUnorderedList','Italic','JustifyCenter','JustifyFull','JustifyLeft','JustifyNone','JustifyRight','LiveResize','MultipleSelection','Open','Outdent','OverWrite','Paste','PlayImage','Redo','Refresh','RemoveFormat','SaveAs','SelectAll','SizeToControl','SizeToControlHeight','SizeToControlWidth','Stop','StopImage','StrikeThrough','styleWithCSS','Subscript','Superscript','UnBookmark','Underline','Undo','Unlink','Unselect'), i; + + for (n in tinyMCE.instances) { + inst = tinyMCE.instances[n]; + + if (!tinyMCE.isInstance(inst)) + continue; + + h += '

Instance id: ' + inst.editorId + '

'; + h += ''; + + for (i=0; i'; + } + + h += '
'; + } + + se.innerHTML = h; +} + +function renderUndoRedo() { + var se = document.getElementById('undo_redo'), inst, n, h = '', i, le, id, d, ur; + var f = document.forms[0]; + + if (tinyMCE.undoLevels) { + le = tinyMCE.undoLevels; + + h += '

Global undo/redo

'; + h += ''; + h += ''; + h += ''; + h += '
undoLevels.length' + le.length + '
undoIndex' + tinyMCE.undoIndex + '
'; + + for (i=0; i'; + } + + for (n in tinyMCE.instances) { + inst = tinyMCE.instances[n]; + + if (!tinyMCE.isInstance(inst)) + continue; + + ur = inst.undoRedo; + le = ur.undoLevels; + + h += '

Instance id: ' + inst.editorId + '

'; + h += ''; + h += ''; + h += ''; + h += ''; + h += ''; + h += '
undoLevels.length' + le.length + '
undoIndex' + ur.undoIndex + '
typingUndoIndex' + ur.typingUndoIndex + '
undoRedo' + ur.undoRedo + '
'; + + for (i=0; i'; + h += '
' + tinyMCE.xmlEncode(le[i].content) + '
'; + + if (i > 0 && f.undo_diff.checked) { + d = diff_main(i > 0 ? le[i-1].content.replace(/[\r\n]+/g, '') : null, le[i].content.replace(/[\r\n]+/g, ''), false); + diff_cleanup_semantic(d); + h += '

Diff ' + (i-1) + ',' + i + '

' + diff_prettyhtml(d) + '
'; + } + } + } + + se.innerHTML = h; +} + +function clearLog() { + document.getElementById('log').innerHTML = ''; + devkit._startTime = null; +} + +function cancelAction() { + parent.document.getElementById('devkit').style.display = 'none'; +} + +function toggleDebugEvents(s) { + devkit._debugEvents(s); +} + +function storeSelection() { + book = tinyMCE.selectedInstance.selection.getBookmark(); + + return false; +} + +function restoreSelection() { + tinyMCE.selectedInstance.selection.moveToBookmark(book); + + return false; +} \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/devkit/jscripts/diff.js b/public/javascripts/tiny_mce/plugins/devkit/jscripts/diff.js new file mode 100755 index 0000000..87b96cc --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/devkit/jscripts/diff.js @@ -0,0 +1,1192 @@ +// Diff_Match_Patch v1.3 +// Computes the difference between two texts to create a patch. +// Applies the patch onto another text, allowing for errors. +// Copyright (C) 2006 Neil Fraser +// http://neil.fraser.name/software/diff_match_patch/ + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License (www.gnu.org) for more details. + + +// Constants. +// Redefine these in your program to override the defaults. + +// Number of seconds to map a diff before giving up. (0 for infinity) +var DIFF_TIMEOUT = 1.0; +// Cost of an empty edit operation in terms of edit characters. +var DIFF_EDIT_COST = 4; +// Tweak the relative importance (0.0 = accuracy, 1.0 = proximity) +var MATCH_BALANCE = 0.5; +// At what point is no match declared (0.0 = perfection, 1.0 = very loose) +var MATCH_THRESHOLD = 0.5; +// The min and max cutoffs used when computing text lengths. +var MATCH_MINLENGTH = 100; +var MATCH_MAXLENGTH = 1000; +// Chunk size for context length. +var PATCH_MARGIN = 4; + + + ////////////////////////////////////////////////////////////////////// + // Diff // +////////////////////////////////////////////////////////////////////// + +// The data structure representing a diff is an array of tuples: +// [[-1, "Hello"], [1, "Goodbye"], [0, " world."]] +// which means: delete "Hello", add "Goodbye" and keep " world." + + +function diff_main(text1, text2, checklines) { + // Find the differences between two texts. Return an array of changes. + // If checklines is present and false, then don't run a line-level diff first to identify the changed areas. + // Check for equality (speedup) + if (text1 == text2) + return [[0, text1]]; + + if (typeof checklines == 'undefined') + checklines = true; + + var a; + // Trim off common prefix (speedup) + a = diff_prefix(text1, text2); + text1 = a[0]; + text2 = a[1]; + var commonprefix = a[2]; + + // Trim off common suffix (speedup) + a = diff_suffix(text1, text2); + text1 = a[0]; + text2 = a[1]; + var commonsuffix = a[2]; + + var diff, i; + var longtext = text1.length > text2.length ? text1 : text2; + var shorttext = text1.length > text2.length ? text2 : text1; + + if (!text1) { // Just add some text (speedup) + diff = [[1, text2]]; + } else if (!text2) { // Just delete some text (speedup) + diff = [[-1, text1]]; + } else if ((i = longtext.indexOf(shorttext)) != -1) { + // Shorter text is inside the longer text (speedup) + diff = [[1, longtext.substring(0, i)], [0, shorttext], [1, longtext.substring(i+shorttext.length)]]; + // Swap insertions for deletions if diff is reversed. + if (text1.length > text2.length) + diff[0][0] = diff[2][0] = -1; + } else { + longtext = shorttext = null; // Garbage collect + // Check to see if the problem can be split in two. + var hm = diff_halfmatch(text1, text2); + if (hm) { + // A half-match was found, sort out the return data. + var text1_a = hm[0]; + var text1_b = hm[1]; + var text2_a = hm[2]; + var text2_b = hm[3]; + var mid_common = hm[4]; + // Send both pairs off for separate processing. + var diff_a = diff_main(text1_a, text2_a, checklines); + var diff_b = diff_main(text1_b, text2_b, checklines); + // Merge the results. + diff = diff_a.concat([[0, mid_common]], diff_b); + } else { + // Perform a real diff. + if (checklines && text1.length + text2.length < 250) + checklines = false; // Too trivial for the overhead. + if (checklines) { + // Scan the text on a line-by-line basis first. + a = diff_lines2chars(text1, text2); + text1 = a[0]; + text2 = a[1]; + var linearray = a[2]; + } + diff = diff_map(text1, text2); + if (!diff) // No acceptable result. + diff = [[-1, text1], [1, text2]]; + if (checklines) { + diff_chars2lines(diff, linearray); // Convert the diff back to original text. + diff_cleanup_semantic(diff); // Eliminate freak matches (e.g. blank lines) + + // Rediff any replacement blocks, this time on character-by-character basis. + diff.push([0, '']); // Add a dummy entry at the end. + var pointer = 0; + var count_delete = 0; + var count_insert = 0; + var text_delete = ''; + var text_insert = ''; + while(pointer < diff.length) { + if (diff[pointer][0] == 1) { + count_insert++; + text_insert += diff[pointer][1]; + } else if (diff[pointer][0] == -1) { + count_delete++; + text_delete += diff[pointer][1]; + } else { // Upon reaching an equality, check for prior redundancies. + if (count_delete >= 1 && count_insert >= 1) { + // Delete the offending records and add the merged ones. + a = diff_main(text_delete, text_insert, false); + diff.splice(pointer - count_delete - count_insert, count_delete + count_insert); + pointer = pointer - count_delete - count_insert; + for (i=a.length-1; i>=0; i--) + diff.splice(pointer, 0, a[i]); + pointer = pointer + a.length; + } + count_insert = 0; + count_delete = 0; + text_delete = ''; + text_insert = ''; + } + pointer++; + } + diff.pop(); // Remove the dummy entry at the end. + + } + } + } + + if (commonprefix) + diff.unshift([0, commonprefix]); + if (commonsuffix) + diff.push([0, commonsuffix]); + diff_cleanup_merge(diff); + return diff; +} + + +function diff_lines2chars(text1, text2) { + // Split text into an array of strings. + // Reduce the texts to a string of hashes where each character represents one line. + var linearray = new Array(); // linearray[4] == "Hello\n" + var linehash = new Object(); // linehash["Hello\n"] == 4 + + // "\x00" is a valid JavaScript character, but the Venkman debugger doesn't like it (bug 335098) + // So we'll insert a junk entry to avoid generating a null character. + linearray.push(''); + + function diff_lines2chars_munge(text) { + // My first ever closure! + var i, line; + var chars = ''; + while (text) { + i = text.indexOf('\n'); + if (i == -1) + i = text.length; + line = text.substring(0, i+1); + text = text.substring(i+1); + if (linehash.hasOwnProperty ? linehash.hasOwnProperty(line) : (linehash[line] !== undefined)) { + chars += String.fromCharCode(linehash[line]); + } else { + linearray.push(line); + linehash[line] = linearray.length - 1; + chars += String.fromCharCode(linearray.length - 1); + } + } + return chars; + } + + var chars1 = diff_lines2chars_munge(text1); + var chars2 = diff_lines2chars_munge(text2); + return [chars1, chars2, linearray]; +} + + +function diff_chars2lines(diff, linearray) { + // Rehydrate the text in a diff from a string of line hashes to real lines of text. + var chars, text; + for (var x=0; x 0 && now.getTime() > ms_end) // Timeout reached + return null; + + // Walk the front path one step. + v_map1[d] = new Object(); + for (var k=-d; k<=d; k+=2) { + if (k == -d || k != d && v1[k-1] < v1[k+1]) + x = v1[k+1]; + else + x = v1[k-1]+1; + y = x - k; + footstep = x+","+y; + if (front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined))) + done = true; + if (!front) + footsteps[footstep] = d; + while (!done && x < text1.length && y < text2.length && text1.charAt(x) == text2.charAt(y)) { + x++; y++; + footstep = x+","+y; + if (front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined))) + done = true; + if (!front) + footsteps[footstep] = d; + } + v1[k] = x; + v_map1[d][x+","+y] = true; + if (done) { + // Front path ran over reverse path. + v_map2 = v_map2.slice(0, footsteps[footstep]+1); + var a = diff_path1(v_map1, text1.substring(0, x), text2.substring(0, y)); + return a.concat(diff_path2(v_map2, text1.substring(x), text2.substring(y))); + } + } + + // Walk the reverse path one step. + v_map2[d] = new Object(); + for (var k=-d; k<=d; k+=2) { + if (k == -d || k != d && v2[k-1] < v2[k+1]) + x = v2[k+1]; + else + x = v2[k-1]+1; + y = x - k; + footstep = (text1.length-x)+","+(text2.length-y); + if (!front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined))) + done = true; + if (front) + footsteps[footstep] = d; + while (!done && x < text1.length && y < text2.length && text1.charAt(text1.length-x-1) == text2.charAt(text2.length-y-1)) { + x++; y++; + footstep = (text1.length-x)+","+(text2.length-y); + if (!front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined))) + done = true; + if (front) + footsteps[footstep] = d; + } + v2[k] = x; + v_map2[d][x+","+y] = true; + if (done) { + // Reverse path ran over front path. + v_map1 = v_map1.slice(0, footsteps[footstep]+1); + var a = diff_path1(v_map1, text1.substring(0, text1.length-x), text2.substring(0, text2.length-y)); + return a.concat(diff_path2(v_map2, text1.substring(text1.length-x), text2.substring(text2.length-y))); + } + } + } + // Number of diffs equals number of characters, no commonality at all. + return null; +} + + +function diff_path1(v_map, text1, text2) { + // Work from the middle back to the start to determine the path. + var path = []; + var x = text1.length; + var y = text2.length; + var last_op = null; + for (var d=v_map.length-2; d>=0; d--) { + while(1) { + if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty((x-1)+","+y) : (v_map[d][(x-1)+","+y] !== undefined)) { + x--; + if (last_op === -1) + path[0][1] = text1.charAt(x) + path[0][1]; + else + path.unshift([-1, text1.charAt(x)]); + last_op = -1; + break; + } else if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty(x+","+(y-1)) : (v_map[d][x+","+(y-1)] !== undefined)) { + y--; + if (last_op === 1) + path[0][1] = text2.charAt(y) + path[0][1]; + else + path.unshift([1, text2.charAt(y)]); + last_op = 1; + break; + } else { + x--; + y--; + //if (text1.charAt(x) != text2.charAt(y)) + // return alert("No diagonal. Can't happen. (diff_path1)"); + if (last_op === 0) + path[0][1] = text1.charAt(x) + path[0][1]; + else + path.unshift([0, text1.charAt(x)]); + last_op = 0; + } + } + } + return path; +} + + +function diff_path2(v_map, text1, text2) { + // Work from the middle back to the end to determine the path. + var path = []; + var x = text1.length; + var y = text2.length; + var last_op = null; + for (var d=v_map.length-2; d>=0; d--) { + while(1) { + if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty((x-1)+","+y) : (v_map[d][(x-1)+","+y] !== undefined)) { + x--; + if (last_op === -1) + path[path.length-1][1] += text1.charAt(text1.length-x-1); + else + path.push([-1, text1.charAt(text1.length-x-1)]); + last_op = -1; + break; + } else if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty(x+","+(y-1)) : (v_map[d][x+","+(y-1)] !== undefined)) { + y--; + if (last_op === 1) + path[path.length-1][1] += text2.charAt(text2.length-y-1); + else + path.push([1, text2.charAt(text2.length-y-1)]); + last_op = 1; + break; + } else { + x--; + y--; + //if (text1.charAt(text1.length-x-1) != text2.charAt(text2.length-y-1)) + // return alert("No diagonal. Can't happen. (diff_path2)"); + if (last_op === 0) + path[path.length-1][1] += text1.charAt(text1.length-x-1); + else + path.push([0, text1.charAt(text1.length-x-1)]); + last_op = 0; + } + } + } + return path; +} + + +function diff_prefix(text1, text2) { + // Trim off common prefix + var pointermin = 0; + var pointermax = Math.min(text1.length, text2.length); + var pointermid = pointermax; + while(pointermin < pointermid) { + if (text1.substring(0, pointermid) == text2.substring(0, pointermid)) + pointermin = pointermid; + else + pointermax = pointermid; + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + var commonprefix = text1.substring(0, pointermid); + text1 = text1.substring(pointermid); + text2 = text2.substring(pointermid); + return [text1, text2, commonprefix]; +} + + +function diff_suffix(text1, text2) { + // Trim off common suffix + var pointermin = 0; + var pointermax = Math.min(text1.length, text2.length); + var pointermid = pointermax; + while(pointermin < pointermid) { + if (text1.substring(text1.length-pointermid) == text2.substring(text2.length-pointermid)) + pointermin = pointermid; + else + pointermax = pointermid; + pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin); + } + var commonsuffix = text1.substring(text1.length-pointermid); + text1 = text1.substring(0, text1.length-pointermid); + text2 = text2.substring(0, text2.length-pointermid); + return [text1, text2, commonsuffix]; +} + + +function diff_halfmatch(text1, text2) { + // Do the two texts share a substring which is at least half the length of the longer text? + var longtext = text1.length > text2.length ? text1 : text2; + var shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 10 || shorttext.length < 1) + return null; // Pointless. + + function diff_halfmatch_i(longtext, shorttext, i) { + // Start with a 1/4 length substring at position i as a seed. + var seed = longtext.substring(i, i+Math.floor(longtext.length/4)); + var j = -1; + var best_common = ''; + var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b; + while ((j = shorttext.indexOf(seed, j+1)) != -1) { + var my_prefix = diff_prefix(longtext.substring(i), shorttext.substring(j)); + var my_suffix = diff_suffix(longtext.substring(0, i), shorttext.substring(0, j)); + if (best_common.length < (my_suffix[2] + my_prefix[2]).length) { + best_common = my_suffix[2] + my_prefix[2]; + best_longtext_a = my_suffix[0]; + best_longtext_b = my_prefix[0]; + best_shorttext_a = my_suffix[1]; + best_shorttext_b = my_prefix[1]; + } + } + if (best_common.length >= longtext.length/2) + return [best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b, best_common]; + else + return null; + } + + // First check if the second quarter is the seed for a half-match. + var hm1 = diff_halfmatch_i(longtext, shorttext, Math.ceil(longtext.length/4)); + // Check again based on the third quarter. + var hm2 = diff_halfmatch_i(longtext, shorttext, Math.ceil(longtext.length/2)); + var hm; + if (!hm1 && !hm2) + return null; + else if (!hm2) + hm = hm1; + else if (!hm1) + hm = hm2; + else // Both matched. Select the longest. + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + + // A half-match was found, sort out the return data. + if (text1.length > text2.length) { + var text1_a = hm[0]; + var text1_b = hm[1]; + var text2_a = hm[2]; + var text2_b = hm[3]; + } else { + var text2_a = hm[0]; + var text2_b = hm[1]; + var text1_a = hm[2]; + var text1_b = hm[3]; + } + var mid_common = hm[4]; + return [text1_a, text1_b, text2_a, text2_b, mid_common]; +} + + +function diff_cleanup_semantic(diff) { + // Reduce the number of edits by eliminating semantically trivial equalities. + var changes = false; + var equalities = []; // Stack of indices where equalities are found. + var lastequality = null; // Always equal to equalities[equalities.length-1][1] + var pointer = 0; // Index of current position. + var length_changes1 = 0; // Number of characters that changed prior to the equality. + var length_changes2 = 0; // Number of characters that changed after the equality. + while (pointer < diff.length) { + if (diff[pointer][0] == 0) { // equality found + equalities.push(pointer); + length_changes1 = length_changes2; + length_changes2 = 0; + lastequality = diff[pointer][1]; + } else { // an insertion or deletion + length_changes2 += diff[pointer][1].length; + if (lastequality != null && (lastequality.length <= length_changes1) && (lastequality.length <= length_changes2)) { + //alert("Splitting: '"+lastequality+"'"); + diff.splice(equalities[equalities.length-1], 0, [-1, lastequality]); // Duplicate record + diff[equalities[equalities.length-1]+1][0] = 1; // Change second copy to insert. + equalities.pop(); // Throw away the equality we just deleted; + equalities.pop(); // Throw away the previous equality; + pointer = equalities.length ? equalities[equalities.length-1] : -1; + length_changes1 = 0; // Reset the counters. + length_changes2 = 0; + lastequality = null; + changes = true; + } + } + pointer++; + } + + if (changes) + diff_cleanup_merge(diff); +} + + +function diff_cleanup_efficiency(diff) { + // Reduce the number of edits by eliminating operationally trivial equalities. + var changes = false; + var equalities = []; // Stack of indices where equalities are found. + var lastequality = ''; // Always equal to equalities[equalities.length-1][1] + var pointer = 0; // Index of current position. + var pre_ins = false; // Is there an insertion operation before the last equality. + var pre_del = false; // Is there an deletion operation before the last equality. + var post_ins = false; // Is there an insertion operation after the last equality. + var post_del = false; // Is there an deletion operation after the last equality. + while (pointer < diff.length) { + if (diff[pointer][0] == 0) { // equality found + if (diff[pointer][1].length < DIFF_EDIT_COST && (post_ins || post_del)) { + // Candidate found. + equalities.push(pointer); + pre_ins = post_ins; + pre_del = post_del; + lastequality = diff[pointer][1]; + } else { + // Not a candidate, and can never become one. + equalities = []; + lastequality = ''; + } + post_ins = post_del = false; + } else { // an insertion or deletion + if (diff[pointer][0] == -1) + post_del = true; + else + post_ins = true; + // Five types to be split: + // ABXYCD + // AXCD + // ABXC + // AXCD + // ABXC + if (lastequality && ((pre_ins && pre_del && post_ins && post_del) || ((lastequality.length < DIFF_EDIT_COST/2) && (pre_ins + pre_del + post_ins + post_del) == 3))) { + //alert("Splitting: '"+lastequality+"'"); + diff.splice(equalities[equalities.length-1], 0, [-1, lastequality]); // Duplicate record + diff[equalities[equalities.length-1]+1][0] = 1; // Change second copy to insert. + equalities.pop(); // Throw away the equality we just deleted; + lastequality = ''; + if (pre_ins && pre_del) { + // No changes made which could affect previous entry, keep going. + post_ins = post_del = true; + equalities = []; + } else { + equalities.pop(); // Throw away the previous equality; + pointer = equalities.length ? equalities[equalities.length-1] : -1; + post_ins = post_del = false; + } + changes = true; + } + } + pointer++; + } + + if (changes) + diff_cleanup_merge(diff); +} + + +function diff_cleanup_merge(diff) { + // Reorder and merge like edit sections. Merge equalities. + // Any edit section can move as long as it doesn't cross an equality. + diff.push([0, '']); // Add a dummy entry at the end. + var pointer = 0; + var count_delete = 0; + var count_insert = 0; + var text_delete = ''; + var text_insert = ''; + var record_insert, record_delete; + var my_xfix; + while(pointer < diff.length) { + if (diff[pointer][0] == 1) { + count_insert++; + text_insert += diff[pointer][1]; + pointer++; + } else if (diff[pointer][0] == -1) { + count_delete++; + text_delete += diff[pointer][1]; + pointer++; + } else { // Upon reaching an equality, check for prior redundancies. + if (count_delete > 1 || count_insert > 1) { + if (count_delete > 1 && count_insert > 1) { + // Factor out any common prefixies. + my_xfix = diff_prefix(text_insert, text_delete); + if (my_xfix[2] != '') { + if ((pointer - count_delete - count_insert) > 0 && diff[pointer - count_delete - count_insert - 1][0] == 0) { + text_insert = my_xfix[0]; + text_delete = my_xfix[1]; + diff[pointer - count_delete - count_insert - 1][1] += my_xfix[2]; + } + } + // Factor out any common suffixies. + my_xfix = diff_suffix(text_insert, text_delete); + if (my_xfix[2] != '') { + text_insert = my_xfix[0]; + text_delete = my_xfix[1]; + diff[pointer][1] = my_xfix[2] + diff[pointer][1]; + } + } + // Delete the offending records and add the merged ones. + if (count_delete == 0) + diff.splice(pointer - count_delete - count_insert, count_delete + count_insert, [1, text_insert]); + else if (count_insert == 0) + diff.splice(pointer - count_delete - count_insert, count_delete + count_insert, [-1, text_delete]); + else + diff.splice(pointer - count_delete - count_insert, count_delete + count_insert, [-1, text_delete], [1, text_insert]); + pointer = pointer - count_delete - count_insert + (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1; + } else if (pointer != 0 && diff[pointer-1][0] == 0) { + // Merge this equality with the previous one. + diff[pointer-1][1] += diff[pointer][1]; + diff.splice(pointer, 1); + } else { + pointer++; + } + count_insert = 0; + count_delete = 0; + text_delete = ''; + text_insert = ''; + } + } + if (diff[diff.length-1][1] == '') + diff.pop(); // Remove the dummy entry at the end. +} + + +function diff_addindex(diff) { + // Add an index to each tuple, represents where the tuple is located in text2. + // e.g. [[-1, 'h', 0], [1, 'c', 0], [0, 'at', 1]] + var i = 0; + for (var x=0; x1, 5->8 + var chars1 = 0; + var chars2 = 0; + var last_chars1 = 0; + var last_chars2 = 0; + for (var x=0; x loc) // Overshot the location. + break; + last_chars1 = chars1; + last_chars2 = chars2; + } + if (diff.length != x && diff[x][0] == -1) // The location was deleted. + return last_chars2; + // Add the remaining character length. + return last_chars2 + (loc - last_chars1); +} + + +function diff_prettyhtml(diff) { + // Convert a diff array into a pretty HTML report. + diff_addindex(diff); + var html = ''; + for (var x=0; x/g, ">"); + t = t.replace(/\n/g, "¶
"); + if (m == -1) + html += ""+t+""; + else if (m == 1) + html += ""+t+""; + else + html += ""+t+""; + } + return html; +} + + + ////////////////////////////////////////////////////////////////////// + // Match // +////////////////////////////////////////////////////////////////////// + + +function match_getmaxbits() { + // Compute the number of bits in an int. + // The normal answer for JavaScript is 32. + var maxbits = 0; + var oldi = 1; + var newi = 2; + while (oldi != newi) { + maxbits++; + oldi = newi; + newi = newi << 1; + } + return maxbits; +} +var MATCH_MAXBITS = match_getmaxbits(); + + +function match_main(text, pattern, loc) { + // Locate the best instance of 'pattern' in 'text' near 'loc'. + loc = Math.max(0, Math.min(loc, text.length-pattern.length)); + if (text == pattern) { + // Shortcut (potentially not guaranteed by the algorithm) + return 0; + } else if (text.length == 0) { + // Nothing to match. + return null; + } else if (text.substring(loc, loc + pattern.length) == pattern) { + // Perfect match at the perfect spot! (Includes case of null pattern) + return loc; + } else { + // Do a fuzzy compare. + var match = match_bitap(text, pattern, loc); + return match; + } +} + + +function match_bitap(text, pattern, loc) { + // Locate the best instance of 'pattern' in 'text' near 'loc' using the Bitap algorithm. + if (pattern.length > MATCH_MAXBITS) + return alert("Pattern too long for this browser."); + + // Initialise the alphabet. + var s = match_alphabet(pattern); + + var score_text_length = text.length; + // Coerce the text length between reasonable maximums and minimums. + score_text_length = Math.max(score_text_length, MATCH_MINLENGTH); + score_text_length = Math.min(score_text_length, MATCH_MAXLENGTH); + + function match_bitap_score (e, x) { + // Compute and return the score for a match with e errors and x location. + var d = Math.abs(loc-x); + return (e / pattern.length / MATCH_BALANCE) + (d / score_text_length / (1.0 - MATCH_BALANCE)); + } + + // Highest score beyond which we give up. + var score_threshold = MATCH_THRESHOLD; + // Is there a nearby exact match? (speedup) + var best_loc = text.indexOf(pattern, loc); + if (best_loc != -1) + score_threshold = Math.min(match_bitap_score(0, best_loc), score_threshold); + // What about in the other direction? (speedup) + best_loc = text.lastIndexOf(pattern, loc+pattern.length); + if (best_loc != -1) + score_threshold = Math.min(match_bitap_score(0, best_loc), score_threshold); + + // Initialise the bit arrays. + var r = Array(); + var d = -1; + var matchmask = Math.pow(2, pattern.length-1); + best_loc = null; + + var bin_min, bin_mid; + var bin_max = Math.max(loc+loc, text.length); + var last_rd; + for (var d=0; d=start; j--) { + // The alphabet (s) is a sparse hash, so the following lines generate warnings. + if (d == 0) // First pass: exact match. + rd[j] = ((rd[j+1] << 1) | 1) & s[text.charAt(j)]; + else // Subsequent passes: fuzzy match. + rd[j] = ((rd[j+1] << 1) | 1) & s[text.charAt(j)] | ((last_rd[j+1] << 1) | 1) | ((last_rd[j] << 1) | 1) | last_rd[j+1]; + if (rd[j] & matchmask) { + var score = match_bitap_score(d, j); + // This match will almost certainly be better than any existing match. But check anyway. + if (score <= score_threshold) { + // Told you so. + score_threshold = score; + best_loc = j; + if (j > loc) { + // When passing loc, don't exceed our current distance from loc. + start = Math.max(0, loc - (j - loc)); + } else { + // Already passed loc, downhill from here on in. + break; + } + } + } + } + if (match_bitap_score(d+1, loc) > score_threshold) // No hope for a (better) match at greater error levels. + break; + last_rd = rd; + } + return best_loc; +} + + +function match_alphabet(pattern) { + // Initialise the alphabet for the Bitap algorithm. + var s = Object(); + for (var i=0; i 2) { + diff_cleanup_semantic(diff); + diff_cleanup_efficiency(diff); + } + } + if (diff.length == 0) + return []; // Get rid of the null case. + var patches = []; + var patch = new patch_obj(); + var char_count1 = 0; // Number of characters into the text1 string. + var char_count2 = 0; // Number of characters into the text2 string. + var last_type = null; + var prepatch_text = text1; // Recreate the patches to determine context info. + var postpatch_text = text1; + for (var x=0; x= 2*PATCH_MARGIN) { + // Time for a new patch. + if (patch.diffs.length != 0) { + patch_addcontext(patch, prepatch_text); + patches.push(patch); + var patch = new patch_obj(); + last_type = null; + prepatch_text = postpatch_text; + } + } + + // Update the current character count. + if (diff_type != 1) + char_count1 += diff_text.length; + if (diff_type != -1) + char_count2 += diff_text.length; + } + // Pick up the leftover patch if not empty. + if (patch.diffs.length != 0) { + patch_addcontext(patch, prepatch_text); + patches.push(patch); + } + + return patches; +} + + +function patch_apply(patches, text) { + // Merge a set of patches onto the text. + // Return a patched text, as well as a list of true/false values indicating which patches were applied. + patch_splitmax(patches); + var results = []; + var delta = 0; + var expected_loc, start_loc; + var text1, text2; + var diff, mod, index1, index2; + for (var x=0; x MATCH_MAXBITS) { + bigpatch = patches[x]; + // Remove the big old patch. + patches.splice(x, 1); + patch_size = MATCH_MAXBITS; + start1 = bigpatch.start1; + start2 = bigpatch.start2; + precontext = ''; + while (bigpatch.diffs.length != 0) { + // Create one of several smaller patches. + patch = new patch_obj(); + empty = true; + patch.start1 = start1 - precontext.length; + patch.start2 = start2 - precontext.length; + if (precontext != '') { + patch.length1 = patch.length2 = precontext.length; + patch.diffs.push([0, precontext]); + } + while (bigpatch.diffs.length != 0 && patch.length1 < patch_size - PATCH_MARGIN) { + diff_type = bigpatch.diffs[0][0]; + diff_text = bigpatch.diffs[0][1]; + if (diff_type == 1) { + // Insertions are harmless. + patch.length2 += diff_text.length; + start2 += diff_text.length; + patch.diffs.push(bigpatch.diffs.shift()); + empty = false; + } else { + // Deletion or equality. Only take as much as we can stomach. + diff_text = diff_text.substring(0, patch_size - patch.length1 - PATCH_MARGIN); + patch.length1 += diff_text.length; + start1 += diff_text.length; + if (diff_type == 0) { + patch.length2 += diff_text.length; + start2 += diff_text.length; + } else { + empty = false; + } + patch.diffs.push([diff_type, diff_text]); + if (diff_text == bigpatch.diffs[0][1]) + bigpatch.diffs.shift(); + else + bigpatch.diffs[0][1] = bigpatch.diffs[0][1].substring(diff_text.length); + } + } + // Compute the head context for the next patch. + precontext = patch.text2(); + precontext = precontext.substring(precontext.length - PATCH_MARGIN); + // Append the end context for this patch. + postcontext = bigpatch.text1().substring(0, PATCH_MARGIN); + if (postcontext != '') { + patch.length1 += postcontext.length; + patch.length2 += postcontext.length; + if (patch.diffs.length > 0 && patch.diffs[patch.diffs.length-1][0] == 0) + patch.diffs[patch.diffs.length-1][1] += postcontext; + else + patch.diffs.push([0, postcontext]); + } + if (!empty) + patches.splice(x++, 0, patch); + } + } + } +} + + +function patch_totext(patches) { + // Take a list of patches and return a textual representation. + var text = ''; + for (var x=0; x#+*g!o%lCtD@cz8l? zx@C{wCodDf2?TZ&Ww46PQZJ;6HbgF) J&uDZ606X)4Hvs?u literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/directionality/images/rtl.gif b/public/javascripts/tiny_mce/plugins/directionality/images/rtl.gif new file mode 100755 index 0000000000000000000000000000000000000000..0348f9965669dd9cfba3c69d71d20ea3928e46fe GIT binary patch literal 153 zcwPaS0A~M3Nk%w1VH5xq0K*Lc6&4jPQl5&6in_+zPfbr=jNa1D%1Uy=K0H3Nv#n}w zX?>#YH($5z?CQtO-2eapA^8LW000jFEC2ui02BZe000C=@X1N5y*TU5yU$K@847`% z$mA5FC73`GOG9yB3IYHR|EvoJCQ;(~3X4J@W03VE4#r`rF-`^yYR0P4Vz}3jcuX#v H%@F`Q*OWXP literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/directionality/langs/en.js b/public/javascripts/tiny_mce/plugins/directionality/langs/en.js new file mode 100755 index 0000000..a1db297 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/directionality/langs/en.js @@ -0,0 +1,6 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Direction left to right', +directionality_rtl_desc : 'Direction right to left' +}); diff --git a/public/javascripts/tiny_mce/plugins/directionality/readme.txt b/public/javascripts/tiny_mce/plugins/directionality/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/directionality/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/emotions/editor_plugin.js b/public/javascripts/tiny_mce/plugins/emotions/editor_plugin.js new file mode 100755 index 0000000..64ede7a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/emotions/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('emotions');var TinyMCE_EmotionsPlugin={getInfo:function(){return{longname:'Emotions',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_emotions.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"emotions":return tinyMCE.getButtonHTML(cn,'lang_emotions_desc','{$pluginurl}/images/emotions.gif','mceEmotion')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceEmotion":var template=new Array();template['file']='../../plugins/emotions/emotions.htm';template['width']=160;template['height']=160;template['width']+=tinyMCE.getLang('lang_emotions_delta_width',0);template['height']+=tinyMCE.getLang('lang_emotions_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true}return false}};tinyMCE.addPlugin('emotions',TinyMCE_EmotionsPlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/emotions/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/emotions/editor_plugin_src.js new file mode 100755 index 0000000..f5bedfa --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/emotions/editor_plugin_src.js @@ -0,0 +1,63 @@ +/** + * $Id: editor_plugin_src.js 126 2006-10-22 16:19:55Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('emotions'); + +// Plucin static class +var TinyMCE_EmotionsPlugin = { + getInfo : function() { + return { + longname : 'Emotions', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_emotions.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + /** + * Returns the HTML contents of the emotions control. + */ + getControlHTML : function(cn) { + switch (cn) { + case "emotions": + return tinyMCE.getButtonHTML(cn, 'lang_emotions_desc', '{$pluginurl}/images/emotions.gif', 'mceEmotion'); + } + + return ""; + }, + + /** + * Executes the mceEmotion command. + */ + execCommand : function(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceEmotion": + var template = new Array(); + + template['file'] = '../../plugins/emotions/emotions.htm'; // Relative to theme + template['width'] = 160; + template['height'] = 160; + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_emotions_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_emotions_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + + return true; + } + + // Pass to next handler in chain + return false; + } +}; + +// Register plugin +tinyMCE.addPlugin('emotions', TinyMCE_EmotionsPlugin); diff --git a/public/javascripts/tiny_mce/plugins/emotions/emotions.htm b/public/javascripts/tiny_mce/plugins/emotions/emotions.htm new file mode 100755 index 0000000..fca8ffa --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/emotions/emotions.htm @@ -0,0 +1,40 @@ + + + {$lang_emotions_title} + + + + + +
+
{$lang_emotions_title}:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang_emotions_cool}{$lang_emotions_cry}{$lang_emotions_embarassed}{$lang_emotions_foot_in_mouth}
{$lang_emotions_frown}{$lang_emotions_innocent}{$lang_emotions_kiss}{$lang_emotions_laughing}
{$lang_emotions_money_mouth}{$lang_emotions_sealed}{$lang_emotions_smile}{$lang_emotions_surprised}
{$lang_emotions_tongue-out}{$lang_emotions_undecided}{$lang_emotions_wink}{$lang_emotions_yell}
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/emotions.gif b/public/javascripts/tiny_mce/plugins/emotions/images/emotions.gif new file mode 100755 index 0000000000000000000000000000000000000000..a39ed8ec3807e9da5725bfffc1a9e64694156d7a GIT binary patch literal 319 zcwPZN0l@x8Nk%w1VH5xq0K@SR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UVAU=FH^0ssI2A^8LW0018VEC2ui02BZe000HN;3tk`X`W~*8ky&1hAI-vg-8-| zEks&5h|Pq-m~0S^%E^$BOfDB9bRtQ_N((2Wp&)XLl10f-*kCXU#W{W66t1ESVsh>@ z>UYcpks)Qz7z_^&90LO!h#O)fe}agQh=&u4aR>|p9*~G00}m5@BV-I50v!p62^|6) z3~wY94jY3V0JQ)egBuPMV+pbk4gvxWxmG6{2?&9M3>XLr8Yu=21x7*z4sa+G1{w|y R8V0;FA_3+BKx}s1_F$4FCWDA^8LW0018VEC2ui01^Na000Hw;3tYzX_jM3Qpv$_M?zI9i5=0S zX-{-uv=l3%&P0s%m9Ox_a(m_c|u z01g3U0`Wll5)poVdma=N8y<3f0Sf~hXmTC}2oxMW4FdxUj+z4<0}lrX2nP=qkDRIt z9Ge*(qzMrj3jrIOjvI{`5eWzt3`G_T8yChG8w(a19SkK12@M(+799Zr9n=~PzBCmA z5)BU-)YKUd4H5!D9|!^o9kWIe9SH(WDHRk92}DZ?3})2$P@$55g90f0N)ZA8JID5J Aw*UYD literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/smiley-cry.gif b/public/javascripts/tiny_mce/plugins/emotions/images/smiley-cry.gif new file mode 100755 index 0000000000000000000000000000000000000000..74d897a4f6d22e814e2b054e98b8a75fb464b4be GIT binary patch literal 329 zcwPZX0k-}}Nk%w1VG;lm0Mr-&E)xPSit@9T3%;vR+|V+?t0A(pllJjXrMl7n=_A_a za^B+Su$LjvyC3@TIQZNZa##w=!k(SO^P#bO*w(eU#;{U83XFCU_V)J5wrb+;g2vkN z#>U24qVoOvY5)KLA^8LW0018VEC2ui01^Na000HX;3tY$X_jM3QUfCh%s^o(nF++< zc?Th6v=oL>*by8K!mhvwelUXuuW&&U9iGO3hM@>Njw{l^#0q9mWpcefdI;O$;efnY zkd~@r-o$*74FCWI1%d((4+jDz0va0>69^fI6%`W{8w!gU1pyL>prH>E0R<%k6Aq%H z4ij+^9TEwM5P}eh2@)L<~6+>@EpxfA0YrcPNsSu literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/smiley-embarassed.gif b/public/javascripts/tiny_mce/plugins/emotions/images/smiley-embarassed.gif new file mode 100755 index 0000000000000000000000000000000000000000..963a96b8a7593b1d8bcbab073abe5ee4e539dbf6 GIT binary patch literal 331 zcwPZZ0kr-{Nk%w1VG;lm0MrryDh>j~yq&6%75dW~z^P39(NxsGDE{UkxtkIEq(S-a zRKlwv+S=Lr?>hbYY~sQ?c3T&ZcN_Nh_EU3s(>Io6B&>WW`@bsw**)Ocy1bht z{*G6|uwwqUQ2+n{A^8LW0018VEC2ui01^Na000HZ;3tYwX_jM3YQ!c88=*-m*&&bO zILd=`w3KAC;8hxpif*w9ek6oqV-Z0L77fROK$BSR@5BAv-%C>6y>>#+D4e#&nz^qMDItlpp zTG728+|V&?R13PIEBW(C`uh6d*t-1sZ^XQv;oDD}iYLOV7uVO;{`xl4#4tJ{0;h@! z>)kfFn;iS@Hvj+tA^8LW0018VEC2ui01^Na000Hm;3tYuX_jM3Mo7199TGt*Nf;R= zNmOPKwA8_2Q6MTDP6eT`I1VESVj-zGIG(JdB3U44kcdI@;AAq{Gv^^O%%ltj2GdB) z>vIL;d*~=0a|w1Bf^!cF9R~+vb94;_0}TxWlnMrlj2MuVoSYAreF`3(0|pHS8VLgr zi3bP_qZ;q#>Sw62=mns-On=0wransPVevT^YK{Dy(0YY zH)vE6x0?;Wqb>gZas1^OT0si>`ugD5y87}*#H$s=yq(wA*8cf7{`y+(+9J7|9QfT7 z`ROHiU=Y&6FaQ7mA^8LW0018VEC2ui01^Na000Hi;3tYvX_jM3N`@u~nju9hSuh^r zIEcp-wA7(NL0~2d#RP+(G!CPPA>o*KJjv_CkucCA5=K?AfF#RG2V*8BU@jL304|4P z2;PGRF@bj$et;Jf2pR_mVsIA<85|n}kQ*Bq42Ovqj*yy>6P0=h3X&9Z01yyk~2N4w%7#RW^55W%`0vQ+-6(y_*2pqz~90*;x9}yM}%$UI(7t#$D mK_3Se1{4HKM+6iG7EmeH6$V631{L5n)#CyC0qx-*Apkoyg?w!Q literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/smiley-innocent.gif b/public/javascripts/tiny_mce/plugins/emotions/images/smiley-innocent.gif new file mode 100755 index 0000000000000000000000000000000000000000..334d49e0e60f2997c9ba24071764f95d9e08a5cc GIT binary patch literal 336 zcwPZe0k8f?Nk%w1VG;lm0MrryI4TI-%dP0m5~*+Y`T~ z7Rth){q{I_X%*S48uRZ|(b3V&wIKTX`u+WJzo<^$#wuY;3W|Cf{O29IkTAcaE&lpe z+P*^H)-tknA^-pYA^8LW0018VEC2ui01^Na000He;3tYwX_n)75QgVvNQ`6#5gcMm zEEG~blgXokptKAJgCU?%JT?yos!R6cPtcQWh2siHlNI2L}ifQhgX02^InZ2?-ktkqVRyZJY^Trk|lv zovp437?1~d46O)?2(1i+2NDYk8<+_Kil!K!3njA^!I#dL8x<729}*B65mC=m5gHH@ iDi9P3f*VjB3KS4HDb_qqRul{0DIT=Nk%w1VG;lm0Mrx!QauaC#>Vb6G=_5=^YB^9wrc376Sb5I-qJGf@9vZ# z5WlKU(!eVB+7tfnDXp0zyB`?BZ5IChalob*`uh6d*t+@dKGHcU+L|83yq*5~IoH?L zy`?Gp<{bX|SpWb4A^8LW0018VEC2ui01^Na000Hg;3tYyX_jM3R?Bl7&r(q;SsVx< zNd$5fv{ZsKA$SlL3&KN~a1tZRf*~1Ltkx9~2uL3&z-yb0WJDRY082|tP literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/smiley-laughing.gif b/public/javascripts/tiny_mce/plugins/emotions/images/smiley-laughing.gif new file mode 100755 index 0000000000000000000000000000000000000000..1606c119e75678c4031f384e0d50849906e8f533 GIT binary patch literal 344 zcwPZm0jK^)Nk%w1VG;lm0MruzQauf>s;1-69HWK?p_PpF=Pd8~Ygtcnp*fHAL z**;z>w3iC}`fmL6IkKB1N;3zEa}&zKpsu1;_V)HocR5-{J~BcYvE`YXhBnc@CfU=! za(Ec zG>66zv=rqr;2j)}gKqE$ekcSD?}0=WLB?AWp85)qALd+P=4)6X4oXy{bw2>K^d$ z@6ERvva+(4ib~41YUkTEn1&#?rzrOHT>1I=Y*h`+%*@WtPUPg|!@EEI_d5LgZ>^Og z-qyCjsu$J9F8}}lA^8LW0018VEC2ui01^Na000HT;3tYxX_jM37RWXX8&XUv=@{Oj zX@_Sxw3H&!kzgQ?2LvPOL=>Y5VxieY9+_+eqFEql6OKWXd3Ze8Ggf2Zln@U|mI9d9 zGm^(wVUTA5cYs-V1`2#+a})^z6chrF5`~8k5e6@pmkW`GeGw<069yTQaGnH)s0suV zR|pCd0ZtRCsjM9VB^L+~7X%f*zyuc%2p3=#ycf#L%McYo9|{Z&5D^#_78qL%3{WW( X7Xb)FP6z?UH6ODVz!ev-DIowmgll^P literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/smiley-smile.gif b/public/javascripts/tiny_mce/plugins/emotions/images/smiley-smile.gif new file mode 100755 index 0000000000000000000000000000000000000000..e6a9e60d5ddd1243fbbf2197b4dc6cd9c1b58b93 GIT binary patch literal 345 zcwPZn0jB;(Nk%w1VG;lm0MrlwCJF+^#>SR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UVAU=FH^0ssI2A^8LW0018VEC2ui01^Na000Hn;3tYuX_jM3Mn>j&nGr!MNh}v4 zNyxPjwA7*EKx`%q#$Vl9SM>N9ReH-cn1&^4jYXf0KotqjT;UWC94U(4-NtX4#i!%9}pHA2?&dg3>XLr r8Wuqx2Nnhn1xrT-4h9xbDb^GQ8V(K`1{C5o)#U;I0p5-K5CQ-@9%ySnDDC*4*{OcpiwransPVevTQacIr@mkQp zCf(06s)_=>r7UYx48o@u`uh6d*t-7rH~ji<`P&oj;5Wp)o!8ga`SV6TA_BIW5#ZWV z{`*+__>9}pJ}3JDSl85wB_3Jn)Q o9|so(4+|I^92g4^1{Y8%(iR3pP6ig=HPPY$`~mLZA3^{CJDB=?L;wH) literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif b/public/javascripts/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif new file mode 100755 index 0000000000000000000000000000000000000000..2075dc16058f1f17912167675ce5cfb9986fc71d GIT binary patch literal 328 zcwPZW0k{4~Nk%w1VG;lm0Mrx!CJF+^#>SU@3-{U*rx+Q^wrc$ABfqLn@9*x?z8(4X zSW-O=@){bmmI~g|GQXoP);cvj3|f1M8e@{G*!tYaiCEujj1NGxRN#6#tiCETo+{x{Hkzt z5k-kPvcD=V2nbmjCgL6k{uF&2nP-t0s;w<385Nx2oxDb z9T5Pp7qJl?3Kkh9oe2sCr5F$p7zPSlsUH*@54w*83=9Or4;w)r2pcU95(FL|1Th;< aDaRQH4;Tal7#Y$v#?=Au0pHUfApkpvZg^t= literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/smiley-undecided.gif b/public/javascripts/tiny_mce/plugins/emotions/images/smiley-undecided.gif new file mode 100755 index 0000000000000000000000000000000000000000..bef7e257303f8243c89787e7a7f9955dd1f112e2 GIT binary patch literal 337 zcwPZf0j~Z>Nk%w1VG;lm0MroxDi#99#>R?y8~4}{%C>6#>?OadPVevTr-=vi@LATn z4rERY-qJF+n+?CCE&B3D{{3Shh?>WT0o%`b%*Voqm`dL;(4F35y zc485^n;g!+Bme*aA^8LW0018VEC2ui01^Na000Hf;3tYvX_jM3N=AnuogqakNi<9X zK?&0kwA8^tNn{?C$|IAYI1ZzT!2>}iuMddFK#NEkRl!7%6brJAnUs;)XcnA}TNBSP zxQ9;SvEfwYeSaGd2^|LqU~(QF1qBxr3Ii7x84ZVt8wCTKoSYAqc?p`G2onnpk`IOl z1`HLGj}riN2p1K12N4z&8IBDc6tEWs859;JtRB6>lf+xO9}yT19toMv8wnl`7(pKg j7zPv!OGgY81{hE&(iR3pP6ig;HPPS!_yOwPA0Yrc)=Yf3 literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/smiley-wink.gif b/public/javascripts/tiny_mce/plugins/emotions/images/smiley-wink.gif new file mode 100755 index 0000000000000000000000000000000000000000..9faf1aff8f4b28e02f4f414975fe1859c43b6b54 GIT binary patch literal 351 zcwPZt0igazNk%w1VG;lm0MrryC=CL}#>Sn03F^-g-qAA3wransPV?|t@9*x%vmQ`7 z4E*pcw3rOOq%3t@4*K#({N^40{c-yG`rz2Q!KfI-yq*61HrBop*VoqW<}&{JS@_x# zwwfH#!YTdnIsgCwA^8LW0018VEC2ui01^Na000Ht;3tYwX_jM3P6j6koH0o%Sun&A zMF+tYv=pL2IcOdp&qH&dG!P?+ArV0)J)O=Yk}%LD6Go&#@MJn3he8=)%%lWOM*#pN zEDD9iq9J$@90v~;83`GC4i0+{2OJ0pVtacF5E}yn8<`pmkCBv_pqZEtoPY-l0}P>= z3WE6cr`19U7DgF9{F}at6R35*Q5~ x2OgBy9tRx_7(pKh7zPvsOGgA01{hE&-4zBzP6id}HMp@0Krnzkbss_i06S`>cdh^c literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/emotions/images/smiley-yell.gif b/public/javascripts/tiny_mce/plugins/emotions/images/smiley-yell.gif new file mode 100755 index 0000000000000000000000000000000000000000..648e6e879123fe49beebbc1f3635141864a79a9c GIT binary patch literal 336 zcwPZe0k8f?Nk%w1VG;lm0MrryG8O{K#>IbS7WCB_mWF$+hzY-{PWkp(?(Xf;zbH~P z3jOdj?W+^YwrakfE8fyG&5jTBz!3WS`fgM_;MltQ+c}4GO8)(E`S3`@yq&d~5!ct& z)v79NObo)O7XSbNA^8LW0018VEC2ui01^Na000He;3tYwX_jM3QifI(nn6h_*=Wyk zUB{y}v=qYOIUF#R3dZPhAVv~H;(|a2yN_5FH&J0|$eJ3kw4gj1Y?v5d#>LMV12^6BYy$1)ZKA zga!|m2?POz0R)f>4+aPl8KD{gz`+G_9vLMFQU?RU!8uyH9}*i52|cC+7S0YEK_3Vk i1|APfM-Ltb8&4_H83sg61{vHn(cc000qNZzApkp/g, '>'); + + var html = '' + title + ''; + + tinyMCE.execCommand('mceInsertContent', false, html); + tinyMCEPopup.close(); +} diff --git a/public/javascripts/tiny_mce/plugins/emotions/langs/en.js b/public/javascripts/tiny_mce/plugins/emotions/langs/en.js new file mode 100755 index 0000000..3cdd675 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/emotions/langs/en.js @@ -0,0 +1,22 @@ +// UK lang variables + +tinyMCE.addToLang('emotions',{ +title : 'Insert emotion', +desc : 'Emotions', +cool : 'Cool', +cry : 'Cry', +embarassed : 'Embarassed', +foot_in_mouth : 'Foot in mouth', +frown : 'Frown', +innocent : 'Innocent', +kiss : 'Kiss', +laughing : 'Laughing', +money_mouth : 'Money mouth', +sealed : 'Sealed', +smile : 'Smile', +surprised : 'Surprised', +tongue_out : 'Tongue out', +undecided : 'Undecided', +wink : 'Wink', +yell : 'Yell' +}); diff --git a/public/javascripts/tiny_mce/plugins/emotions/readme.txt b/public/javascripts/tiny_mce/plugins/emotions/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/emotions/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/flash/css/content.css b/public/javascripts/tiny_mce/plugins/flash/css/content.css new file mode 100755 index 0000000..843258b --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/flash/css/content.css @@ -0,0 +1,7 @@ +.mceItemFlash { + border: 1px dotted #cc0000; + background-image: url('../images/flash.gif'); + background-position: center; + background-repeat: no-repeat; + background-color: #ffffcc; +} diff --git a/public/javascripts/tiny_mce/plugins/flash/css/flash.css b/public/javascripts/tiny_mce/plugins/flash/css/flash.css new file mode 100755 index 0000000..d3e88e1 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/flash/css/flash.css @@ -0,0 +1,11 @@ +.panel_wrapper div.current { + height: 100px; +} + +#width, #height { + width: 50px; +} + +#file { + width: 250px; +} diff --git a/public/javascripts/tiny_mce/plugins/flash/editor_plugin.js b/public/javascripts/tiny_mce/plugins/flash/editor_plugin.js new file mode 100755 index 0000000..a6ed7cf --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/flash/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('flash');var TinyMCE_FlashPlugin={getInfo:function(){return{longname:'Flash',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_flash.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(!tinyMCE.settings['flash_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/flash/css/content.css")},getControlHTML:function(cn){switch(cn){case"flash":return tinyMCE.getButtonHTML(cn,'lang_flash_desc','{$pluginurl}/images/flash.gif','mceFlash')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceFlash":var name="",swffile="",swfwidth="",swfheight="",action="insert";var template=new Array();var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();template['file']='../../plugins/flash/flash.htm';template['width']=430;template['height']=175;template['width']+=tinyMCE.getLang('lang_flash_delta_width',0);template['height']+=tinyMCE.getLang('lang_flash_delta_height',0);if(focusElm!=null&&focusElm.nodeName.toLowerCase()=="img"){name=tinyMCE.getAttrib(focusElm,'class');if(name.indexOf('mceItemFlash')==-1)return true;swffile=tinyMCE.getAttrib(focusElm,'alt');if(tinyMCE.getParam('convert_urls'))swffile=eval(tinyMCE.settings['urlconverter_callback']+"(swffile, null, true);");swfwidth=tinyMCE.getAttrib(focusElm,'width');swfheight=tinyMCE.getAttrib(focusElm,'height');action="update"}tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",swffile:swffile,swfwidth:swfwidth,swfheight:swfheight,action:action});return true}return false},cleanup:function(type,content){switch(type){case"insert_to_editor_dom":if(tinyMCE.getParam('convert_urls')){var imgs=content.getElementsByTagName("img");for(var i=0;i','gi'),'');content=content.replace(new RegExp('<[ ]*object','gi'),'','gi'),'');while((startPos=content.indexOf('',startPos);var attribs=TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos+6,endPos));embedList[embedList.length]=attribs}var index=0;while((startPos=content.indexOf('=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+=''+content.substring(endPos);content+=contentAfter;index++;startPos++}var index=0;while((startPos=content.indexOf('=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('>',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+=''+content.substring(endPos);content+=contentAfter;index++;startPos++}break;case"get_from_editor":var startPos=-1;while((startPos=content.indexOf('',startPos);var attribs=TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos+4,endPos));if(attribs['class']!="mceItemFlash")continue;endPos+=2;var embedHTML='';var wmode=tinyMCE.getParam("flash_wmode","");var quality=tinyMCE.getParam("flash_quality","high");var menu=tinyMCE.getParam("flash_menu","false");embedHTML+='';embedHTML+='';embedHTML+='';embedHTML+='';embedHTML+='';embedHTML+='';chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter}break}return content},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;do{if(node.nodeName=="IMG"&&tinyMCE.getAttrib(node,'class').indexOf('mceItemFlash')==0){tinyMCE.switchClass(editor_id+'_flash','mceButtonSelected');return true}}while((node=node.parentNode));tinyMCE.switchClass(editor_id+'_flash','mceButtonNormal');return true},_parseAttributes:function(attribute_string){var attributeName="";var attributeValue="";var withInName;var withInValue;var attributes=new Array();var whiteSpaceRegExp=new RegExp('^[ \n\r\t]+','g');if(attribute_string==null||attribute_string.length<2)return null;withInName=withInValue=false;for(var i=0;i','gi'),''); + content = content.replace(new RegExp('<[ ]*object','gi'),'','gi'),''); + + // Parse all embed tags + while ((startPos = content.indexOf('', startPos); + var attribs = TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos + 6, endPos)); + embedList[embedList.length] = attribs; + } + + // Parse all object tags and replace them with images from the embed data + var index = 0; + while ((startPos = content.indexOf('= embedList.length) + break; + + var attribs = embedList[index]; + + // Find end of object + endPos = content.indexOf('', startPos); + endPos += 9; + + // Insert image + var contentAfter = content.substring(endPos); + content = content.substring(0, startPos); + content += '' + content.substring(endPos); + content += contentAfter; + index++; + + startPos++; + } + + // Parse all embed tags and replace them with images from the embed data + var index = 0; + while ((startPos = content.indexOf('= embedList.length) + break; + + var attribs = embedList[index]; + + // Find end of embed + endPos = content.indexOf('>', startPos); + endPos += 9; + + // Insert image + var contentAfter = content.substring(endPos); + content = content.substring(0, startPos); + content += '' + content.substring(endPos); + content += contentAfter; + index++; + + startPos++; + } + + break; + + case "get_from_editor": + // Parse all img tags and replace them with object+embed + var startPos = -1; + + while ((startPos = content.indexOf('', startPos); + var attribs = TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos + 4, endPos)); + + // Is not flash, skip it + if (attribs['class'] != "mceItemFlash") + continue; + + endPos += 2; + + var embedHTML = ''; + var wmode = tinyMCE.getParam("flash_wmode", ""); + var quality = tinyMCE.getParam("flash_quality", "high"); + var menu = tinyMCE.getParam("flash_menu", "false"); + + // Insert object + embed + embedHTML += ''; + embedHTML += ''; + embedHTML += ''; + embedHTML += ''; + embedHTML += ''; + embedHTML += ''; + + // Insert embed/object chunk + chunkBefore = content.substring(0, startPos); + chunkAfter = content.substring(endPos); + content = chunkBefore + embedHTML + chunkAfter; + } + break; + } + + // Pass through to next handler in chain + return content; + }, + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + if (node == null) + return; + + do { + if (node.nodeName == "IMG" && tinyMCE.getAttrib(node, 'class').indexOf('mceItemFlash') == 0) { + tinyMCE.switchClass(editor_id + '_flash', 'mceButtonSelected'); + return true; + } + } while ((node = node.parentNode)); + + tinyMCE.switchClass(editor_id + '_flash', 'mceButtonNormal'); + + return true; + }, + + // Private plugin internal functions + + _parseAttributes : function(attribute_string) { + var attributeName = ""; + var attributeValue = ""; + var withInName; + var withInValue; + var attributes = new Array(); + var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g'); + + if (attribute_string == null || attribute_string.length < 2) + return null; + + withInName = withInValue = false; + + for (var i=0; i +
+ + +
+
+
+ {$lang_flash_general} + + + + + + + + + + + + + + +
+ + + + + +
 
+
 
+ +  x  + +
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/flash/images/flash.gif b/public/javascripts/tiny_mce/plugins/flash/images/flash.gif new file mode 100755 index 0000000000000000000000000000000000000000..cb192e6ceda8d19ad8e7d08dd1cfde0aa72ead2a GIT binary patch literal 241 zcwPbV01p30Nk%w1VH5xq0K*9Y0w_vuilWKS*;ZOzlLa+Za}7>m0&NpCfJ0FQc3~F7DE)S%o1)Qi1n@vxX46qnD4hRS-NE*Pw!4UvE=#^N( literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/flash/jscripts/flash.js b/public/javascripts/tiny_mce/plugins/flash/jscripts/flash.js new file mode 100755 index 0000000..4f08077 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/flash/jscripts/flash.js @@ -0,0 +1,107 @@ +var url = tinyMCE.getParam("flash_external_list_url"); +if (url != null) { + // Fix relative + if (url.charAt(0) != '/' && url.indexOf('://') == -1) + url = tinyMCE.documentBasePath + "/" + url; + + document.write(''); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById("filebrowsercontainer").innerHTML = getBrowserHTML('filebrowser','file','flash','flash'); + + // Image list outsrc + var html = getFlashListHTML('filebrowser','file','flash','flash'); + if (html == "") + document.getElementById("linklistrow").style.display = 'none'; + else + document.getElementById("linklistcontainer").innerHTML = html; + + var formObj = document.forms[0]; + var swffile = tinyMCE.getWindowArg('swffile'); + var swfwidth = '' + tinyMCE.getWindowArg('swfwidth'); + var swfheight = '' + tinyMCE.getWindowArg('swfheight'); + + if (swfwidth.indexOf('%')!=-1) { + formObj.width2.value = "%"; + formObj.width.value = swfwidth.substring(0,swfwidth.length-1); + } else { + formObj.width2.value = "px"; + formObj.width.value = swfwidth; + } + + if (swfheight.indexOf('%')!=-1) { + formObj.height2.value = "%"; + formObj.height.value = swfheight.substring(0,swfheight.length-1); + } else { + formObj.height2.value = "px"; + formObj.height.value = swfheight; + } + + formObj.file.value = swffile; + formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); + + selectByValue(formObj, 'linklist', swffile); + + // Handle file browser + if (isVisible('filebrowser')) + document.getElementById('file').style.width = '230px'; + + // Auto select flash in list + if (typeof(tinyMCEFlashList) != "undefined" && tinyMCEFlashList.length > 0) { + for (var i=0; i 0) { + var html = ""; + + html += ''; + + return html; + } + + return ""; +} + +function insertFlash() { + var formObj = document.forms[0]; + var html = ''; + var file = formObj.file.value; + var width = formObj.width.value; + var height = formObj.height.value; + if (formObj.width2.value=='%') { + width = width + '%'; + } + if (formObj.height2.value=='%') { + height = height + '%'; + } + + if (width == "") + width = 100; + + if (height == "") + height = 100; + + html += '' + + '' + file + ''; + + tinyMCEPopup.execCommand("mceInsertContent", true, html); + tinyMCE.selectedInstance.repaint(); + + tinyMCEPopup.close(); +} diff --git a/public/javascripts/tiny_mce/plugins/flash/langs/en.js b/public/javascripts/tiny_mce/plugins/flash/langs/en.js new file mode 100755 index 0000000..67272bc --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/flash/langs/en.js @@ -0,0 +1,11 @@ +// UK lang variables + +tinyMCE.addToLang('flash',{ +title : 'Insert / edit Flash Movie', +desc : 'Insert / edit Flash Movie', +file : 'Flash-File (.swf)', +size : 'Size', +list : 'Flash files', +props : 'Flash properties', +general : 'General' +}); diff --git a/public/javascripts/tiny_mce/plugins/flash/readme.txt b/public/javascripts/tiny_mce/plugins/flash/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/flash/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/fullpage/blank.htm b/public/javascripts/tiny_mce/plugins/fullpage/blank.htm new file mode 100755 index 0000000..1e5876a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/fullpage/blank.htm @@ -0,0 +1,9 @@ + + + blank_page + + + + + + diff --git a/public/javascripts/tiny_mce/plugins/fullpage/css/fullpage.css b/public/javascripts/tiny_mce/plugins/fullpage/css/fullpage.css new file mode 100755 index 0000000..4bc803f --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/fullpage/css/fullpage.css @@ -0,0 +1,172 @@ +/* Hide the advanced tab */ +#advanced_tab { + display: none; +} + +#metatitle, #metakeywords, #metadescription, #metaauthor, #metacopyright { + width: 280px; +} + +#doctype, #docencoding { + width: 200px; +} + +#langcode { + width: 30px; +} + +#bgimage { + width: 220px; +} + +#fontface { + width: 240px; +} + +#leftmargin, #rightmargin, #topmargin, #bottommargin { + width: 50px; +} + +.panel_wrapper div.current { + height: 400px; +} + +#stylesheet, #style { + width: 240px; +} + +/* Head list classes */ + +.headlistwrapper { + width: 100%; +} + +.addbutton, .removebutton, .moveupbutton, .movedownbutton { + border-top: 1px solid; + border-left: 1px solid; + border-bottom: 1px solid; + border-right: 1px solid; + border-color: #F0F0EE; + cursor: default; + display: block; + width: 20px; + height: 20px; +} + +.addbutton:hover, .removebutton:hover, .moveupbutton:hover, .movedownbutton:hover { + border: 1px solid #0A246A; + background-color: #B6BDD2; +} + +.addbutton { + background-image: url('../images/add.gif'); + float: left; + margin-right: 3px; +} + +.removebutton { + background-image: url('../images/remove.gif'); + float: left; +} + +.moveupbutton { + background-image: url('../images/move_up.gif'); + float: left; + margin-right: 3px; +} + +.movedownbutton { + background-image: url('../images/move_down.gif'); + float: left; +} + +.selected { + border: 1px solid #0A246A; + background-color: #B6BDD2; +} + +.toolbar { + width: 100%; +} + +#headlist { + width: 100%; + margin-top: 3px; + font-size: 11px; +} + +#info, #title_element, #meta_element, #script_element, #style_element, #base_element, #link_element, #comment_element, #unknown_element { + display: none; +} + +#addmenu { + position: absolute; + border: 1px solid gray; + display: none; + z-index: 100; + background-color: white; +} + +#addmenu a { + display: block; + width: 100%; + line-height: 20px; + text-decoration: none; + background-color: white; +} + +#addmenu a:hover { + background-color: #B6BDD2; + color: black; +} + +#addmenu span { + padding-left: 10px; + padding-right: 10px; +} + +#updateElementPanel { + display: none; +} + +#script_element .panel_wrapper div.current { + height: 108px; +} + +#style_element .panel_wrapper div.current { + height: 108px; +} + +#link_element .panel_wrapper div.current { + height: 140px; +} + +#element_script_value { + width: 100%; + height: 100px; +} + +#element_comment_value { + width: 100%; + height: 120px; +} + +#element_style_value { + width: 100%; + height: 100px; +} + +#element_title, #element_script_src, #element_meta_name, #element_meta_content, #element_base_href, #element_link_href, #element_link_title { + width: 250px; +} + +.updateElementButton { + margin-top: 3px; +} + +/* MSIE specific styles */ + +* html .addbutton, * html .removebutton, * html .moveupbutton, * html .movedownbutton { + width: 22px; + height: 22px; +} diff --git a/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin.js b/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin.js new file mode 100755 index 0000000..19a7b36 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('fullpage');var TinyMCE_FullPagePlugin={getInfo:function(){return{longname:'Fullpage',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_fullpage.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"fullpage":return tinyMCE.getButtonHTML(cn,'lang_fullpage_desc','{$pluginurl}/images/fullpage.gif','mceFullPageProperties')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceFullPageProperties":var template=new Array();template['file']='../../plugins/fullpage/fullpage.htm';template['width']=430;template['height']=485+(tinyMCE.isOpera?5:0);template['width']+=tinyMCE.getLang('lang_fullpage_delta_width',0);template['height']+=tinyMCE.getLang('lang_fullpage_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceFullPageUpdate":TinyMCE_FullPagePlugin._addToHead(tinyMCE.getInstanceById(editor_id));return true}return false},cleanup:function(type,content,inst){switch(type){case"insert_to_editor":var tmp=content.toLowerCase();var pos=tmp.indexOf('',pos);pos2=tmp.lastIndexOf('');inst.fullpageTopContent=content.substring(0,pos+1);content=content.substring(pos+1,pos2);}else{if(!inst.fullpageTopContent){var docType=tinyMCE.getParam("fullpage_default_doctype",'');var enc=tinyMCE.getParam("fullpage_default_encoding",'utf-8');var title=tinyMCE.getParam("fullpage_default_title",'Untitled document');var lang=tinyMCE.getParam("fullpage_default_langcode",'en');var pi=tinyMCE.getParam("fullpage_default_xml_pi",true);var ff=tinyMCE.getParam("fullpage_default_font_family","");var fz=tinyMCE.getParam("fullpage_default_font_size","");var ds=tinyMCE.getParam("fullpage_default_style","");var dtc=tinyMCE.getParam("fullpage_default_text_color","");title=title.replace(/&/g,'&');title=title.replace(/\"/g,'"');title=title.replace(//g,'>');tmp='';if(pi)tmp+='\n';tmp+=docType+'\n';tmp+='\n';tmp+='\n';tmp+='\t'+title+'\n';tmp+='\t\n';tmp+='\n';tmp+='\n";break}return content},_addToHead:function(inst){var doc=inst.getDoc();var head=doc.getElementsByTagName("head")[0];var body=doc.body;var h=inst.fullpageTopContent;var e=doc.createElement("body");var nl,i,le,tmp;h=h.replace(/(\r|\n)/gi,'');h=h.replace(/<\?[^\>]*\>/gi,'');h=h.replace(/<\/?(!DOCTYPE|head|html)[^\>]*\>/gi,'');h=h.replace(//gi,'');h=h.replace(//gi,'');h=h.replace(/<(meta|base)[^>]*>/gi,'');h=h.replace(/]*)\/>/gi,'
');h=h.replace(/0){body.style.cssText=tinyMCE.getAttrib(nl[0],'style');if((tmp=tinyMCE.getAttrib(nl[0],'leftmargin'))!=''&&body.style.marginLeft=='')body.style.marginLeft=tmp+"px";if((tmp=tinyMCE.getAttrib(nl[0],'rightmargin'))!=''&&body.style.marginRight=='')body.style.marginRight=tmp+"px";if((tmp=tinyMCE.getAttrib(nl[0],'topmargin'))!=''&&body.style.marginTop=='')body.style.marginTop=tmp+"px";if((tmp=tinyMCE.getAttrib(nl[0],'bottommargin'))!=''&&body.style.marginBottom=='')body.style.marginBottom=tmp+"px";body.dir=tinyMCE.getAttrib(nl[0],'dir');body.vLink=tinyMCE.getAttrib(nl[0],'vlink');body.aLink=tinyMCE.getAttrib(nl[0],'alink');body.link=tinyMCE.getAttrib(nl[0],'link');body.text=tinyMCE.getAttrib(nl[0],'text');if((tmp=tinyMCE.getAttrib(nl[0],'background'))!='')body.style.backgroundImage="url('"+tmp+"')";if((tmp=tinyMCE.getAttrib(nl[0],'bgcolor'))!='')body.style.backgroundColor=tmp}}};tinyMCE.addPlugin("fullpage",TinyMCE_FullPagePlugin);
\ No newline at end of file
diff --git a/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin_src.js
new file mode 100755
index 0000000..332f5f2
--- /dev/null
+++ b/public/javascripts/tiny_mce/plugins/fullpage/editor_plugin_src.js
@@ -0,0 +1,227 @@
+/**
+ * $Id: editor_plugin_src.js 126 2006-10-22 16:19:55Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.
+ */
+
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('fullpage');
+
+var TinyMCE_FullPagePlugin = {
+	getInfo : function() {
+		return {
+			longname : 'Fullpage',
+			author : 'Moxiecode Systems AB',
+			authorurl : 'http://tinymce.moxiecode.com',
+			infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_fullpage.html',
+			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+		};
+	},
+
+	getControlHTML : function(cn) {
+		switch (cn) {
+			case "fullpage":
+				return tinyMCE.getButtonHTML(cn, 'lang_fullpage_desc', '{$pluginurl}/images/fullpage.gif', 'mceFullPageProperties');
+		}
+
+		return "";
+	},
+
+	execCommand : function(editor_id, element, command, user_interface, value) {
+		// Handle commands
+		switch (command) {
+			case "mceFullPageProperties":
+				var template = new Array();
+
+				template['file']   = '../../plugins/fullpage/fullpage.htm';
+				template['width']  = 430;
+				template['height'] = 485 + (tinyMCE.isOpera ? 5 : 0);
+
+				template['width'] += tinyMCE.getLang('lang_fullpage_delta_width', 0);
+				template['height'] += tinyMCE.getLang('lang_fullpage_delta_height', 0);
+
+				tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});
+			return true;
+
+			case "mceFullPageUpdate":
+				TinyMCE_FullPagePlugin._addToHead(tinyMCE.getInstanceById(editor_id));
+				return true;
+	   }
+
+	   // Pass to next handler in chain
+	   return false;
+	},
+
+	cleanup : function(type, content, inst) {
+		switch (type) {
+			case "insert_to_editor":
+				var tmp = content.toLowerCase();
+				var pos = tmp.indexOf('', pos);
+					pos2 = tmp.lastIndexOf('');
+					inst.fullpageTopContent = content.substring(0, pos + 1);
+					content = content.substring(pos + 1, pos2);
+					// tinyMCE.debug(inst.fullpageTopContent, content);
+				} else {
+					if (!inst.fullpageTopContent) {
+						var docType = tinyMCE.getParam("fullpage_default_doctype", '');
+						var enc = tinyMCE.getParam("fullpage_default_encoding", 'utf-8');
+						var title = tinyMCE.getParam("fullpage_default_title", 'Untitled document');
+						var lang = tinyMCE.getParam("fullpage_default_langcode", 'en');
+						var pi = tinyMCE.getParam("fullpage_default_xml_pi", true);
+						var ff = tinyMCE.getParam("fullpage_default_font_family", "");
+						var fz = tinyMCE.getParam("fullpage_default_font_size", "");
+						var ds = tinyMCE.getParam("fullpage_default_style", "");
+						var dtc = tinyMCE.getParam("fullpage_default_text_color", "");
+
+						// Xml encode it
+						title = title.replace(/&/g, '&');
+						title = title.replace(/\"/g, '"');
+						title = title.replace(//g, '>');
+
+						tmp = '';
+
+						// Make default chunk
+						if (pi)
+							tmp += '\n';
+
+						tmp += docType + '\n';
+						tmp += '\n';
+						tmp += '\n';
+						tmp += '\t' + title + '\n';
+						tmp += '\t\n';
+						tmp += '\n';
+						tmp += '\n";
+
+				break;
+		}
+
+		// Pass through to next handler in chain
+		return content;
+	},
+
+	// Private plugin internal methods
+
+	_addToHead : function(inst) {
+		var doc = inst.getDoc();
+		var head = doc.getElementsByTagName("head")[0];
+		var body = doc.body;
+		var h = inst.fullpageTopContent;
+		var e = doc.createElement("body");
+		var nl, i, le, tmp;
+
+		// Remove stuff we don't want
+		h = h.replace(/(\r|\n)/gi, '');
+		h = h.replace(/<\?[^\>]*\>/gi, '');
+		h = h.replace(/<\/?(!DOCTYPE|head|html)[^\>]*\>/gi, '');
+		h = h.replace(//gi, '');
+		h = h.replace(//gi, '');
+		h = h.replace(/<(meta|base)[^>]*>/gi, '');
+
+		// Make link and style elements into pre
+		h = h.replace(/]*)\/>/gi, '
');
+		//h = h.replace(/]*)>(.*?)<\/style>/gi, '
$2
'); + + // Make body a div + h = h.replace(/ 0) { + body.style.cssText = tinyMCE.getAttrib(nl[0], 'style'); + + if ((tmp = tinyMCE.getAttrib(nl[0], 'leftmargin')) != '' && body.style.marginLeft == '') + body.style.marginLeft = tmp + "px"; + + if ((tmp = tinyMCE.getAttrib(nl[0], 'rightmargin')) != '' && body.style.marginRight == '') + body.style.marginRight = tmp + "px"; + + if ((tmp = tinyMCE.getAttrib(nl[0], 'topmargin')) != '' && body.style.marginTop == '') + body.style.marginTop = tmp + "px"; + + if ((tmp = tinyMCE.getAttrib(nl[0], 'bottommargin')) != '' && body.style.marginBottom == '') + body.style.marginBottom = tmp + "px"; + + body.dir = tinyMCE.getAttrib(nl[0], 'dir'); + body.vLink = tinyMCE.getAttrib(nl[0], 'vlink'); + body.aLink = tinyMCE.getAttrib(nl[0], 'alink'); + body.link = tinyMCE.getAttrib(nl[0], 'link'); + body.text = tinyMCE.getAttrib(nl[0], 'text'); + + if ((tmp = tinyMCE.getAttrib(nl[0], 'background')) != '') + body.style.backgroundImage = "url('" + tmp + "')"; + + if ((tmp = tinyMCE.getAttrib(nl[0], 'bgcolor')) != '') + body.style.backgroundColor = tmp; + } + } +}; + +tinyMCE.addPlugin("fullpage", TinyMCE_FullPagePlugin); diff --git a/public/javascripts/tiny_mce/plugins/fullpage/fullpage.htm b/public/javascripts/tiny_mce/plugins/fullpage/fullpage.htm new file mode 100755 index 0000000..bc3708c --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/fullpage/fullpage.htm @@ -0,0 +1,577 @@ + + + {$lang_fullpage_title} + + + + + + + + + +
+ + +
+
+
+ {$lang_fullpage_meta_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
 
 
 
 
  + +
+
+ +
+ {$lang_fullpage_langprops} + + + + + + + + + + + + + + + + + + + + + + +
+ +
  + +
 
+ +
 
+
+
+ +
+
+ {$lang_fullpage_appearance_textprops} + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+
+ +
+ {$lang_fullpage_appearance_bgprops} + + + + + + + + + + +
+ + + + + +
 
+
+ + + + + +
 
+
+
+ +
+ {$lang_fullpage_appearance_marginprops} + + + + + + + + + + + + + + +
+
+ +
+ {$lang_fullpage_appearance_linkprops} + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + + + + +
 
+
+ + + + + +
 
+
  
+
+ +
+ {$lang_fullpage_appearance_style} + + + + + + + + + + +
+ + + + +
 
+
+
+ +
+ + +
+ {$lang_fullpage_head_elements} + +
+
+
+ + +
+
+ + +
+
+
+ +
+
+ +
+ {$lang_fullpage_meta_element} + + + + + + + + + + + + + + +
+ + +
+ +
+ {$lang_fullpage_title_element} + + + + + + +
+ + +
+ +
+ {$lang_fullpage_script_element} + + + +
+ +
+
+ + + + + + + + + + + + + + + + + +
+ + + + +
 
+
+ +
+ +
+
+ + +
+ +
+ {$lang_fullpage_style_element} + + + +
+ +
+
+ + + + + + + + + +
+
+ +
+ +
+
+ + +
+ +
+ {$lang_fullpage_base_element} + + + + + + + + + + +
+ + +
+ + + +
+ {$lang_fullpage_comment_element} + + + + +
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/fullpage/images/add.gif b/public/javascripts/tiny_mce/plugins/fullpage/images/add.gif new file mode 100755 index 0000000000000000000000000000000000000000..d6291d97d06d183e7c232652ba356c6b842d7d9a GIT binary patch literal 893 zcwTe&bhEHb6k!ly_|CwP(R)$bbIO7p|Gn}LStTqnh*(fC<3VKG#ej+n2^|-#6P8Ta z@WCKpfmOmL&-6`R`J1gG7AG`ZXjt*VI%Bg{!eWL|Fbak;Q2fcl$iN`VpabH7@&p4% z6oWR0jK_ur2b(#BwPH?eSa`URfkCE1L!hC7QA9gJ<$-}x0|z&kL&k%Ig|3X;DiR(I w4TlafGmD5A98hTRZRZkVIbp$g(65W1}pLQDo_2x7tFj>=wGNvCzd{ww^{1+CHSApf(Vibluie zm`Lmr5d-ybL6AX7*Gw96(LQxvf~A+H4`S(Qf*$N?y8a6t_&uES~az7Yr$Oemr3*5G{*hg?W( zIoGMk%bTe&GV%Pv)f)@hcMFTlH0R`DlnX8u$w@>RlL{mdwkgXAo|i;OmX~ZzF{QXt zLMf@#$JJF32Xf6>Q7#$JGa)(8Q@JJ}1ccyhc5&syYf1no0cHgxGf3KiaTBMZ%;=l~ zYJuC=&-K9=8SfuX_8EErm-%Bziey8qfz{zdc0(^I8_&&KIod6 zbp>lv!G`*R1Fo8yy4~C7=94=%oN8-6aXI6PzDOP^nu&BA-@AX`mZh$uxBa1(&dx~t zvBKGCm-#(;s3r2bwQ1MMFH2|k{OCPDrgvqRJ%KCs%Ykp%T2_C!t@Nv_r`T$|R2{xJ zRRH`Ajp32lRQvmfje6|QuXtoA>F-$qzpo7r-zg8YCW4`*s4vv*t2})+Ji?zwDhdm< GqyGRrp&|1C literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/fullpage/images/move_down.gif b/public/javascripts/tiny_mce/plugins/fullpage/images/move_down.gif new file mode 100755 index 0000000000000000000000000000000000000000..5bec71fffccb6a29968683ff723186351413cca9 GIT binary patch literal 194 zcwTe&bhEHb6k!lyI3mSRFyVngzygDa4GtLx5;`sv%y>|+;DbZLhJ*1XMf-==d;U!~cMe2L&@eGyoYD7ykeM&wvUP zf3h$#Fi0`zfH)vK8CdNXsP&~}&dXS}F6VWZ8>7IHXdS<=dk!2@=n`kVyg(+(@PNLc k1xxru?jw^VSz?-w9Qk#LgKg3}4+Xv1=Ut<8 literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/fullpage/images/move_up.gif b/public/javascripts/tiny_mce/plugins/fullpage/images/move_up.gif new file mode 100755 index 0000000000000000000000000000000000000000..2f489c909e4609157fcfec8474bd018080a5efeb GIT binary patch literal 200 zcwPa>05|_fNk%w1VH5xq0K^^uAV`p4h~S{W|4@M7kg)%7nBXu_pkSErAW)!ipzy@c z{{R30A^8LW0015UEC2ui02BZe000F=peK%GX`X1Ru59a$N CJz1py literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/fullpage/images/remove.gif b/public/javascripts/tiny_mce/plugins/fullpage/images/remove.gif new file mode 100755 index 0000000000000000000000000000000000000000..299c684efcd7acc388fd1ebc6c8155c2154177d5 GIT binary patch literal 180 zcwTe&bhEHb6k!lyIKsf-P;j7N!h?i{3kDGz3T8YAs5sED;s1df{}X2XcgQ%9&~YK4 z;DAHMh6y|V8zgK904hs35HR8Yh7,' + + 'XHTML 1.0 Frameset=,' + + 'XHTML 1.0 Strict=,' + + 'XHTML 1.1=">,' + + 'HTML 4.01 Transitional=,' + + 'HTML 4.01 Strict=,' + + 'HTML 4.01 Frameset='; + +var defaultEncodings = + 'Western european (iso-8859-1)=iso-8859-1,' + + 'Central European (iso-8859-2)=iso-8859-2,' + + 'Unicode (UTF-8)=utf-8,' + + 'Chinese traditional (Big5)=big5,' + + 'Cyrillic (iso-8859-5)=iso-8859-5,' + + 'Japanese (iso-2022-jp)=iso-2022-jp,' + + 'Greek (iso-8859-7)=iso-8859-7,' + + 'Korean (iso-2022-kr)=iso-2022-kr,' + + 'ASCII (us-ascii)=us-ascii'; + +var defaultMediaTypes = + 'all=all,' + + 'screen=screen,' + + 'print=print,' + + 'tty=tty,' + + 'tv=tv,' + + 'projection=projection,' + + 'handheld=handheld,' + + 'braille=braille,' + + 'aural=aural'; + +var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings'; +var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px'; + +var addMenuLayer = new MCLayer("addmenu"); +var lastElementType = null; +var topDoc; + +function init() { + var f = document.forms['fullpage']; + var i, p, doctypes, encodings, mediaTypes, fonts; + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + + // Setup doctype select box + doctypes = tinyMCE.getParam("fullpage_doctypes", defaultDocTypes).split(','); + for (i=0; i 1) + addSelectValue(f, 'doctypes', p[0], p[1]); + } + + // Setup fonts select box + fonts = tinyMCE.getParam("fullpage_fonts", defaultFontNames).split(';'); + for (i=0; i 1) + addSelectValue(f, 'fontface', p[0], p[1]); + } + + // Setup fontsize select box + fonts = tinyMCE.getParam("fullpage_fontsizes", defaultFontSizes).split(','); + for (i=0; i 1) { + addSelectValue(f, 'element_style_media', p[0], p[1]); + addSelectValue(f, 'element_link_media', p[0], p[1]); + } + } + + // Setup encodings select box + encodings = tinyMCE.getParam("fullpage_encodings", defaultEncodings).split(','); + for (i=0; i 1) { + addSelectValue(f, 'docencoding', p[0], p[1]); + addSelectValue(f, 'element_script_charset', p[0], p[1]); + addSelectValue(f, 'element_link_charset', p[0], p[1]); + } + } + + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color'); + //document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color'); + document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color'); + document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color'); + document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor'); + document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage'); + document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage'); + document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage'); + document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage'); + + // Resize some elements + if (isVisible('stylesheetbrowser')) + document.getElementById('stylesheet').style.width = '220px'; + + if (isVisible('link_href_browser')) + document.getElementById('element_link_href').style.width = '230px'; + + if (isVisible('bgimage_browser')) + document.getElementById('bgimage').style.width = '210px'; + + // Create iframe + var iframe = document.createElement('iframe'); + + iframe.id = 'tempFrame'; + iframe.style.display = 'none'; + iframe.src = tinyMCE.baseURL + "/plugins/fullpage/blank.htm"; + + document.body.appendChild(iframe); + + tinyMCEPopup.resizeToInnerSize(); +} + +function setupIframe(doc) { + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var hc = inst.fullpageTopContent; + var f = document.forms[0]; + var xmlVer, xmlEnc, docType; + var nodes, i, x, name, value, tmp, l; + + // Keep it from not loading/executing stuff + hc = hc.replace(/'}chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter}break}return content},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;do{if(node.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node,'class'))){tinyMCE.switchClass(editor_id+'_media','mceButtonSelected');return true}}while((node=node.parentNode));tinyMCE.switchClass(editor_id+'_media','mceButtonNormal');return true},_createImgFromEmbed:function(n,d,cl){var ne,at,i,ti='',an;ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;at=n.attributes;for(i=0;i0?ti.substring(0,ti.length-1):ti;ne.title=ti;n.parentNode.replaceChild(ne,n)},_createImg:function(cl,d,n){var i,nl,ti="",an,av,al=new Array();ne=d.createElement('img');ne.src=tinyMCE.getParam("theme_href")+'/images/spacer.gif';ne.width=tinyMCE.getAttrib(n,'width');ne.height=tinyMCE.getAttrib(n,'height');ne.className=cl;al.id=tinyMCE.getAttrib(n,'id');al.name=tinyMCE.getAttrib(n,'name');al.width=tinyMCE.getAttrib(n,'width');al.height=tinyMCE.getAttrib(n,'height');al.bgcolor=tinyMCE.getAttrib(n,'bgcolor');al.align=tinyMCE.getAttrib(n,'align');al.class_name=tinyMCE.getAttrib(n,'mce_class');nl=n.getElementsByTagName('div');for(i=0;i0?ti.substring(0,ti.length-1):ti;ne.title=ti;return ne},_getEmbed:function(cls,cb,mt,p,at){var h='',n;p.width=at.width?at.width:p.width;p.height=at.height?at.height:p.height;h+='';if(n=='src'&&p[n].indexOf('://')!=-1&&mt=='application/x-mplayer2')h+=''}}h+=']*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, ''); + content = content.replace(/]*)>/gi, '
'); + content = content.replace(/]*)>/gi, '
'); + content = content.replace(/<\/(object|embed)([^>]*)>/gi, '
'); + content = content.replace(/]*)>/gi, '
'); + content = content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>', 'gi'), 'class="mceItemParam">
'); + break; + + case "insert_to_editor_dom": + d = inst.getDoc(); + nl = content.getElementsByTagName("img"); + for (i=0; i', startPos); + attribs = TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos + 4, endPos)); + + // Is not flash, skip it + if (!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class'])) + continue; + + endPos += 2; + + // Parse attributes + at = attribs['title']; + if (at) { + at = at.replace(/'/g, "'"); + at = at.replace(/&#quot;/g, '"'); + + try { + pl = eval('x={' + at + '};'); + } catch (ex) { + pl = {}; + } + } + + // Use object/embed + if (!tinyMCE.getParam('media_use_script', false)) { + switch (attribs['class']) { + case 'mceItemFlash': + ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000'; + cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; + mt = 'application/x-shockwave-flash'; + break; + + case 'mceItemShockWave': + ci = '166B1BCA-3F9C-11CF-8075-444553540000'; + cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0'; + mt = 'application/x-director'; + break; + + case 'mceItemWindowsMedia': + ci = tinyMCE.getParam('media_wmp6_compatible') ? '05589FA1-C356-11CE-BF01-00AA0055595A' : '6BF52A52-394A-11D3-B153-00C04F79FAA6'; + cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; + mt = 'application/x-mplayer2'; + break; + + case 'mceItemQuickTime': + ci = '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'; + cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0'; + mt = 'video/quicktime'; + break; + + case 'mceItemRealMedia': + ci = 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA'; + cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; + mt = 'audio/x-pn-realaudio-plugin'; + break; + } + + // Force absolute URL + if (!tinyMCE.getParam("relative_urls")) + pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src); + + embedHTML = TinyMCE_MediaPlugin._getEmbed(ci, cb, mt, pl, attribs); + } else { + // Use script version + switch (attribs['class']) { + case 'mceItemFlash': + s = 'writeFlash'; + break; + + case 'mceItemShockWave': + s = 'writeShockWave'; + break; + + case 'mceItemWindowsMedia': + s = 'writeWindowsMedia'; + break; + + case 'mceItemQuickTime': + s = 'writeQuickTime'; + break; + + case 'mceItemRealMedia': + s = 'writeRealMedia'; + break; + } + + if (attribs.width) + at = at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g, "width:'" + attribs.width + "'"); + + if (attribs.height) + at = at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g, "height:'" + attribs.height + "'"); + + // Force absolute URL + if (!tinyMCE.getParam("relative_urls")) { + pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src); + at = at.replace(new RegExp("src:'[^']*'", "g"), "src:'" + pl.src + "'"); + } + + embedHTML = ''; + } + + // Insert embed/object chunk + chunkBefore = content.substring(0, startPos); + chunkAfter = content.substring(endPos); + content = chunkBefore + embedHTML + chunkAfter; + } + break; + } + + return content; + }, + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + if (node == null) + return; + + do { + if (node.nodeName == "IMG" && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node, 'class'))) { + tinyMCE.switchClass(editor_id + '_media', 'mceButtonSelected'); + return true; + } + } while ((node = node.parentNode)); + + tinyMCE.switchClass(editor_id + '_media', 'mceButtonNormal'); + + return true; + }, + + _createImgFromEmbed : function(n, d, cl) { + var ne, at, i, ti = '', an; + + ne = d.createElement('img'); + ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif'; + ne.width = tinyMCE.getAttrib(n, 'width'); + ne.height = tinyMCE.getAttrib(n, 'height'); + ne.className = cl; + + at = n.attributes; + for (i=0; i 0 ? ti.substring(0, ti.length - 1) : ti; + ne.title = ti; + + n.parentNode.replaceChild(ne, n); + }, + + _createImg : function(cl, d, n) { + var i, nl, ti = "", an, av, al = new Array(); + + ne = d.createElement('img'); + ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif'; + ne.width = tinyMCE.getAttrib(n, 'width'); + ne.height = tinyMCE.getAttrib(n, 'height'); + ne.className = cl; + + al.id = tinyMCE.getAttrib(n, 'id'); + al.name = tinyMCE.getAttrib(n, 'name'); + al.width = tinyMCE.getAttrib(n, 'width'); + al.height = tinyMCE.getAttrib(n, 'height'); + al.bgcolor = tinyMCE.getAttrib(n, 'bgcolor'); + al.align = tinyMCE.getAttrib(n, 'align'); + al.class_name = tinyMCE.getAttrib(n, 'mce_class'); + + nl = n.getElementsByTagName('div'); + for (i=0; i 0 ? ti.substring(0, ti.length - 1) : ti; + ne.title = ti; + + return ne; + }, + + _getEmbed : function(cls, cb, mt, p, at) { + var h = '', n; + + p.width = at.width ? at.width : p.width; + p.height = at.height ? at.height : p.height; + + h += ''; + + // Add extra url parameter if it's an absolute URL on WMP + if (n == 'src' && p[n].indexOf('://') != -1 && mt == 'application/x-mplayer2') + h += ''; + } + } + + h += ''; + + h += ''); +} + +function init() { + var pl = "", f, val; + var type = "flash", fe, i; + + tinyMCEPopup.resizeToInnerSize(); + f = document.forms[0] + + fe = tinyMCE.selectedInstance.getFocusElement(); + if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) { + pl = "x={" + fe.title + "};"; + + switch (tinyMCE.getAttrib(fe, 'class')) { + case 'mceItemFlash': + type = 'flash'; + break; + + case 'mceItemShockWave': + type = 'shockwave'; + break; + + case 'mceItemWindowsMedia': + type = 'wmp'; + break; + + case 'mceItemQuickTime': + type = 'qt'; + break; + + case 'mceItemRealMedia': + type = 'rmp'; + break; + } + + document.forms[0].insert.value = tinyMCE.getLang('lang_update', 'Insert', true); + } + + document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); + document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + + var html = getMediaListHTML('filebrowser','src','media','media'); + if (html == "") + document.getElementById("linklistrow").style.display = 'none'; + else + document.getElementById("linklistcontainer").innerHTML = html; + + // Resize some elements + if (isVisible('filebrowsercontainer')) + document.getElementById('src').style.width = '230px'; + + // Setup form + if (pl != "") { + pl = eval(pl); + + switch (type) { + case "flash": + setBool(pl, 'flash', 'play'); + setBool(pl, 'flash', 'loop'); + setBool(pl, 'flash', 'menu'); + setBool(pl, 'flash', 'swliveconnect'); + setStr(pl, 'flash', 'quality'); + setStr(pl, 'flash', 'scale'); + setStr(pl, 'flash', 'salign'); + setStr(pl, 'flash', 'wmode'); + setStr(pl, 'flash', 'base'); + setStr(pl, 'flash', 'flashvars'); + break; + + case "qt": + setBool(pl, 'qt', 'loop'); + setBool(pl, 'qt', 'autoplay'); + setBool(pl, 'qt', 'cache'); + setBool(pl, 'qt', 'controller'); + setBool(pl, 'qt', 'correction'); + setBool(pl, 'qt', 'enablejavascript'); + setBool(pl, 'qt', 'kioskmode'); + setBool(pl, 'qt', 'autohref'); + setBool(pl, 'qt', 'playeveryframe'); + setBool(pl, 'qt', 'tarsetcache'); + setStr(pl, 'qt', 'scale'); + setStr(pl, 'qt', 'starttime'); + setStr(pl, 'qt', 'endtime'); + setStr(pl, 'qt', 'tarset'); + setStr(pl, 'qt', 'qtsrcchokespeed'); + setStr(pl, 'qt', 'volume'); + setStr(pl, 'qt', 'qtsrc'); + break; + + case "shockwave": + setBool(pl, 'shockwave', 'sound'); + setBool(pl, 'shockwave', 'progress'); + setBool(pl, 'shockwave', 'autostart'); + setBool(pl, 'shockwave', 'swliveconnect'); + setStr(pl, 'shockwave', 'swvolume'); + setStr(pl, 'shockwave', 'swstretchstyle'); + setStr(pl, 'shockwave', 'swstretchhalign'); + setStr(pl, 'shockwave', 'swstretchvalign'); + break; + + case "wmp": + setBool(pl, 'wmp', 'autostart'); + setBool(pl, 'wmp', 'enabled'); + setBool(pl, 'wmp', 'enablecontextmenu'); + setBool(pl, 'wmp', 'fullscreen'); + setBool(pl, 'wmp', 'invokeurls'); + setBool(pl, 'wmp', 'mute'); + setBool(pl, 'wmp', 'stretchtofit'); + setBool(pl, 'wmp', 'windowlessvideo'); + setStr(pl, 'wmp', 'balance'); + setStr(pl, 'wmp', 'baseurl'); + setStr(pl, 'wmp', 'captioningid'); + setStr(pl, 'wmp', 'currentmarker'); + setStr(pl, 'wmp', 'currentposition'); + setStr(pl, 'wmp', 'defaultframe'); + setStr(pl, 'wmp', 'playcount'); + setStr(pl, 'wmp', 'rate'); + setStr(pl, 'wmp', 'uimode'); + setStr(pl, 'wmp', 'volume'); + break; + + case "rmp": + setBool(pl, 'rmp', 'autostart'); + setBool(pl, 'rmp', 'loop'); + setBool(pl, 'rmp', 'autogotourl'); + setBool(pl, 'rmp', 'center'); + setBool(pl, 'rmp', 'imagestatus'); + setBool(pl, 'rmp', 'maintainaspect'); + setBool(pl, 'rmp', 'nojava'); + setBool(pl, 'rmp', 'prefetch'); + setBool(pl, 'rmp', 'shuffle'); + setStr(pl, 'rmp', 'console'); + setStr(pl, 'rmp', 'controls'); + setStr(pl, 'rmp', 'numloop'); + setStr(pl, 'rmp', 'scriptcallbacks'); + break; + } + + setStr(pl, null, 'src'); + setStr(pl, null, 'id'); + setStr(pl, null, 'name'); + setStr(pl, null, 'vspace'); + setStr(pl, null, 'hspace'); + setStr(pl, null, 'bgcolor'); + setStr(pl, null, 'align'); + setStr(pl, null, 'width'); + setStr(pl, null, 'height'); + + if ((val = tinyMCE.getAttrib(fe, "width")) != "") + pl.width = f.width.value = val; + + if ((val = tinyMCE.getAttrib(fe, "height")) != "") + pl.height = f.height.value = val; + + oldWidth = pl.width ? parseInt(pl.width) : 0; + oldHeight = pl.height ? parseInt(pl.height) : 0; + } else + oldWidth = oldHeight = 0; + + selectByValue(f, 'media_type', type); + changedType(type); + updateColor('bgcolor_pick', 'bgcolor'); + + TinyMCE_EditableSelects.init(); + generatePreview(); +} + +function insertMedia() { + var fe, f = document.forms[0], h; + + if (!AutoValidator.validate(f)) { + alert(tinyMCE.getLang('lang_invalid_data')); + return false; + } + + f.width.value = f.width.value == "" ? 100 : f.width.value; + f.height.value = f.height.value == "" ? 100 : f.height.value; + + fe = tinyMCE.selectedInstance.getFocusElement(); + if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) { + switch (f.media_type.options[f.media_type.selectedIndex].value) { + case "flash": + fe.className = "mceItemFlash"; + break; + + case "shockwave": + fe.className = "mceItemShockWave"; + break; + + case "qt": + fe.className = "mceItemQuickTime"; + break; + + case "wmp": + fe.className = "mceItemWindowsMedia"; + break; + + case "rmp": + fe.className = "mceItemRealMedia"; + break; + } + + if (fe.width != f.width.value || fe.height != f.width.height) + tinyMCE.selectedInstance.repaint(); + + fe.title = serializeParameters(); + fe.width = f.width.value; + fe.height = f.height.value; + fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : ''); + fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : ''); + fe.align = f.align.options[f.align.selectedIndex].value; + } else { + h = ' 0) { + var html = ""; + + html += ''; + + return html; + } + + return ""; +} + +function getType(v) { + var fo = tinyMCE.getParam("media_types", "flash=swf;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';'), i, c, el, x; + + for (i=0; i 0 ? s.substring(0, s.length - 1) : s; + + return s; +} + +function setBool(pl, p, n) { + if (typeof(pl[n]) == "undefined") + return; + + document.forms[0].elements[p + "_" + n].checked = pl[n]; +} + +function setStr(pl, p, n) { + var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n]; + + if (typeof(pl[n]) == "undefined") + return; + + if (e.type == "text") + e.value = pl[n]; + else + selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]); +} + +function getBool(p, n, d, tv, fv) { + var v = document.forms[0].elements[p + "_" + n].checked; + + tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'"; + fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'"; + + return (v == d) ? '' : n + (v ? ':' + tv + ',' : ':' + fv + ','); +} + +function getStr(p, n, d) { + var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; + var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; + + return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',"); +} + +function getInt(p, n, d) { + var e = document.forms[0].elements[(p != null ? p + "_" : "") + n]; + var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value; + + return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ","); +} + +function jsEncode(s) { + s = s.replace(new RegExp('\\\\', 'g'), '\\\\'); + s = s.replace(new RegExp('"', 'g'), '\\"'); + s = s.replace(new RegExp("'", 'g'), "\\'"); + + return s; +} + +function generatePreview(c) { + var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh; + + p.innerHTML = ''; + + nw = parseInt(f.width.value); + nh = parseInt(f.height.value); + + if (f.width.value != "" && f.height.value != "") { + if (f.constrain.checked) { + if (c == 'width' && oldWidth != 0) { + wp = nw / oldWidth; + nh = Math.round(wp * nh); + f.height.value = nh; + } else if (c == 'height' && oldHeight != 0) { + hp = nh / oldHeight; + nw = Math.round(hp * nw); + f.width.value = nw; + } + } + } + + if (f.width.value != "") + oldWidth = nw; + + if (f.height.value != "") + oldHeight = nh; + + // After constrain + pl = serializeParameters(); + + switch (f.media_type.options[f.media_type.selectedIndex].value) { + case "flash": + cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'; + codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'; + type = 'application/x-shockwave-flash'; + break; + + case "shockwave": + cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000'; + codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0'; + type = 'application/x-director'; + break; + + case "qt": + cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B'; + codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0'; + type = 'video/quicktime'; + break; + + case "wmp": + cls = tinyMCE.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6'; + codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; + type = 'application/x-mplayer2'; + break; + + case "rmp": + cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA'; + codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701'; + type = 'audio/x-pn-realaudio-plugin'; + break; + } + + if (pl == '') { + p.innerHTML = ''; + return; + } + + pl = eval('x={' + pl + '};'); + + if (!pl.src) { + p.innerHTML = ''; + return; + } + + pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src); + pl.width = !pl.width ? 100 : pl.width; + pl.height = !pl.height ? 100 : pl.height; + pl.id = !pl.id ? 'obj' : pl.id; + pl.name = !pl.name ? 'eobj' : pl.name; + pl.align = !pl.align ? '' : pl.align; + + h += ''; + + for (n in pl) { + h += ''; + + // Add extra url parameter if it's an absolute URL + if (n == 'src' && pl[n].indexOf('://') != -1) + h += ''; + } + + h += ' + + {$lang_media_title} + + + + + + + + + + +
+ + +
+
+
+ {$lang_media_general} + + + + + + + + + + + + + + + + + +
+ +
+ + + + + +
 
+
 
+ + + + + + +
x   
+
+
+ +
+ {$lang_media_preview} + +
+
+ +
+
+ {$lang_media_advanced} + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + +
 
+
+
+ +
+ {$lang_media_flash_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + + + + + + + +
+
+ +
+ {$lang_media_qt_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+  
+ + + + + +
 
+
+
+ +
+ {$lang_media_wmp_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+
+ +
+ {$lang_media_rmp_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+   +
+
+ +
+ {$lang_media_shockwave_options} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+ + + + + +
+
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin.js b/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin.js new file mode 100755 index 0000000..ade6ae8 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('nonbreaking');var TinyMCE_NonBreakingPlugin={getInfo:function(){return{longname:'Nonbreaking space',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_nonbreaking.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"nonbreaking":return tinyMCE.getButtonHTML(cn,'lang_nonbreaking_desc','{$pluginurl}/images/nonbreaking.gif','mceNonBreaking',false)}return""},execCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id),h;switch(command){case"mceNonBreaking":h=(inst.visualChars&&inst.visualChars.state)?'·':' ';tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,h);return true}return false},handleEvent:function(e){var inst,h;if(!tinyMCE.isOpera&&e.type=='keydown'&&e.keyCode==9&&tinyMCE.getParam('nonbreaking_force_tab',false)){inst=tinyMCE.selectedInstance;h=(inst.visualChars&&inst.visualChars.state)?'···':'   ';tinyMCE.execInstanceCommand(inst.editorId,'mceInsertContent',false,h);tinyMCE.cancelEvent(e);return false}return true}};tinyMCE.addPlugin("nonbreaking",TinyMCE_NonBreakingPlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js new file mode 100755 index 0000000..72da2cc --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js @@ -0,0 +1,62 @@ +/** + * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('nonbreaking'); + +var TinyMCE_NonBreakingPlugin = { + getInfo : function() { + return { + longname : 'Nonbreaking space', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_nonbreaking.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + getControlHTML : function(cn) { + switch (cn) { + case "nonbreaking": + return tinyMCE.getButtonHTML(cn, 'lang_nonbreaking_desc', '{$pluginurl}/images/nonbreaking.gif', 'mceNonBreaking', false); + } + + return ""; + }, + + + execCommand : function(editor_id, element, command, user_interface, value) { + var inst = tinyMCE.getInstanceById(editor_id), h; + + switch (command) { + case "mceNonBreaking": + h = (inst.visualChars && inst.visualChars.state) ? '·' : ' '; + tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, h); + return true; + } + + return false; + }, + + handleEvent : function(e) { + var inst, h; + + if (!tinyMCE.isOpera && e.type == 'keydown' && e.keyCode == 9 && tinyMCE.getParam('nonbreaking_force_tab', false)) { + inst = tinyMCE.selectedInstance; + + h = (inst.visualChars && inst.visualChars.state) ? '···' : '   '; + tinyMCE.execInstanceCommand(inst.editorId, 'mceInsertContent', false, h); + + tinyMCE.cancelEvent(e); + return false; + } + + return true; + } +}; + +tinyMCE.addPlugin("nonbreaking", TinyMCE_NonBreakingPlugin); diff --git a/public/javascripts/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif b/public/javascripts/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif new file mode 100755 index 0000000000000000000000000000000000000000..a731fc91acc2ddcb8a6ecec7ef1698654d766298 GIT binary patch literal 619 zcwVKE+e?!H07rlB_SqDx&7ftGGcC)dNtT8M+G=818P+lqV~xyh6q0$V2NA7L9o1GW zA)G6$FbCnHAe)Oh%h)Z`#@E_KWvsSY7O_2r#mc{-!+AN+r>tC5v`dnTRD={5A0KxD zMx$}Iy4vY<`h31VrIG~ZB$CC&#i5}ghr>bT=3W6lPfz(ODyFzx9dH4- z2s8qB0C!%CBUch`?H9S0QGMVglyT{}4ibRn}q`A5IaeG@6;L6IfTCJ{( zj0PYW47RqmngE;47V~@x1OgOAx!vwgU~q7d%E?gyvo$qLCNoO81_lN~q0m?3i+6N- zUtiz1SH_pX_t#@{wY7F291i;{D_a1~KbsowU2f6q^*`ReX#-}&VzpX5KR<6U7^u8F zGjJ1Nu~-1&@%W#382CEy>B9yy7ka zT`1S~>rRlIL!8q(UGgzyL<1$+P|G351*>%VaXP zk;~<4Sj$#g9kj%h)zhvsn;33F=Jk{1@-6&&nJgz^Ep5l{Q{)~wCBtu&u1h!;vXkK%JOXmL3^t Tuym-{s{{hC?b*5aB`E$2 + + blank_page + + + + + + + + + diff --git a/public/javascripts/tiny_mce/plugins/paste/css/blank.css b/public/javascripts/tiny_mce/plugins/paste/css/blank.css new file mode 100755 index 0000000..eca411a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/paste/css/blank.css @@ -0,0 +1,13 @@ +body { + background-color: #FFFFFF; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} diff --git a/public/javascripts/tiny_mce/plugins/paste/css/pasteword.css b/public/javascripts/tiny_mce/plugins/paste/css/pasteword.css new file mode 100755 index 0000000..b3be627 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/paste/css/pasteword.css @@ -0,0 +1,3 @@ +.sourceIframe { + border: 1px solid #808080; +} diff --git a/public/javascripts/tiny_mce/plugins/paste/editor_plugin.js b/public/javascripts/tiny_mce/plugins/paste/editor_plugin.js new file mode 100755 index 0000000..d369f5f --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/paste/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('paste');var TinyMCE_PastePlugin={getInfo:function(){return{longname:'Paste text/word',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_paste.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(tinyMCE.isMSIE&&tinyMCE.getParam("paste_auto_cleanup_on_paste",false))tinyMCE.addEvent(inst.getBody(),"paste",TinyMCE_PastePlugin._handlePasteEvent)},getControlHTML:function(cn){switch(cn){case"pastetext":return tinyMCE.getButtonHTML(cn,'lang_paste_text_desc','{$pluginurl}/images/pastetext.gif','mcePasteText',true);case"pasteword":return tinyMCE.getButtonHTML(cn,'lang_paste_word_desc','{$pluginurl}/images/pasteword.gif','mcePasteWord',true);case"selectall":return tinyMCE.getButtonHTML(cn,'lang_selectall_desc','{$pluginurl}/images/selectall.gif','mceSelectAll',true)}return''},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mcePasteText":if(user_interface){if((tinyMCE.isMSIE&&!tinyMCE.isOpera)&&!tinyMCE.getParam('paste_use_dialog',false))TinyMCE_PastePlugin._insertText(clipboardData.getData("Text"),true);else{var template=new Array();template['file']='../../plugins/paste/pastetext.htm';template['width']=450;template['height']=400;var plain_text="";tinyMCE.openWindow(template,{editor_id:editor_id,plain_text:plain_text,resizable:"yes",scrollbars:"no",inline:"yes",mceDo:'insert'})}}else TinyMCE_PastePlugin._insertText(value['html'],value['linebreaks']);return true;case"mcePasteWord":if(user_interface){if((tinyMCE.isMSIE&&!tinyMCE.isOpera)&&!tinyMCE.getParam('paste_use_dialog',false)){TinyMCE_PastePlugin._insertWordContent(TinyMCE_PastePlugin._clipboardHTML())}else{var template=new Array();template['file']='../../plugins/paste/pasteword.htm';template['width']=450;template['height']=400;var plain_text="";tinyMCE.openWindow(template,{editor_id:editor_id,plain_text:plain_text,resizable:"yes",scrollbars:"no",inline:"yes",mceDo:'insert'})}}else TinyMCE_PastePlugin._insertWordContent(value);return true;case"mceSelectAll":tinyMCE.execInstanceCommand(editor_id,'selectall');return true}return false},_handlePasteEvent:function(e){switch(e.type){case"paste":var html=TinyMCE_PastePlugin._clipboardHTML();var r,inst=tinyMCE.selectedInstance;if(inst&&(r=inst.getRng())&&r.text.length>0)tinyMCE.execCommand('delete');if(html&&html.length>0)tinyMCE.execCommand('mcePasteWord',false,html);tinyMCE.cancelEvent(e);return false}return true},_insertText:function(content,bLinebreaks){if(content&&content.length>0){if(bLinebreaks){if(tinyMCE.getParam("paste_create_paragraphs",true)){var rl=tinyMCE.getParam("paste_replace_list",'\u2122,TM,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i

","gi");content=tinyMCE.regexpReplace(content,"\r\r","

","gi");content=tinyMCE.regexpReplace(content,"\n\n","

","gi");if((pos=content.indexOf('

'))!=-1){tinyMCE.execCommand("Delete");var node=tinyMCE.selectedInstance.getFocusElement();var breakElms=new Array();do{if(node.nodeType==1){if(node.nodeName=="TD"||node.nodeName=="BODY")break;breakElms[breakElms.length]=node}}while(node=node.parentNode);var before="",after="

";before+=content.substring(0,pos);for(var i=0;i";after+="<"+breakElms[(breakElms.length-1)-i].nodeName+">"}before+="

";content=before+content.substring(pos+7)+after}}if(tinyMCE.getParam("paste_create_linebreaks",true)){content=tinyMCE.regexpReplace(content,"\r\n","
","gi");content=tinyMCE.regexpReplace(content,"\r","
","gi");content=tinyMCE.regexpReplace(content,"\n","
","gi")}}tinyMCE.execCommand("mceInsertRawHTML",false,content)}},_insertWordContent:function(content){if(content&&content.length>0){var bull=String.fromCharCode(8226);var middot=String.fromCharCode(183);var cb;if((cb=tinyMCE.getParam("paste_insert_word_content_callback",""))!="")content=eval(cb+"('before', content)");var rl=tinyMCE.getParam("paste_replace_list",'\u2122,TM,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i(.*?)<\/p>','gi'),'

$1

')}content=content.replace(new RegExp('tab-stops: list [0-9]+.0pt">','gi'),'">'+"--list--");content=content.replace(new RegExp(bull+"(.*?)
","gi"),"

"+middot+"$1

");content=content.replace(new RegExp('','gi'),""+bull);content=content.replace(/<\/o:p>/gi,"");content=content.replace(new RegExp('
]*>/gi,"");if(tinyMCE.getParam("paste_remove_styles",true))content=content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)','gi'),"<$1$3");content=content.replace(/<\/?font[^>]*>/gi,"");switch(tinyMCE.getParam("paste_strip_class_attributes","all")){case"all":content=content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi,"<$1$3");break;case"mso":content=content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)','gi'),"<$1$3");break}content=content.replace(new RegExp('href="?'+TinyMCE_PastePlugin._reEscape(""+document.location)+'','gi'),'href="'+tinyMCE.settings['document_base_url']);content=content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi,"<$1$3");content=content.replace(/<\\?\?xml[^>]*>/gi,"");content=content.replace(/<\/?\w+:[^>]*>/gi,"");content=content.replace(/-- page break --\s*

 <\/p>/gi,"");content=content.replace(/-- page break --/gi,"");if(!tinyMCE.settings['force_p_newlines']){content=content.replace('','','gi');content=content.replace('

','

','gi')}if(!tinyMCE.isMSIE&&!tinyMCE.settings['force_p_newlines']){content=content.replace(/<\/?p[^>]*>/gi,"")}content=content.replace(/<\/?div[^>]*>/gi,"");if(tinyMCE.getParam("paste_convert_middot_lists",true)){var div=document.createElement("div");div.innerHTML=content;var className=tinyMCE.getParam("paste_unindented_list_class","unIndentedList");while(TinyMCE_PastePlugin._convertMiddots(div,"--list--"));while(TinyMCE_PastePlugin._convertMiddots(div,middot,className));while(TinyMCE_PastePlugin._convertMiddots(div,bull));content=div.innerHTML}if(tinyMCE.getParam("paste_convert_headers_to_strong",false)){content=content.replace(/ <\/h[1-6]>/gi,'

  

');content=content.replace(//gi,'

');content=content.replace(/<\/h[1-6]>/gi,'

');content=content.replace(/ <\/b>/gi,'  ');content=content.replace(/^( )*/gi,'')}content=content.replace(/--list--/gi,"");if((cb=tinyMCE.getParam("paste_insert_word_content_callback",""))!="")content=eval(cb+"('after', content)");tinyMCE.execCommand("mceInsertContent",false,content);if(tinyMCE.getParam('paste_force_cleanup_wordpaste',true))window.setTimeout('tinyMCE.execCommand("mceCleanup");',1);}},_reEscape:function(s){var l="?.\\*[](){}+^$:";var o="";for(var i=0;i 0) + tinyMCE.execCommand('delete'); + + if (html && html.length > 0) + tinyMCE.execCommand('mcePasteWord', false, html); + + tinyMCE.cancelEvent(e); + return false; + } + + return true; + }, + + _insertText : function(content, bLinebreaks) { + if (content && content.length > 0) { + if (bLinebreaks) { + // Special paragraph treatment + if (tinyMCE.getParam("paste_create_paragraphs", true)) { + var rl = tinyMCE.getParam("paste_replace_list", '\u2122,TM,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(','); + for (var i=0; i

", "gi"); + content = tinyMCE.regexpReplace(content, "\r\r", "

", "gi"); + content = tinyMCE.regexpReplace(content, "\n\n", "

", "gi"); + + // Has paragraphs + if ((pos = content.indexOf('

')) != -1) { + tinyMCE.execCommand("Delete"); + + var node = tinyMCE.selectedInstance.getFocusElement(); + + // Get list of elements to break + var breakElms = new Array(); + + do { + if (node.nodeType == 1) { + // Don't break tables and break at body + if (node.nodeName == "TD" || node.nodeName == "BODY") + break; + + breakElms[breakElms.length] = node; + } + } while(node = node.parentNode); + + var before = "", after = "

"; + before += content.substring(0, pos); + + for (var i=0; i"; + after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; + } + + before += "

"; + content = before + content.substring(pos+7) + after; + } + } + + if (tinyMCE.getParam("paste_create_linebreaks", true)) { + content = tinyMCE.regexpReplace(content, "\r\n", "
", "gi"); + content = tinyMCE.regexpReplace(content, "\r", "
", "gi"); + content = tinyMCE.regexpReplace(content, "\n", "
", "gi"); + } + } + + tinyMCE.execCommand("mceInsertRawHTML", false, content); + } + }, + + _insertWordContent : function(content) { + if (content && content.length > 0) { + // Cleanup Word content + var bull = String.fromCharCode(8226); + var middot = String.fromCharCode(183); + var cb; + + if ((cb = tinyMCE.getParam("paste_insert_word_content_callback", "")) != "") + content = eval(cb + "('before', content)"); + + var rl = tinyMCE.getParam("paste_replace_list", '\u2122,TM,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(','); + for (var i=0; i(.*?)<\/p>', 'gi'), '

$1

'); + } + + content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--"); + content = content.replace(new RegExp(bull + "(.*?)
", "gi"), "

" + middot + "$1

"); + content = content.replace(new RegExp('', 'gi'), "" + bull); // Covert to bull list + content = content.replace(/<\/o:p>/gi, ""); + content = content.replace(new RegExp('
]*>/gi, ""); + + if (tinyMCE.getParam("paste_remove_styles", true)) + content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3"); + + content = content.replace(/<\/?font[^>]*>/gi, ""); + + // Strips class attributes. + switch (tinyMCE.getParam("paste_strip_class_attributes", "all")) { + case "all": + content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3"); + break; + + case "mso": + content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3"); + break; + } + + content = content.replace(new RegExp('href="?' + TinyMCE_PastePlugin._reEscape("" + document.location) + '', 'gi'), 'href="' + tinyMCE.settings['document_base_url']); + content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3"); + content = content.replace(/<\\?\?xml[^>]*>/gi, ""); + content = content.replace(/<\/?\w+:[^>]*>/gi, ""); + content = content.replace(/-- page break --\s*

 <\/p>/gi, ""); // Remove pagebreaks + content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks + + // content = content.replace(/\/? */gi, "");   + // content = content.replace(/

 <\/p>/gi, ''); + + if (!tinyMCE.settings['force_p_newlines']) { + content = content.replace('', '' ,'gi'); + content = content.replace('

', '

' ,'gi'); + } + + if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) { + content = content.replace(/<\/?p[^>]*>/gi, ""); + } + + content = content.replace(/<\/?div[^>]*>/gi, ""); + + // Convert all middlot lists to UL lists + if (tinyMCE.getParam("paste_convert_middot_lists", true)) { + var div = document.createElement("div"); + div.innerHTML = content; + + // Convert all middot paragraphs to li elements + var className = tinyMCE.getParam("paste_unindented_list_class", "unIndentedList"); + + while (TinyMCE_PastePlugin._convertMiddots(div, "--list--")) ; // bull + while (TinyMCE_PastePlugin._convertMiddots(div, middot, className)) ; // Middot + while (TinyMCE_PastePlugin._convertMiddots(div, bull)) ; // bull + + content = div.innerHTML; + } + + // Replace all headers with strong and fix some other issues + if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) { + content = content.replace(/ <\/h[1-6]>/gi, '

  

'); + content = content.replace(//gi, '

'); + content = content.replace(/<\/h[1-6]>/gi, '

'); + content = content.replace(/ <\/b>/gi, '  '); + content = content.replace(/^( )*/gi, ''); + } + + content = content.replace(/--list--/gi, ""); // Remove --list-- + + if ((cb = tinyMCE.getParam("paste_insert_word_content_callback", "")) != "") + content = eval(cb + "('after', content)"); + + // Insert cleaned content + tinyMCE.execCommand("mceInsertContent", false, content); + + if (tinyMCE.getParam('paste_force_cleanup_wordpaste', true)) + window.setTimeout('tinyMCE.execCommand("mceCleanup");', 1); // Do normal cleanup detached from this thread + } + }, + + _reEscape : function(s) { + var l = "?.\\*[](){}+^$:"; + var o = ""; + + for (var i=0; i8k3npWTE z_STXHS!s#*>!gx|Yo@ZsW>!X~or(6f8HSR!`Stns%~QLpkDHB#_S}MbXH&+{=9Zzh z?#yQR^0wxx1^@s6A^8LW0018VEC2ui02BZe000G};3tk`X`X1RuAgN^Z0kBrb7aot zpjKB$4aY6Okz`JhPDhA2R1%QD;%Mpx9h=D{J24ar3{>0WqA)oAG#Wz^+%kwxLXub< z?1lt;BzPh$atCz>8V3d!dm?>*9R(B<6dDo(2@MAWZAKl9j~5yS02%-jm?It;n*|UH x69x?u000uCBpwzJxT_PPyBcT!B@7V}4-dX-X}~EO7|jFE1FA&_VoEyR91$H zhF*o+yUXv_-t_+d{r~^~A^8LW000jFEC2ui02BZe000Df@X1N5y*TU5>o7+Heg`=$ zM>Vb`J5+6XI1YlG<>HNl6DSIVBbTDA90dXakZ|A{FcP9bO8^|GhK^#QC9Oj(LshaR z2ng_D!6;5z$V3ouMKH9x8G>#F1jS?n3^ffjGze^C6ft%K2nKhF0(nntVhjR`9h;n; H5)lA9u4PUG literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/paste/jscripts/pastetext.js b/public/javascripts/tiny_mce/plugins/paste/jscripts/pastetext.js new file mode 100755 index 0000000..4c07691 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/paste/jscripts/pastetext.js @@ -0,0 +1,38 @@ +function saveContent() { + if (document.forms[0].htmlSource.value == '') { + tinyMCEPopup.close(); + return false; + } + + tinyMCEPopup.execCommand('mcePasteText', false, { + html : document.forms[0].htmlSource.value, + linebreaks : document.forms[0].linebreaks.checked + }); + + tinyMCEPopup.close(); +} + +function onLoadInit() { + tinyMCEPopup.resizeToInnerSize(); + + // Remove Gecko spellchecking + if (tinyMCE.isGecko) + document.body.spellcheck = tinyMCE.getParam("gecko_spellcheck"); + + resizeInputs(); +} + +var wHeight=0, wWidth=0, owHeight=0, owWidth=0; + +function resizeInputs() { + if (!tinyMCE.isMSIE) { + wHeight = self.innerHeight-80; + wWidth = self.innerWidth-17; + } else { + wHeight = document.body.clientHeight-80; + wWidth = document.body.clientWidth-17; + } + + document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px'; + document.forms[0].htmlSource.style.width = Math.abs(wWidth) + 'px'; +} diff --git a/public/javascripts/tiny_mce/plugins/paste/jscripts/pasteword.js b/public/javascripts/tiny_mce/plugins/paste/jscripts/pasteword.js new file mode 100755 index 0000000..b243a10 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/paste/jscripts/pasteword.js @@ -0,0 +1,52 @@ +function saveContent() { + var html = document.getElementById("frmData").contentWindow.document.body.innerHTML; + + if (html == ''){ + tinyMCEPopup.close(); + return false; + } + + tinyMCEPopup.execCommand('mcePasteWord', false, html); + tinyMCEPopup.close(); +} + +function onLoadInit() { + tinyMCEPopup.resizeToInnerSize(); + + // Fix for endless reloading in FF + window.setTimeout('createIFrame();', 10); +} + +function createIFrame() { + document.getElementById('iframecontainer').innerHTML = ''; +} + +var wHeight=0, wWidth=0, owHeight=0, owWidth=0; + +function initIframe(doc) { + var dir = tinyMCE.selectedInstance.settings['directionality']; + + doc.body.dir = dir; + + // Remove Gecko spellchecking + if (tinyMCE.isGecko) + doc.body.spellcheck = tinyMCE.getParam("gecko_spellcheck"); + + resizeInputs(); +} + +function resizeInputs() { + if (!tinyMCE.isMSIE) { + wHeight = self.innerHeight - 80; + wWidth = self.innerWidth - 18; + } else { + wHeight = document.body.clientHeight - 80; + wWidth = document.body.clientWidth - 18; + } + + var elm = document.getElementById('frmData'); + if (elm) { + elm.style.height = Math.abs(wHeight) + 'px'; + elm.style.width = Math.abs(wWidth) + 'px'; + } +} diff --git a/public/javascripts/tiny_mce/plugins/paste/langs/en.js b/public/javascripts/tiny_mce/plugins/paste/langs/en.js new file mode 100755 index 0000000..b125d51 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/paste/langs/en.js @@ -0,0 +1,10 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : 'Paste as Plain Text', +paste_text_title : 'Use CTRL+V on your keyboard to paste the text into the window.', +paste_text_linebreaks : 'Keep linebreaks', +paste_word_desc : 'Paste from Word', +paste_word_title : 'Use CTRL+V on your keyboard to paste the text into the window.', +selectall_desc : 'Select All' +}); diff --git a/public/javascripts/tiny_mce/plugins/paste/pastetext.htm b/public/javascripts/tiny_mce/plugins/paste/pastetext.htm new file mode 100755 index 0000000..63ff000 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/paste/pastetext.htm @@ -0,0 +1,34 @@ + + + {$lang_paste_text_desc} + + + + + + +
+
{$lang_paste_text_desc}
+ +
+ +
+ +
+ +
{$lang_paste_text_title}
+ + + +
+
+ +
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/paste/pasteword.htm b/public/javascripts/tiny_mce/plugins/paste/pasteword.htm new file mode 100755 index 0000000..7acc7f7 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/paste/pasteword.htm @@ -0,0 +1,29 @@ + + + + {$lang_paste_word_desc} + + + + + + +
+
{$lang_paste_word_desc}
+ +
{$lang_paste_word_title}
+ +
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/paste/readme.txt b/public/javascripts/tiny_mce/plugins/paste/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/paste/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/preview/editor_plugin.js b/public/javascripts/tiny_mce/plugins/preview/editor_plugin.js new file mode 100755 index 0000000..ca4eada --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/preview/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('preview');var TinyMCE_PreviewPlugin={getInfo:function(){return{longname:'Preview',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_preview.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"preview":return tinyMCE.getButtonHTML(cn,'lang_preview_desc','{$pluginurl}/images/preview.gif','mcePreview')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mcePreview":var previewPage=tinyMCE.getParam("plugin_preview_pageurl",null);var previewWidth=tinyMCE.getParam("plugin_preview_width","550");var previewHeight=tinyMCE.getParam("plugin_preview_height","600");if(previewPage){var template=new Array();template['file']=previewPage;template['width']=previewWidth;template['height']=previewHeight;tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"yes",inline:"yes",content:tinyMCE.getContent(),content_css:tinyMCE.getParam("content_css")})}else{var win=window.open("","mcePreview","menubar=no,toolbar=no,scrollbars=yes,resizable=yes,left=20,top=20,width="+previewWidth+",height="+previewHeight);var html="",i;var c=tinyMCE.getContent();var pos=c.indexOf('',pos);pos2=c.lastIndexOf('');c=c.substring(pos+1,pos2)}html+=tinyMCE.getParam('doctype');html+='';html+='';html+=''+tinyMCE.getLang('lang_preview_desc')+'';html+='';html+='';for(i=0;i';html+='';html+='';html+='';html+=c;html+='';html+='';win.document.write(html);win.document.close()}return true}return false},_setDoc:function(d){TinyMCE_PreviewPlugin._doc=d;d._embeds=new Array()},_setWin:function(d){TinyMCE_PreviewPlugin._win=d},_onLoad:function(){var nl,i,el=new Array(),d=TinyMCE_PreviewPlugin._doc,sv,ne;nl=d.getElementsByTagName("script");for(i=0;i';for(n in p)h+='';h+='', pos); + pos2 = c.lastIndexOf(''); + c = c.substring(pos + 1, pos2); + } + + html += tinyMCE.getParam('doctype'); + html += ''; + html += ''; + html += '' + tinyMCE.getLang('lang_preview_desc') + ''; + html += ''; + html += ''; + + for (i=0; i'; + + html += ''; + html += ''; + html += ''; + html += c; + html += ''; + html += ''; + + win.document.write(html); + win.document.close(); + } + + return true; + } + + return false; + }, + + _setDoc : function(d) { + TinyMCE_PreviewPlugin._doc = d; + d._embeds = new Array(); + }, + + _setWin : function(d) { + TinyMCE_PreviewPlugin._win = d; + }, + + _onLoad : function() { + var nl, i, el = new Array(), d = TinyMCE_PreviewPlugin._doc, sv, ne; + + nl = d.getElementsByTagName("script"); + for (i=0; i'; + + h += ' + + + +Example of a custom preview page + + + + +Editor contents:
+{$content} + + + diff --git a/public/javascripts/tiny_mce/plugins/preview/images/preview.gif b/public/javascripts/tiny_mce/plugins/preview/images/preview.gif new file mode 100755 index 0000000000000000000000000000000000000000..318936eaac98edd0d40334abcd2f7c1c10abaec9 GIT binary patch literal 286 zcwPY>0pb2fNk%w1VH5xq0MrctLNX#=n%>{t-ZHm6e~^^jl|5qG(t>VEt(9$;rn0=h z!9sF^Hceyu{Qa@O*@D`dO0sseucF4-?uW03pRULFzFJ~vZ(3SX#mU#gdO|Xil9ZX3 zZ+Cy;3tk`X`blmtgJ&}spvFxO)+pf z*Yu0)Jeq<*Oi>zw$YY{tU??18WAZRSAc+luBS5_%gFt}U=_CkVMPL9SG->9@i6RJS z282$nbL>vSb9vQ6%F(nbX9-_S>5dgx&$jBi8JKA7wKL7v# literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/preview/jscripts/embed.js b/public/javascripts/tiny_mce/plugins/preview/jscripts/embed.js new file mode 100755 index 0000000..f8dc810 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/preview/jscripts/embed.js @@ -0,0 +1,73 @@ +/** + * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. + */ + +function writeFlash(p) { + writeEmbed( + 'D27CDB6E-AE6D-11cf-96B8-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'application/x-shockwave-flash', + p + ); +} + +function writeShockWave(p) { + writeEmbed( + '166B1BCA-3F9C-11CF-8075-444553540000', + 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', + 'application/x-director', + p + ); +} + +function writeQuickTime(p) { + writeEmbed( + '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', + 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', + 'video/quicktime', + p + ); +} + +function writeRealMedia(p) { + writeEmbed( + 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', + 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', + 'audio/x-pn-realaudio-plugin', + p + ); +} + +function writeWindowsMedia(p) { + p.url = p.src; + writeEmbed( + '6BF52A52-394A-11D3-B153-00C04F79FAA6', + 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', + 'application/x-mplayer2', + p + ); +} + +function writeEmbed(cls, cb, mt, p) { + var h = '', n; + + h += ''; + + h += 'Gg7ing9R*A^8LW000jFEC2ui02BZe000Dl@X1N5y*TUrMEc;T3BqBT z4PgiwVSWT5C`y(zC#n*d;5M+t%)nq+5`;vqkun5Sl>{S3U<4crgF(S?7%GgM_|OPs zD*y!E|{0<7#0>aHWEL6BndDU8;y+&e4jmm66%_}QC6xvn4h#bW3={_x jpoxPV4gmok9t#w=ts@#{Ko1AM7r_@1E5*jg#vuSZ^a*OP literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/save/langs/en.js b/public/javascripts/tiny_mce/plugins/save/langs/en.js new file mode 100755 index 0000000..2c56b4b --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/save/langs/en.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +save_desc : 'Save' +}); diff --git a/public/javascripts/tiny_mce/plugins/save/readme.txt b/public/javascripts/tiny_mce/plugins/save/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/save/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/searchreplace/css/searchreplace.css b/public/javascripts/tiny_mce/plugins/searchreplace/css/searchreplace.css new file mode 100755 index 0000000..4c7bd13 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/searchreplace/css/searchreplace.css @@ -0,0 +1,20 @@ +/* stylesheet for advsearchreplace plugin*/ + +.panel_wrapper { height: 85px; } +.panel_wrapper div.current { height: 85px; } + +/* MS IE only styles */ +* html .panel_wrapper { height: 100px; } +* html .panel_wrapper div.current { height: 100px; } + +#replaceBtn, #replaceAllBtn { + padding-bottom: 2px; + font-weight: bold; + width: 90px; + height: 21px; + border: 0; + cursor: pointer; +} + +#replaceBtn { background: url(../images/replace_button_bg.gif); } +#replaceAllBtn { background: url(../images/replace_all_button_bg.gif); } diff --git a/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin.js b/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin.js new file mode 100755 index 0000000..2ba6066 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('searchreplace');var TinyMCE_SearchReplacePlugin={getInfo:function(){return{longname:'Search/Replace',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_searchreplace.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){inst.addShortcut('ctrl','f','lang_searchreplace_search_desc','mceSearch',true);},getControlHTML:function(cn){switch(cn){case"search":return tinyMCE.getButtonHTML(cn,'lang_searchreplace_search_desc','{$pluginurl}/images/search.gif','mceSearch',true);case"replace":return tinyMCE.getButtonHTML(cn,'lang_searchreplace_replace_desc','{$pluginurl}/images/replace.gif','mceSearchReplace',true)}return""},execCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id),selectedText=inst.selection.getSelectedText(),rng;function defValue(key,default_value){value[key]=typeof(value[key])=="undefined"?default_value:value[key]}function replaceSel(search_str,str,back){inst.execCommand('mceInsertContent',false,str)}if(!value)value=[];defValue("editor_id",editor_id);defValue("searchstring",selectedText);defValue("replacestring",null);defValue("replacemode","none");defValue("casesensitive",false);defValue("backwards",false);defValue("wrap",false);defValue("wholeword",false);defValue("inline","yes");defValue("resizable","no");switch(command){case"mceResetSearch":tinyMCE.lastSearchRng=null;return true;case"mceSearch":if(user_interface){var template=new Array();template['file']='../../plugins/searchreplace/searchreplace.htm';template['width']=380;template['height']=155+(tinyMCE.isNS7?20:0)+(tinyMCE.isMSIE?15:0);template['width']+=tinyMCE.getLang('lang_searchreplace_delta_width',0);template['height']+=tinyMCE.getLang('lang_searchreplace_delta_height',0);inst.execCommand('SelectAll');if(tinyMCE.isMSIE){var r=inst.selection.getRng();r.collapse(true);r.select()}else inst.selection.getSel().collapseToStart();tinyMCE.openWindow(template,value)}else{var win=tinyMCE.getInstanceById(editor_id).contentWindow;var doc=tinyMCE.getInstanceById(editor_id).contentWindow.document;var body=tinyMCE.getInstanceById(editor_id).contentWindow.document.body;if(body.innerHTML==""){alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true}if(value['replacemode']=="current"){replaceSel(value['string'],value['replacestring'],value['backwards']);value['replacemode']="none";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true}if(tinyMCE.isMSIE){var rng=tinyMCE.lastSearchRng?tinyMCE.lastSearchRng:doc.selection.createRange();var flags=0;if(value['wholeword'])flags=flags|2;if(value['casesensitive'])flags=flags|4;if(!rng.findText){alert('This operation is currently not supported by this browser.');return true}if(value['replacemode']=="all"){while(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(false);replaceSel(value['string'],value['replacestring'],value['backwards'])}alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true}if(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(value['backwards']);tinyMCE.lastSearchRng=rng}else alert(tinyMCE.getLang('lang_searchreplace_notfound'))}else{if(value['replacemode']=="all"){while(win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))replaceSel(value['string'],value['replacestring'],value['backwards']);alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true}if(!win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))alert(tinyMCE.getLang('lang_searchreplace_notfound'))}}return true;case"mceSearchReplace":value['replacestring']="";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true}return false}};tinyMCE.addPlugin("searchreplace",TinyMCE_SearchReplacePlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js new file mode 100755 index 0000000..f8aee25 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js @@ -0,0 +1,164 @@ +/** + * $Id: editor_plugin_src.js 126 2006-10-22 16:19:55Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +tinyMCE.importPluginLanguagePack('searchreplace'); + +var TinyMCE_SearchReplacePlugin = { + getInfo : function() { + return { + longname : 'Search/Replace', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_searchreplace.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + initInstance : function (inst) { + inst.addShortcut('ctrl', 'f', 'lang_searchreplace_search_desc', 'mceSearch', true); + // No CTRL+R for "replace" because browsers will reload page instead of executing plugin + }, + + getControlHTML : function (cn) { + switch (cn) { + case "search" : + return tinyMCE.getButtonHTML(cn, 'lang_searchreplace_search_desc', '{$pluginurl}/images/search.gif','mceSearch', true); + + case "replace" : + return tinyMCE.getButtonHTML(cn, 'lang_searchreplace_replace_desc', '{$pluginurl}/images/replace.gif', 'mceSearchReplace', true); + } + + return ""; + }, + + execCommand : function (editor_id, element, command, user_interface, value) { + var inst = tinyMCE.getInstanceById(editor_id), selectedText = inst.selection.getSelectedText(), rng; + + function defValue(key, default_value) { + value[key] = typeof(value[key]) == "undefined" ? default_value : value[key]; + } + + function replaceSel(search_str, str, back) { + inst.execCommand('mceInsertContent', false, str); + } + + if (!value) + value = []; + + defValue("editor_id", editor_id); + defValue("searchstring", selectedText); + defValue("replacestring", null); + defValue("replacemode", "none"); + defValue("casesensitive", false); + defValue("backwards", false); + defValue("wrap", false); + defValue("wholeword", false); + defValue("inline", "yes"); + defValue("resizable", "no"); + + switch (command) { + case "mceResetSearch" : + tinyMCE.lastSearchRng = null; + return true; + + case "mceSearch" : + if (user_interface) { + var template = new Array(); + + template['file'] = '../../plugins/searchreplace/searchreplace.htm'; + template['width'] = 380; + template['height'] = 155 + (tinyMCE.isNS7 ? 20 : 0) + (tinyMCE.isMSIE ? 15 : 0); + template['width'] += tinyMCE.getLang('lang_searchreplace_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_searchreplace_delta_height', 0); + + inst.execCommand('SelectAll'); + + if (tinyMCE.isMSIE) { + var r = inst.selection.getRng(); + r.collapse(true); + r.select(); + } else + inst.selection.getSel().collapseToStart(); + + tinyMCE.openWindow(template, value); + } else { + var win = tinyMCE.getInstanceById(editor_id).contentWindow; + var doc = tinyMCE.getInstanceById(editor_id).contentWindow.document; + var body = tinyMCE.getInstanceById(editor_id).contentWindow.document.body; + if (body.innerHTML == "") { + alert(tinyMCE.getLang('lang_searchreplace_notfound')); + return true; + } + + if (value['replacemode'] == "current") { + replaceSel(value['string'], value['replacestring'], value['backwards']); + value['replacemode'] = "none"; + tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false); + return true; + } + + if (tinyMCE.isMSIE) { + var rng = tinyMCE.lastSearchRng ? tinyMCE.lastSearchRng : doc.selection.createRange(); + var flags = 0; + if (value['wholeword']) + flags = flags | 2; + + if (value['casesensitive']) + flags = flags | 4; + + if (!rng.findText) { + alert('This operation is currently not supported by this browser.'); + return true; + } + + if (value['replacemode'] == "all") { + while (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) { + rng.scrollIntoView(); + rng.select(); + rng.collapse(false); + replaceSel(value['string'], value['replacestring'], value['backwards']); + } + + alert(tinyMCE.getLang('lang_searchreplace_allreplaced')); + return true; + } + + if (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) { + rng.scrollIntoView(); + rng.select(); + rng.collapse(value['backwards']); + tinyMCE.lastSearchRng = rng; + } else + alert(tinyMCE.getLang('lang_searchreplace_notfound')); + + } else { + if (value['replacemode'] == "all") { + while (win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false)) + replaceSel(value['string'], value['replacestring'], value['backwards']); + + alert(tinyMCE.getLang('lang_searchreplace_allreplaced')); + return true; + } + + if (!win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false)) + alert(tinyMCE.getLang('lang_searchreplace_notfound')); + } + } + + return true; + + case "mceSearchReplace" : + value['replacestring'] = ""; + tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false); + return true; + } + + return false; + } +}; + +tinyMCE.addPlugin("searchreplace", TinyMCE_SearchReplacePlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/searchreplace/images/replace.gif b/public/javascripts/tiny_mce/plugins/searchreplace/images/replace.gif new file mode 100755 index 0000000000000000000000000000000000000000..784c73e2a9bb6cf369146a5ea6b1300262376eed GIT binary patch literal 125 zcwTe&bhEHb6k!ly*u=`<>+5Tf@nG4qWeF2LOxW<@_Kk}SV4(Pug^_`QjX?**0jXtR zcFNdw=bu26xR!{+1qI&xJJ%DYikVJUs#?Bdp6;1bCe}PHpUs*l9bPo=;qeOA77Hgv Zp-%!;_DN4(tUlD@+_dG`+iOA$)&Nj)FFODL literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif b/public/javascripts/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..123fa5bf5fffa279025bc77e260840705d6c0ca7 GIT binary patch literal 669 zcwPaW0%H9~Nk%w1VOjtc0E8a^0001~+ncf9r@Z8}#puAz>&esZ(%10T+40)k^4<3K z_V@Sq_xShs`1ttv_xSku`T6_ z{r>&_{{8;`{{R2~EC2ui09pVQ000I4ARvxpX`X1Ru56pUa4gSsZQpo)i%9SPz@TtQ zEEy4Vn*|44@944Gj*do28nr zt)Ho_r=Ab6x39enz^k93a1OYomjDC=4-n1I&Ca=}($Ln>)ezOw+_}=<+2GjQ)Dz1h z%McP05!wu=gon41E6r&OkWuV8VwFBSs9kv0uiC6BiC_crRbPBJgJDpdrHs4xm4C z=-jyjXwVrreAcjm@aPR1R1C}*s)i?zFa_n58I(vAO9S@2k_g`n^*5Vy?OEB-=jZ2zyA2}=kt5O;9W$3 z@9G68;D7`cXyAbe9whjmfB!Y;;DZoGDB*+@R%juG3|^?=h8%WSVGAIJDB_4Bh5!IN D&VOW| literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif b/public/javascripts/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..cc2c56e61177a614580b61e367fab32c2da31320 GIT binary patch literal 669 zcwPaW0%H9~Nk%w1VOjtc0E8a^0001(__ z{r>&_{{8;`{{R2~EC2ui09pVQ000I4ARvxpX`X1Ru56pUa4gSsZQpo)i%9SPz@TtQ zEEy4Vn*|44@944Gj*do28nr zt)Ho_r=Ab6x39enz^k93a1OYomjDC=4-n1I&Ca=}($Ln>)ezOw+_}=<+2GjQ)Dz1h z%McP05!wu=gon41E6r&OkWuV8VwFBSs9kv0uiC6BiC_crRbPBJgJDpdrHs4xm4C z=-jyjXwVrreAcjm@aPR1R1C}*s)i?zFa_n58I(vAO9S@2k_g`n^*5Vy?OEB-=jZ2zyA2}=kt5O;9W$3 z@9G68;D7`cXyAbe9whjmfB!Y;;DZoGDB*+@R%juG3|^?=h8%WSVGAIJDB_4Bh5!IN Du3Thj{dMSt5;y`fuDmH}Uz$g$9N~Xo| no need to copy any values! + + // copy values from one panel to the other (if they exist there) + var from_panel_name = tab.id.match(/^search/i) ? "replace_panel" : "search_panel"; + var to_panel_name = (from_panel_name == "search_panel") ? "replace_panel" : "search_panel"; + + // find all elements with IDs to copy their values + var elms = document.getElementById(from_panel_name).getElementsByTagName("*"); + for (var i = 0; i < elms.length; i++) { + if (elms[i].id && elms[i].id != "") { + var checked = "undefined"; + if (elms[i].type.toLowerCase() == "checkbox" || elms[i].type.toLowerCase() == "radio") + checked = elms[i].checked; + + // copy values if element exists in other panel + var to_elm_name = to_panel_name + elms[i].id.substring(from_panel_name.length, elms[i].id.length); + var to_elm = document.getElementById(to_elm_name); + if (to_elm) { + if (checked != "undefined") + to_elm.checked = checked; + else + to_elm.value = elms[i].value; + } + } + } + + return false; +} \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/searchreplace/langs/en.js b/public/javascripts/tiny_mce/plugins/searchreplace/langs/en.js new file mode 100755 index 0000000..32af828 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/searchreplace/langs/en.js @@ -0,0 +1,21 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Find', +searchreplace_searchnext_desc : 'Find again', +searchreplace_replace_desc : 'Find/Replace', +searchreplace_notfound : 'The search has been completed. The search string could not be found.', +searchreplace_search_title : 'Find', +searchreplace_replace_title : 'Find/Replace', +searchreplace_allreplaced : 'All occurrences of the search string were replaced.', +searchreplace_findwhat : 'Find what', +searchreplace_replacewith : 'Replace with', +searchreplace_direction : 'Direction', +searchreplace_up : 'Up', +searchreplace_down : 'Down', +searchreplace_case : 'Match case', +searchreplace_findnext : 'Find next', +searchreplace_replace : 'Replace', +searchreplace_replaceall : 'Replace all', +searchreplace_cancel : 'Cancel' +}); diff --git a/public/javascripts/tiny_mce/plugins/searchreplace/readme.txt b/public/javascripts/tiny_mce/plugins/searchreplace/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/searchreplace/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/searchreplace/searchreplace.htm b/public/javascripts/tiny_mce/plugins/searchreplace/searchreplace.htm new file mode 100755 index 0000000..8575e2a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/searchreplace/searchreplace.htm @@ -0,0 +1,104 @@ + + + {$lang_searchreplace_replace_title} + + + + + + + + +
+ + +
+ +
+ + + + + + + + + + + +
+ + + + + + + + +
+
+ + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + +
+ + + + + + + + +
+
+ + + + + +
+
+
+ +
+ +
+
+ + + + + + +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/style/css/props.css b/public/javascripts/tiny_mce/plugins/style/css/props.css new file mode 100755 index 0000000..b159b5f --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/style/css/props.css @@ -0,0 +1,62 @@ +#text_font { + width: 250px; +} + +#text_size { + width: 70px; +} + +.mceAddSelectValue { + background-color: #DDDDDD; +} + +select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left { + width: 70px; +} + +#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex { + width: 70px; +} + +#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left { + width: 70px; +} + +#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left { + width: 70px; +} + +.panel_wrapper div.current { + padding-top: 10px; + height: 230px; +} + +.delim { + border-left: 1px solid gray; +} + +.tdelim { + border-bottom: 1px solid gray; +} + +#block_display { + width: 145px; +} + +#list_type { + width: 115px; +} + +.disabled { + background-color: #EEEEEE; +} + +#apply { + font-weight: bold; + width: 78px; + height: 21px; + border: 0; + background-image: url('../images/apply_button_bg.gif'); + cursor: pointer; +} + diff --git a/public/javascripts/tiny_mce/plugins/style/editor_plugin.js b/public/javascripts/tiny_mce/plugins/style/editor_plugin.js new file mode 100755 index 0000000..b519081 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/style/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('style');var TinyMCE_StylePlugin={getInfo:function(){return{longname:'Style',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_style.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"styleprops":return tinyMCE.getButtonHTML(cn,'lang_style_styleinfo_desc','{$pluginurl}/images/styleprops.gif','mceStyleProps',true)}return""},execCommand:function(editor_id,element,command,user_interface,value){var e,inst;switch(command){case"mceStyleProps":TinyMCE_StylePlugin._styleProps();return true;case"mceSetElementStyle":inst=tinyMCE.getInstanceById(editor_id);e=inst.selection.getFocusElement();if(e){e.style.cssText=value;inst.repaint()}return true}return false},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){},_styleProps:function(){var e=tinyMCE.selectedInstance.selection.getFocusElement();if(!e)return;tinyMCE.openWindow({file:'../../plugins/style/props.htm',width:480+tinyMCE.getLang('lang_style_props_delta_width',0),height:320+tinyMCE.getLang('lang_style_props_delta_height',0)},{editor_id:tinyMCE.selectedInstance.editorId,inline:"yes",style_text:e.style.cssText})}};tinyMCE.addPlugin("style",TinyMCE_StylePlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/style/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/style/editor_plugin_src.js new file mode 100755 index 0000000..b7e954d --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/style/editor_plugin_src.js @@ -0,0 +1,79 @@ +/** + * $Id: editor_plugin_src.js 126 2006-10-22 16:19:55Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('style'); + +var TinyMCE_StylePlugin = { + getInfo : function() { + return { + longname : 'Style', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_style.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + getControlHTML : function(cn) { + switch (cn) { + case "styleprops": + return tinyMCE.getButtonHTML(cn, 'lang_style_styleinfo_desc', '{$pluginurl}/images/styleprops.gif', 'mceStyleProps', true); + } + + return ""; + }, + + execCommand : function(editor_id, element, command, user_interface, value) { + var e, inst; + + // Handle commands + switch (command) { + case "mceStyleProps": + TinyMCE_StylePlugin._styleProps(); + return true; + + case "mceSetElementStyle": + inst = tinyMCE.getInstanceById(editor_id); + e = inst.selection.getFocusElement(); + + if (e) { + e.style.cssText = value; + inst.repaint(); + } + + return true; + } + + // Pass to next handler in chain + return false; + }, + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + }, + + // Private plugin specific methods + + _styleProps : function() { + var e = tinyMCE.selectedInstance.selection.getFocusElement(); + + if (!e) + return; + + tinyMCE.openWindow({ + file : '../../plugins/style/props.htm', + width : 480 + tinyMCE.getLang('lang_style_props_delta_width', 0), + height : 320 + tinyMCE.getLang('lang_style_props_delta_height', 0) + }, { + editor_id : tinyMCE.selectedInstance.editorId, + inline : "yes", + style_text : e.style.cssText + }); + } +}; + +tinyMCE.addPlugin("style", TinyMCE_StylePlugin); diff --git a/public/javascripts/tiny_mce/plugins/style/images/apply_button_bg.gif b/public/javascripts/tiny_mce/plugins/style/images/apply_button_bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..979e868abb3562f59ac89b3d24bbd47b7aeab075 GIT binary patch literal 1096 zcwU`R`%hDM6u+fFfmOWYwQexi!YnFv3Ye{g{lH`4Ay1cO=;GK4&6pI3Y;$phk<#)g zQ$Q?2Ve&GFx9D+%nl|J5CTdj?px2w?ha4j$yQ&W-yW>?KBOxOaM?g!N54&HW4@h0i;M0 zZp{G*aSR6#U^r%ncCa>v;W)!V5(Kd5sD(~whcxXVNP?WHcI@!e&~~4E+zM?oVC5ER zx=7B{0IQxbs))%_zz|Y^G^rg9nrVt6sij_mB#EgqLSIVg<>XWu+@2%N8rtEYmU@V( zamK+(a?^OFfiX0~s^hChBP?*fcQN@QD&e8^hj0>jZc`4XhK4BLE;_ ztfHRx!c7D9sEvBuMm^M!#wrK^_7($g%;Z!#W5NF4Q2-za#tTVN6qAFYgm28mLOv!jxFZAC6MMS)bqb+SW|)?x8Sl?NFwM=Ijr;Z~qLLmiJTrg0 zID0HZA^MUd<8XLv8Bg}3%xbXN46m)b+5Z0j?1meDY|ftJV%-Z?1!wiqrEuIbjvV=0 zbo{9QXv2ptS9vi)mN!cp_(jx9dGH4; z_goL;nR+&@MJo4984uT|hovk1&RC9=Dtn{7#nmIeQpGi=0JlVeQOS8XJ->Z(-0whB zSb<|XraZE-U}>~)-TFKvcV!toq%Rr^e&;k_r~4}Hy|+7 zYa>JZU9_Ssbfs!AQ|`5qvs}s&YTJu#?g@K}z6lVhJVH0--k0EmX@ldIUM6<4&pE6EVEKB6(ClBH`Nv z>Qq;YRGrdl?yOG=+yC+TlNE)A#vBnErAhvD|7xY1_|A$`W>JLRLouXtVg2HT#*6U@^fVVuC})28W0R0R|Hi92Rt@TyRKOkUHsIbJ&FfhYbM* z2Mi)6q;|iX)O29!tczha2j}(Pm{M_}X%TkuRk78abfk^(@VG9TDj)r zyxLn`bvrs2U5s(;Y*_Ga!R(^}6$jjMH%;$6wR*)xgMbME4G(54KbarCa^?1`i#A>f zE#FoXzHRoJ+W`gz`4e9icx+g`;z~ong`}1XCGMM+Z#r8u|7OF2CrdY9Pq0`}5O83{ zvU3wwJ`FHvDDXJ&|Nno6p$rs%vM@3*I56mdIG{LTVDE2mXlib0ZENr7Y}PaBYL_x# z>T45IXP?}nz`@Pf%&*&J%VEyM(`3ZP(5b~M?7+Otfz6(!Q&gFenR%`ZCzoA^g@9QT zHVka*-gNf;<*6U@^fVVuC})28W0R0R|Hi92Rt@TyRKOkUHsIbJ&FfhYbM* z2Mi)6q;|iX)O29!tczha2j}(Pm{M_}X%TkuRk78abfk^(@VG9TDj)r zyxLn`bvrs2U5s(;Y*_Ga!R(^}6$jjMH%;$6wR*)xgMbME4G(54KbarCa^?1`i#A>f zE#FoXzHRoJ+W`gz`4e9icx+g`;z~ong`}1XCGMM+Z#r8u|7OF2CrdY9Pq0`}5O83{ zvU3wwJ`FHvDDXJ&|Nno6p$rs%vM@3*I56mdIG{LTVDE2mXlib0ZENr7Y}PaBYL_x# z>T45IXP?}nz`@Pf%&*&J%VEyM(`3ZP(5b~M?7+Otfz6(!Q&gFenR%`ZCzoA^g@9QT zHVka*-gNf;< 1) + return a[i]; + + return ""; +} + +function setValue(f, n, v) { + if (f.elements[n].type == "text") + f.elements[n].value = v; + else + selectByValue(f, n, v, true, true); +} + +function setupBox(f, ce, fp, pr, sf, b) { + if (typeof(b) == "undefined") + b = new Array('Top', 'Right', 'Bottom', 'Left'); + + if (isSame(ce, pr, sf, b)) { + f.elements[fp + "_same"].checked = true; + + setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); + f.elements[fp + "_top"].disabled = false; + + f.elements[fp + "_right"].value = ""; + f.elements[fp + "_right"].disabled = true; + f.elements[fp + "_bottom"].value = ""; + f.elements[fp + "_bottom"].disabled = true; + f.elements[fp + "_left"].value = ""; + f.elements[fp + "_left"].disabled = true; + + if (f.elements[fp + "_top_measurement"]) { + selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); + f.elements[fp + "_left_measurement"].disabled = true; + f.elements[fp + "_bottom_measurement"].disabled = true; + f.elements[fp + "_right_measurement"].disabled = true; + } + } else { + f.elements[fp + "_same"].checked = false; + + setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); + f.elements[fp + "_top"].disabled = false; + + setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf])); + f.elements[fp + "_right"].disabled = false; + + setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf])); + f.elements[fp + "_bottom"].disabled = false; + + setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf])); + f.elements[fp + "_left"].disabled = false; + + if (f.elements[fp + "_top_measurement"]) { + selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); + selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf])); + selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf])); + selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf])); + f.elements[fp + "_left_measurement"].disabled = false; + f.elements[fp + "_bottom_measurement"].disabled = false; + f.elements[fp + "_right_measurement"].disabled = false; + } + } +} + +function isSame(e, pr, sf, b) { + var a = new Array(), i, x; + + if (typeof(b) == "undefined") + b = new Array('Top', 'Right', 'Bottom', 'Left'); + + if (typeof(sf) == "undefined" || sf == null) + sf = ""; + + a[0] = e.style[pr + b[0] + sf]; + a[1] = e.style[pr + b[1] + sf]; + a[2] = e.style[pr + b[2] + sf]; + a[3] = e.style[pr + b[3] + sf]; + + for (i=0; i 0 ? s.substring(1) : s; + + if (f.text_none.checked) + s = "none"; + + ce.style.textDecoration = s; + + // Build background styles + + ce.style.backgroundColor = f.background_color.value; + ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : ""; + ce.style.backgroundRepeat = f.background_repeat.value; + ce.style.backgroundAttachment = f.background_attachment.value; + + if (f.background_hpos.value != "") { + s = ""; + s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " "; + s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : ""); + ce.style.backgroundPosition = s; + } + + // Build block styles + + ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : ""); + ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : ""); + ce.style.verticalAlign = f.block_vertical_alignment.value; + ce.style.textAlign = f.block_text_align.value; + ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : ""); + ce.style.whiteSpace = f.block_whitespace.value; + ce.style.display = f.block_display.value; + + // Build box styles + + ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : ""); + ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : ""); + ce.style.styleFloat = f.box_float.value; + + if (tinyMCE.isGecko) + ce.style.cssFloat = f.box_float.value; + + ce.style.clear = f.box_clear.value; + + if (!f.box_padding_same.checked) { + ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); + ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : ""); + ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : ""); + ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : ""); + } else + ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); + + if (!f.box_margin_same.checked) { + ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); + ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : ""); + ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : ""); + ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : ""); + } else + ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); + + // Build border styles + + if (!f.border_style_same.checked) { + ce.style.borderTopStyle = f.border_style_top.value; + ce.style.borderRightStyle = f.border_style_right.value; + ce.style.borderBottomStyle = f.border_style_bottom.value; + ce.style.borderLeftStyle = f.border_style_left.value; + } else + ce.style.borderStyle = f.border_style_top.value; + + if (!f.border_width_same.checked) { + ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); + ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : ""); + ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : ""); + ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : ""); + } else + ce.style.borderWidth = f.border_width_top.value; + + if (!f.border_color_same.checked) { + ce.style.borderTopColor = f.border_color_top.value; + ce.style.borderRightColor = f.border_color_right.value; + ce.style.borderBottomColor = f.border_color_bottom.value; + ce.style.borderLeftColor = f.border_color_left.value; + } else + ce.style.borderColor = f.border_color_top.value; + + // Build list styles + + ce.style.listStyleType = f.list_type.value; + ce.style.listStylePosition = f.list_position.value; + ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : ""; + + // Build positioning styles + + ce.style.position = f.positioning_type.value; + ce.style.visibility = f.positioning_visibility.value; + + if (ce.style.width == "") + ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : ""); + + if (ce.style.height == "") + ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : ""); + + ce.style.zIndex = f.positioning_zindex.value; + ce.style.overflow = f.positioning_overflow.value; + + if (!f.positioning_placement_same.checked) { + ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); + ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : ""); + ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : ""); + ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : ""); + } else { + s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); + ce.style.top = s; + ce.style.right = s; + ce.style.bottom = s; + ce.style.left = s; + } + + if (!f.positioning_clip_same.checked) { + s = "rect("; + s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " "; + s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto"); + s += ")"; + + if (s != "rect(auto auto auto auto)") + ce.style.clip = s; + } else { + s = "rect("; + t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto"; + s += t + " "; + s += t + " "; + s += t + " "; + s += t + ")"; + + if (s != "rect(auto auto auto auto)") + ce.style.clip = s; + } + + ce.style.cssText = tinyMCE.serializeStyle(tinyMCE.parseStyle(ce.style.cssText)); +} + +function isNum(s) { + return new RegExp('[0-9]+', 'g').test(s); +} + +function showDisabledControls() { + var f = document.forms, i, a; + + for (i=0; i 1) { + addSelectValue(f, s, p[0], p[1]); + + if (se) + selectByValue(f, s, p[1]); + } else { + addSelectValue(f, s, p[0], p[0]); + + if (se) + selectByValue(f, s, p[0]); + } + } +} + +function toggleSame(ce, pre) { + var el = document.forms[0].elements, i; + + if (ce.checked) { + el[pre + "_top"].disabled = false; + el[pre + "_right"].disabled = true; + el[pre + "_bottom"].disabled = true; + el[pre + "_left"].disabled = true; + + if (el[pre + "_top_measurement"]) { + el[pre + "_top_measurement"].disabled = false; + el[pre + "_right_measurement"].disabled = true; + el[pre + "_bottom_measurement"].disabled = true; + el[pre + "_left_measurement"].disabled = true; + } + } else { + el[pre + "_top"].disabled = false; + el[pre + "_right"].disabled = false; + el[pre + "_bottom"].disabled = false; + el[pre + "_left"].disabled = false; + + if (el[pre + "_top_measurement"]) { + el[pre + "_top_measurement"].disabled = false; + el[pre + "_right_measurement"].disabled = false; + el[pre + "_bottom_measurement"].disabled = false; + el[pre + "_left_measurement"].disabled = false; + } + } + + showDisabledControls(); +} + +function synch(fr, to) { + var f = document.forms[0]; + + f.elements[to].value = f.elements[fr].value; + + if (f.elements[fr + "_measurement"]) + selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value); +} diff --git a/public/javascripts/tiny_mce/plugins/style/langs/en.js b/public/javascripts/tiny_mce/plugins/style/langs/en.js new file mode 100755 index 0000000..6bed70f --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/style/langs/en.js @@ -0,0 +1,66 @@ +// UK lang variables + +tinyMCE.addToLang('style',{ +title : 'Edit CSS Style', +styleinfo_desc : 'Edit CSS Style', +apply : 'Apply', +text_tab : 'Text', +background_tab : 'Background', +block_tab : 'Block', +box_tab : 'Box', +border_tab : 'Border', +list_tab : 'List', +positioning_tab : 'Positioning', +text_props : 'Text', +text_font : 'Font', +text_size : 'Size', +text_weight : 'Weight', +text_style : 'Style', +text_variant : 'Variant', +text_lineheight : 'Line height', +text_case : 'Case', +text_color : 'Color', +text_decoration : 'Decoration', +text_overline : 'overline', +text_underline : 'underline', +text_striketrough : 'strikethrough', +text_blink : 'blink', +text_none : 'none', +background_color : 'Background color', +background_image : 'Background image', +background_repeat : 'Repeat', +background_attachment : 'Attachment', +background_hpos : 'Horizontal position', +background_vpos : 'Vertical position', +block_wordspacing : 'Word spacing', +block_letterspacing : 'Letter spacing', +block_vertical_alignment : 'Vertical alignment', +block_text_align : 'Text align', +block_text_indent : 'Text indent', +block_whitespace : 'Whitespace', +block_display : 'Display', +box_width : 'Width', +box_height : 'Height', +box_float : 'Float', +box_clear : 'Clear', +padding : 'Padding', +same : 'Same for all', +top : 'Top', +right : 'Right', +bottom : 'Bottom', +left : 'Left', +margin : 'Margin', +style : 'Style', +width : 'Width', +height : 'Height', +color : 'Color', +list_type : 'Type', +bullet_image : 'Bullet image', +position : 'Position', +positioning_type : 'Type', +visibility : 'Visibility', +zindex : 'Z-index', +overflow : 'Overflow', +placement : 'Placement', +clip : 'Clip' +}); diff --git a/public/javascripts/tiny_mce/plugins/style/props.htm b/public/javascripts/tiny_mce/plugins/style/props.htm new file mode 100755 index 0000000..45b1977 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/style/props.htm @@ -0,0 +1,698 @@ + + + {$lang_style_title} + + + + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + +
  +
+
+ +
+ + + +
+ + + + +
+ +   +
+
+ +
+ + + + + +
 
+
{$lang_style_text_decoration} + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +
 
+
+ + + + +
 
+
+ + + + +
  +
+
+ + + + +
  +
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
  +
+
+ + + + +
  +
+
+ + + + +
  +
+
+
+ +
+ + + + + + + + + + + + + + +
+ + + + +
  +
+
   
+ + + + +
  +
+
   
+
+
+ {$lang_style_padding} + + + + + + + + + + + + + + + + + + + + + + +
 
+ + + + +
  +
+
+ + + + +
  +
+
+ + + + +
  +
+
+ + + + +
  +
+
+
+
+ +
+
+ {$lang_style_margin} + + + + + + + + + + + + + + + + + + + + + + +
 
+ + + + +
  +
+
+ + + + +
  +
+
+ + + + +
  +
+
+ + + + +
  +
+
+
+
+
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
  {$lang_style_style} {$lang_style_width} {$lang_style_color}
      
{$lang_style_top}   + + + + +
  +
+
  + + + + + +
 
+
{$lang_style_right}   + + + + +
  +
+
  + + + + + +
 
+
{$lang_style_bottom}   + + + + +
  +
+
  + + + + + +
 
+
{$lang_style_left}   + + + + +
  +
+
  + + + + + +
 
+
+
+ +
+ + + + + + + + + + + + + + + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
   
+ + + + +
  +
+
   
+ + + + +
  +
+
   
+ +
+
+ {$lang_style_placement} + + + + + + + + + + + + + + + + + + + + + + +
 
{$lang_style_top} + + + + +
  +
+
{$lang_style_right} + + + + +
  +
+
{$lang_style_bottom} + + + + +
  +
+
{$lang_style_left} + + + + +
  +
+
+
+
+ +
+
+ {$lang_style_clip} + + + + + + + + + + + + + + + + + + + + + + +
 
{$lang_style_top} + + + + +
  +
+
{$lang_style_right} + + + + +
  +
+
{$lang_style_bottom} + + + + +
  +
+
{$lang_style_left} + + + + +
  +
+
+
+
+
+
+
+ +
+
+
+ +
 
+
+
+ +
+ +
+
+
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/style/readme.txt b/public/javascripts/tiny_mce/plugins/style/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/style/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/table/cell.htm b/public/javascripts/tiny_mce/plugins/table/cell.htm new file mode 100755 index 0000000..7171d4f --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/cell.htm @@ -0,0 +1,182 @@ + + + {$lang_table_cell_title} + + + + + + + + +
+ + +
+
+
+ {$lang_table_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ +
+
+
+ +
+
+ {$lang_table_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/table/css/cell.css b/public/javascripts/tiny_mce/plugins/table/css/cell.css new file mode 100755 index 0000000..a067ecd --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/css/cell.css @@ -0,0 +1,17 @@ +/* CSS file for cell dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#class { + width: 150px; +} \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/table/css/row.css b/public/javascripts/tiny_mce/plugins/table/css/row.css new file mode 100755 index 0000000..1f7755d --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/css/row.css @@ -0,0 +1,25 @@ +/* CSS file for row dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#rowtype,#align,#valign,#class,#height { + width: 150px; +} + +#height { + width: 50px; +} + +.col2 { + padding-left: 20px; +} diff --git a/public/javascripts/tiny_mce/plugins/table/css/table.css b/public/javascripts/tiny_mce/plugins/table/css/table.css new file mode 100755 index 0000000..804f766 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/css/table.css @@ -0,0 +1,13 @@ +/* CSS file for table dialog in the table plugin */ + +.panel_wrapper div.current { + height: 220px; +} + +.advfield { + width: 200px; +} + +#class { + width: 150px; +} diff --git a/public/javascripts/tiny_mce/plugins/table/editor_plugin.js b/public/javascripts/tiny_mce/plugins/table/editor_plugin.js new file mode 100755 index 0000000..b476b05 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('table');var TinyMCE_TablePlugin={getInfo:function(){return{longname:'Tables',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(tinyMCE.isGecko){var doc=inst.getDoc();tinyMCE.addEvent(doc,"mouseup",TinyMCE_TablePlugin._mouseDownHandler)}inst.tableRowClipboard=null},getControlHTML:function(control_name){var controls=new Array(['table','table.gif','lang_table_desc','mceInsertTable',true],['delete_table','table_delete.gif','lang_table_del','mceTableDelete'],['delete_col','table_delete_col.gif','lang_table_delete_col_desc','mceTableDeleteCol'],['delete_row','table_delete_row.gif','lang_table_delete_row_desc','mceTableDeleteRow'],['col_after','table_insert_col_after.gif','lang_table_col_after_desc','mceTableInsertColAfter'],['col_before','table_insert_col_before.gif','lang_table_col_before_desc','mceTableInsertColBefore'],['row_after','table_insert_row_after.gif','lang_table_row_after_desc','mceTableInsertRowAfter'],['row_before','table_insert_row_before.gif','lang_table_row_before_desc','mceTableInsertRowBefore'],['row_props','table_row_props.gif','lang_table_row_desc','mceTableRowProps',true],['cell_props','table_cell_props.gif','lang_table_cell_desc','mceTableCellProps',true],['split_cells','table_split_cells.gif','lang_table_split_cells_desc','mceTableSplitCells',true],['merge_cells','table_merge_cells.gif','lang_table_merge_cells_desc','mceTableMergeCells',true]);for(var i=0;i4?but[4]:false)+(but.length>5?', \''+but[5]+'\'':'')+');return false;';if(but[0]==control_name)return tinyMCE.getButtonHTML(control_name,but[2],'{$pluginurl}/images/'+but[1],but[3],(but.length>4?but[4]:false))}if(control_name=="tablecontrols"){var html="";html+=tinyMCE.getControlHTML("table");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_props");html+=tinyMCE.getControlHTML("cell_props");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_before");html+=tinyMCE.getControlHTML("row_after");html+=tinyMCE.getControlHTML("delete_row");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("col_before");html+=tinyMCE.getControlHTML("col_after");html+=tinyMCE.getControlHTML("delete_col");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("split_cells");html+=tinyMCE.getControlHTML("merge_cells");return html}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceInsertTable":case"mceTableRowProps":case"mceTableCellProps":case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":case"mceTableDelete":var inst=tinyMCE.getInstanceById(editor_id);inst.execCommand('mceBeginUndoLevel');TinyMCE_TablePlugin._doExecCommand(editor_id,element,command,user_interface,value);inst.execCommand('mceEndUndoLevel');return true}return false},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var colspan="1",rowspan="1",tdElm;var inst=tinyMCE.getInstanceById(editor_id);tinyMCE.switchClass(editor_id+'_table','mceButtonNormal');tinyMCE.switchClass(editor_id+'_delete_table','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_row_props','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_cell_props','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_row_before','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_row_after','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_delete_row','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_col_before','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_col_after','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_delete_col','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_split_cells','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_merge_cells','mceButtonDisabled');if(tdElm=tinyMCE.getParentElement(node,"td,th")){tinyMCE.switchClass(editor_id+'_cell_props','mceButtonSelected');tinyMCE.switchClass(editor_id+'_delete_table','mceButtonNormal');tinyMCE.switchClass(editor_id+'_row_before','mceButtonNormal');tinyMCE.switchClass(editor_id+'_row_after','mceButtonNormal');tinyMCE.switchClass(editor_id+'_delete_row','mceButtonNormal');tinyMCE.switchClass(editor_id+'_col_before','mceButtonNormal');tinyMCE.switchClass(editor_id+'_col_after','mceButtonNormal');tinyMCE.switchClass(editor_id+'_delete_col','mceButtonNormal');colspan=tinyMCE.getAttrib(tdElm,"colspan");rowspan=tinyMCE.getAttrib(tdElm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;if(colspan!="1"||rowspan!="1")tinyMCE.switchClass(editor_id+'_split_cells','mceButtonNormal')}if(tinyMCE.getParentElement(node,"tr"))tinyMCE.switchClass(editor_id+'_row_props','mceButtonSelected');if(tinyMCE.getParentElement(node,"table")){tinyMCE.switchClass(editor_id+'_table','mceButtonSelected');tinyMCE.switchClass(editor_id+'_merge_cells','mceButtonNormal')}},_mouseDownHandler:function(e){var elm=tinyMCE.isMSIE?event.srcElement:e.target;var focusElm=tinyMCE.selectedInstance.getFocusElement();if(elm.nodeName=="BODY"&&(focusElm.nodeName=="TD"||focusElm.nodeName=="TH"||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TD")||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TH"))){window.setTimeout(function(){var tableElm=tinyMCE.getParentElement(focusElm,"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance)},10)}},_doExecCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();var trElm=tinyMCE.getParentElement(focusElm,"tr");var tdElm=tinyMCE.getParentElement(focusElm,"td,th");var tableElm=tinyMCE.getParentElement(focusElm,"table");var doc=inst.contentWindow.document;var tableBorder=tableElm?tableElm.getAttribute("border"):"";if(trElm&&tdElm==null)tdElm=trElm.cells[0];function inArray(ar,v){for(var i=0;i0&&inArray(ar[i],v))return true;if(ar[i]==v)return true}return false}function makeTD(){var newTD=doc.createElement("td");newTD.innerHTML=" "}function getColRowSpan(td){var colspan=tinyMCE.getAttrib(td,"colspan");var rowspan=tinyMCE.getAttrib(td,"rowspan");colspan=colspan==""?1:parseInt(colspan);rowspan=rowspan==""?1:parseInt(rowspan);return{colspan:colspan,rowspan:rowspan}}function getCellPos(grid,td){var x,y;for(y=0;y1){for(var i=x;i1)td.rowSpan=sd.rowspan+1;lastElm=td}deleteMarked(tableElm)}}function prevElm(node,name){while((node=node.previousSibling)!=null){if(node.nodeName==name)return node}return null}function nextElm(node,names){var namesAr=names.split(',');while((node=node.nextSibling)!=null){for(var i=0;i1){do{var nexttd=nextElm(td,"TD,TH");if(td._delete)td.parentNode.removeChild(td)}while((td=nexttd)!=null)}}while((tr=next)!=null)}function addRows(td_elm,tr_elm,rowspan){td_elm.rowSpan=1;var trNext=nextElm(tr_elm,"TR");for(var i=1;i1){var newTD=cells[x].cloneNode(true);var sd=getColRowSpan(cells[x]);newTD.rowSpan=sd.rowspan-1;var nextTD=nextTR.cells[x];if(nextTD==null)nextTR.appendChild(newTD);else nextTR.insertBefore(newTD,nextTD)}}var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd.rowspan>1){tdElm.rowSpan=sd.rowspan-1}else{trElm=tdElm.parentNode;if(trElm.parentNode)trElm._delete=true}lastTDElm=tdElm}}deleteMarked(tableElm);cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,0),tinyMCE.isGecko,true);break;case"mceTableInsertColBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML=" ";newTD.rowSpan=tdElm.rowSpan;tdElm.parentNode.insertBefore(newTD,tdElm)}else tdElm.colSpan++;lastTDElm=tdElm}}grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,cpos.cellindex+1),tinyMCE.isGecko,true);break;case"mceTableInsertColAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML=" ";newTD.rowSpan=tdElm.rowSpan;var nextTD=nextElm(tdElm,"TD,TH");if(nextTD==null)tdElm.parentNode.appendChild(newTD);else nextTD.parentNode.insertBefore(newTD,nextTD)}else tdElm.colSpan++;lastTDElm=tdElm}}grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,cpos.cellindex),tinyMCE.isGecko,true);break;case"mceTableDeleteCol":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;if(grid.length>1&&grid[0].length<=1){tableElm=tinyMCE.getParentElement(tableElm,"table");tableElm.parentNode.removeChild(tableElm);return true}for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']>1)tdElm.colSpan=sd['colspan']-1;else{if(tdElm.parentNode)tdElm.parentNode.removeChild(tdElm)}lastTDElm=tdElm}}cpos.cellindex--;if(cpos.cellindex<0)cpos.cellindex=0;grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,0),tinyMCE.isGecko,true);break;case"mceTableSplitCells":if(!trElm||!tdElm)return true;var spandata=getColRowSpan(tdElm);var colspan=spandata["colspan"];var rowspan=spandata["rowspan"];if(colspan>1||rowspan>1){tdElm.colSpan=1;for(var i=1;i1)addRows(newTD,trElm,rowspan)}addRows(tdElm,trElm,rowspan)}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");break;case"mceTableMergeCells":var rows=new Array();var sel=inst.getSel();var grid=getTableGrid(tableElm);if(tinyMCE.isMSIE||sel.rangeCount==1){if(user_interface){var template=new Array();var sp=getColRowSpan(tdElm);template['file']='../../plugins/table/merge_cells.htm';template['width']=250;template['height']=105+(tinyMCE.isNS7?25:0);template['width']+=tinyMCE.getLang('lang_table_merge_cells_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_merge_cells_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes",action:"update",numcols:sp.colspan,numrows:sp.rowspan});return true}else{var numRows=parseInt(value['numrows']);var numCols=parseInt(value['numcols']);var cpos=getCellPos(grid,tdElm);if((""+numRows)=="NaN")numRows=1;if((""+numCols)=="NaN")numCols=1;var tRows=tableElm.rows;for(var y=cpos.rowindex;y0)rows[rows.length]=rowCells}}}else{var cells=new Array();var sel=inst.getSel();var lastTR=null;var curRow=null;var x1=-1,y1=-1,x2,y2;if(sel.rangeCount<2)return true;for(var i=0;i0)rows[rows.length]=rowCells}var curRow=new Array();var lastTR=null;for(var y=0;ycolSpan)colSpan=rowColSpan;lastRowSpan=-1}var lastColSpan=-1;for(var x=0;xrowSpan)rowSpan=colRowSpan;lastColSpan=-1}tdElm=rows[0][0];tdElm.rowSpan=rowSpan;tdElm.colSpan=colSpan;for(var y=0;y0))tdElm.innerHTML+=html;if(rows[y][x]!=tdElm&&!rows[y][x]._deleted){var cpos=getCellPos(grid,rows[y][x]);var tr=rows[y][x].parentNode;tr.removeChild(rows[y][x]);rows[y][x]._deleted=true;if(!tr.hasChildNodes()){tr.parentNode.removeChild(tr);var lastCell=null;for(var x=0;cellElm=getCell(grid,cpos.rowindex,x);x++){if(cellElm!=lastCell&&cellElm.rowSpan>1)cellElm.rowSpan--;lastCell=cellElm}if(tdElm.rowSpan>1)tdElm.rowSpan--}}}}break}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);tinyMCE.triggerNodeChange();inst.repaint()}return true}return false}};tinyMCE.addPlugin("table",TinyMCE_TablePlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/table/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/table/editor_plugin_src.js new file mode 100755 index 0000000..21d23cf --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/editor_plugin_src.js @@ -0,0 +1,1073 @@ +/** + * $Id: editor_plugin_src.js 126 2006-10-22 16:19:55Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('table'); + +var TinyMCE_TablePlugin = { + getInfo : function() { + return { + longname : 'Tables', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + initInstance : function(inst) { + if (tinyMCE.isGecko) { + var doc = inst.getDoc(); + tinyMCE.addEvent(doc, "mouseup", TinyMCE_TablePlugin._mouseDownHandler); + } + + inst.tableRowClipboard = null; + }, + + /** + * Returns the HTML contents of the table control. + */ + getControlHTML : function(control_name) { + var controls = new Array( + ['table', 'table.gif', 'lang_table_desc', 'mceInsertTable', true], + ['delete_table', 'table_delete.gif', 'lang_table_del', 'mceTableDelete'], + ['delete_col', 'table_delete_col.gif', 'lang_table_delete_col_desc', 'mceTableDeleteCol'], + ['delete_row', 'table_delete_row.gif', 'lang_table_delete_row_desc', 'mceTableDeleteRow'], + ['col_after', 'table_insert_col_after.gif', 'lang_table_col_after_desc', 'mceTableInsertColAfter'], + ['col_before', 'table_insert_col_before.gif', 'lang_table_col_before_desc', 'mceTableInsertColBefore'], + ['row_after', 'table_insert_row_after.gif', 'lang_table_row_after_desc', 'mceTableInsertRowAfter'], + ['row_before', 'table_insert_row_before.gif', 'lang_table_row_before_desc', 'mceTableInsertRowBefore'], + ['row_props', 'table_row_props.gif', 'lang_table_row_desc', 'mceTableRowProps', true], + ['cell_props', 'table_cell_props.gif', 'lang_table_cell_desc', 'mceTableCellProps', true], + ['split_cells', 'table_split_cells.gif', 'lang_table_split_cells_desc', 'mceTableSplitCells', true], + ['merge_cells', 'table_merge_cells.gif', 'lang_table_merge_cells_desc', 'mceTableMergeCells', true]); + + // Render table control + for (var i=0; i 4 ? but[4] : false) + (but.length > 5 ? ', \'' + but[5] + '\'' : '') + ');return false;'; + + if (but[0] == control_name) + return tinyMCE.getButtonHTML(control_name, but[2], '{$pluginurl}/images/'+ but[1], but[3], (but.length > 4 ? but[4] : false)); + } + + // Special tablecontrols + if (control_name == "tablecontrols") { + var html = ""; + + html += tinyMCE.getControlHTML("table"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("row_props"); + html += tinyMCE.getControlHTML("cell_props"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("row_before"); + html += tinyMCE.getControlHTML("row_after"); + html += tinyMCE.getControlHTML("delete_row"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("col_before"); + html += tinyMCE.getControlHTML("col_after"); + html += tinyMCE.getControlHTML("delete_col"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("split_cells"); + html += tinyMCE.getControlHTML("merge_cells"); + + return html; + } + + return ""; + }, + + /** + * Executes the table commands. + */ + execCommand : function(editor_id, element, command, user_interface, value) { + // Is table command + switch (command) { + case "mceInsertTable": + case "mceTableRowProps": + case "mceTableCellProps": + case "mceTableSplitCells": + case "mceTableMergeCells": + case "mceTableInsertRowBefore": + case "mceTableInsertRowAfter": + case "mceTableDeleteRow": + case "mceTableInsertColBefore": + case "mceTableInsertColAfter": + case "mceTableDeleteCol": + case "mceTableCutRow": + case "mceTableCopyRow": + case "mceTablePasteRowBefore": + case "mceTablePasteRowAfter": + case "mceTableDelete": + var inst = tinyMCE.getInstanceById(editor_id); + + inst.execCommand('mceBeginUndoLevel'); + TinyMCE_TablePlugin._doExecCommand(editor_id, element, command, user_interface, value); + inst.execCommand('mceEndUndoLevel'); + + return true; + } + + // Pass to next handler in chain + return false; + }, + + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + var colspan = "1", rowspan = "1", tdElm; + + var inst = tinyMCE.getInstanceById(editor_id); + + // Reset table controls + tinyMCE.switchClass(editor_id + '_table', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_delete_table', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonDisabled'); + + // Within a td element + if (tdElm = tinyMCE.getParentElement(node, "td,th")) { + tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonSelected'); + tinyMCE.switchClass(editor_id + '_delete_table', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonNormal'); + + colspan = tinyMCE.getAttrib(tdElm, "colspan"); + rowspan = tinyMCE.getAttrib(tdElm, "rowspan"); + + colspan = colspan == "" ? "1" : colspan; + rowspan = rowspan == "" ? "1" : rowspan; + + if (colspan != "1" || rowspan != "1") + tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonNormal'); + } + + // Within a tr element + if (tinyMCE.getParentElement(node, "tr")) + tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonSelected'); + + // Within table + if (tinyMCE.getParentElement(node, "table")) { + tinyMCE.switchClass(editor_id + '_table', 'mceButtonSelected'); + tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonNormal'); + } + }, + + // Private plugin internal methods + + _mouseDownHandler : function(e) { + var elm = tinyMCE.isMSIE ? event.srcElement : e.target; + var focusElm = tinyMCE.selectedInstance.getFocusElement(); + + // If press on special Mozilla create TD/TR thingie + if (elm.nodeName == "BODY" && (focusElm.nodeName == "TD" || focusElm.nodeName == "TH" || (focusElm.parentNode && focusElm.parentNode.nodeName == "TD") ||(focusElm.parentNode && focusElm.parentNode.nodeName == "TH") )) { + window.setTimeout(function() { + var tableElm = tinyMCE.getParentElement(focusElm, "table"); + tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance); + }, 10); + } + }, + + /** + * Executes the table commands. + */ + _doExecCommand : function(editor_id, element, command, user_interface, value) { + var inst = tinyMCE.getInstanceById(editor_id); + var focusElm = inst.getFocusElement(); + var trElm = tinyMCE.getParentElement(focusElm, "tr"); + var tdElm = tinyMCE.getParentElement(focusElm, "td,th"); + var tableElm = tinyMCE.getParentElement(focusElm, "table"); + var doc = inst.contentWindow.document; + var tableBorder = tableElm ? tableElm.getAttribute("border") : ""; + + // Get first TD if no TD found + if (trElm && tdElm == null) + tdElm = trElm.cells[0]; + + // ------- Inner functions --------- + function inArray(ar, v) { + for (var i=0; i 0 && inArray(ar[i], v)) + return true; + + // Found value + if (ar[i] == v) + return true; + } + + return false; + } + + function makeTD() { + var newTD = doc.createElement("td"); + newTD.innerHTML = " "; + } + + function getColRowSpan(td) { + var colspan = tinyMCE.getAttrib(td, "colspan"); + var rowspan = tinyMCE.getAttrib(td, "rowspan"); + + colspan = colspan == "" ? 1 : parseInt(colspan); + rowspan = rowspan == "" ? 1 : parseInt(rowspan); + + return {colspan : colspan, rowspan : rowspan}; + } + + function getCellPos(grid, td) { + var x, y; + + for (y=0; y 1) { // Remove due to colspan + for (var i=x; i 1) + td.rowSpan = sd.rowspan + 1; + + lastElm = td; + } + + deleteMarked(tableElm); + } + } + + function prevElm(node, name) { + while ((node = node.previousSibling) != null) { + if (node.nodeName == name) + return node; + } + + return null; + } + + function nextElm(node, names) { + var namesAr = names.split(','); + + while ((node = node.nextSibling) != null) { + for (var i=0; i 1) { + do { + var nexttd = nextElm(td, "TD,TH"); + + if (td._delete) + td.parentNode.removeChild(td); + } while ((td = nexttd) != null); + } + } while ((tr = next) != null); + } + + function addRows(td_elm, tr_elm, rowspan) { + // Add rows + td_elm.rowSpan = 1; + var trNext = nextElm(tr_elm, "TR"); + for (var i=1; i 1) { + var newTD = cells[x].cloneNode(true); + var sd = getColRowSpan(cells[x]); + + newTD.rowSpan = sd.rowspan - 1; + + var nextTD = nextTR.cells[x]; + + if (nextTD == null) + nextTR.appendChild(newTD); + else + nextTR.insertBefore(newTD, nextTD); + } + } + + // Delete cells + var lastTDElm = null; + for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd.rowspan > 1) { + tdElm.rowSpan = sd.rowspan - 1; + } else { + trElm = tdElm.parentNode; + + if (trElm.parentNode) + trElm._delete = true; + } + + lastTDElm = tdElm; + } + } + + deleteMarked(tableElm); + + cpos.rowindex--; + if (cpos.rowindex < 0) + cpos.rowindex = 0; + + // Recalculate grid and select + grid = getTableGrid(tableElm); + inst.selection.selectNode(getCell(grid, cpos.rowindex, 0), tinyMCE.isGecko, true); // Only collape on gecko + break; + + case "mceTableInsertColBefore": + if (!trElm || !tdElm) + return true; + + var grid = getTableGrid(tableElm); + var cpos = getCellPos(grid, tdElm); + var lastTDElm = null; + + for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd['colspan'] == 1) { + var newTD = doc.createElement(tdElm.nodeName); + + newTD.innerHTML = " "; + newTD.rowSpan = tdElm.rowSpan; + + tdElm.parentNode.insertBefore(newTD, tdElm); + } else + tdElm.colSpan++; + + lastTDElm = tdElm; + } + } + + grid = getTableGrid(tableElm); + inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex + 1), tinyMCE.isGecko, true); // Only collape on gecko + break; + + case "mceTableInsertColAfter": + if (!trElm || !tdElm) + return true; + + var grid = getTableGrid(tableElm); + var cpos = getCellPos(grid, tdElm); + var lastTDElm = null; + + for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd['colspan'] == 1) { + var newTD = doc.createElement(tdElm.nodeName); + + newTD.innerHTML = " "; + newTD.rowSpan = tdElm.rowSpan; + + var nextTD = nextElm(tdElm, "TD,TH"); + if (nextTD == null) + tdElm.parentNode.appendChild(newTD); + else + nextTD.parentNode.insertBefore(newTD, nextTD); + } else + tdElm.colSpan++; + + lastTDElm = tdElm; + } + } + + grid = getTableGrid(tableElm); + inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko + break; + + case "mceTableDeleteCol": + if (!trElm || !tdElm) + return true; + + var grid = getTableGrid(tableElm); + var cpos = getCellPos(grid, tdElm); + var lastTDElm = null; + + // Only one col, remove whole table + if (grid.length > 1 && grid[0].length <= 1) { + tableElm = tinyMCE.getParentElement(tableElm, "table"); // Look for table instead of tbody + tableElm.parentNode.removeChild(tableElm); + return true; + } + + // Delete cells + for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd['colspan'] > 1) + tdElm.colSpan = sd['colspan'] - 1; + else { + if (tdElm.parentNode) + tdElm.parentNode.removeChild(tdElm); + } + + lastTDElm = tdElm; + } + } + + cpos.cellindex--; + if (cpos.cellindex < 0) + cpos.cellindex = 0; + + // Recalculate grid and select + grid = getTableGrid(tableElm); + inst.selection.selectNode(getCell(grid, cpos.rowindex, 0), tinyMCE.isGecko, true); // Only collape on gecko + break; + + case "mceTableSplitCells": + if (!trElm || !tdElm) + return true; + + var spandata = getColRowSpan(tdElm); + + var colspan = spandata["colspan"]; + var rowspan = spandata["rowspan"]; + + // Needs splitting + if (colspan > 1 || rowspan > 1) { + // Generate cols + tdElm.colSpan = 1; + for (var i=1; i 1) + addRows(newTD, trElm, rowspan); + } + + addRows(tdElm, trElm, rowspan); + } + + // Apply visual aids + tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + break; + + case "mceTableMergeCells": + var rows = new Array(); + var sel = inst.getSel(); + var grid = getTableGrid(tableElm); + + if (tinyMCE.isMSIE || sel.rangeCount == 1) { + if (user_interface) { + // Setup template + var template = new Array(); + var sp = getColRowSpan(tdElm); + + template['file'] = '../../plugins/table/merge_cells.htm'; + template['width'] = 250; + template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0); + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_table_merge_cells_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_table_merge_cells_delta_height', 0); + + // Open window + tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : "update", numcols : sp.colspan, numrows : sp.rowspan}); + + return true; + } else { + var numRows = parseInt(value['numrows']); + var numCols = parseInt(value['numcols']); + var cpos = getCellPos(grid, tdElm); + + if (("" + numRows) == "NaN") + numRows = 1; + + if (("" + numCols) == "NaN") + numCols = 1; + + // Get rows and cells + var tRows = tableElm.rows; + for (var y=cpos.rowindex; y 0) + rows[rows.length] = rowCells; + } + + //return true; + } + } else { + var cells = new Array(); + var sel = inst.getSel(); + var lastTR = null; + var curRow = null; + var x1 = -1, y1 = -1, x2, y2; + + // Only one cell selected, whats the point? + if (sel.rangeCount < 2) + return true; + + // Get all selected cells + for (var i=0; i 0) + rows[rows.length] = rowCells; + } + + // Find selected cells in grid and box + var curRow = new Array(); + var lastTR = null; + for (var y=0; y colSpan) + colSpan = rowColSpan; + + lastRowSpan = -1; + } + + // Validate vertical and get total rowspan + var lastColSpan = -1; + for (var x=0; x rowSpan) + rowSpan = colRowSpan; + + lastColSpan = -1; + } + + // Setup td + tdElm = rows[0][0]; + tdElm.rowSpan = rowSpan; + tdElm.colSpan = colSpan; + + // Merge cells + for (var y=0; y 0)) + tdElm.innerHTML += html; + + // Not current cell + if (rows[y][x] != tdElm && !rows[y][x]._deleted) { + var cpos = getCellPos(grid, rows[y][x]); + var tr = rows[y][x].parentNode; + + tr.removeChild(rows[y][x]); + rows[y][x]._deleted = true; + + // Empty TR, remove it + if (!tr.hasChildNodes()) { + tr.parentNode.removeChild(tr); + + var lastCell = null; + for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) { + if (cellElm != lastCell && cellElm.rowSpan > 1) + cellElm.rowSpan--; + + lastCell = cellElm; + } + + if (tdElm.rowSpan > 1) + tdElm.rowSpan--; + } + } + } + } + + break; + } + + tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance); + tinyMCE.triggerNodeChange(); + inst.repaint(); + } + + return true; + } + + // Pass to next handler in chain + return false; + } +}; + +tinyMCE.addPlugin("table", TinyMCE_TablePlugin); diff --git a/public/javascripts/tiny_mce/plugins/table/images/buttons.gif b/public/javascripts/tiny_mce/plugins/table/images/buttons.gif new file mode 100755 index 0000000000000000000000000000000000000000..8c09ff952c4b7108367bc11ba2bd70ca1ed104cb GIT binary patch literal 1765 zcwViM`&ZJ30>I%57%B*g@5c#H^I0mE3HAUiMXojC9xFR$gqW>uhGd(^+jYD|RD6J5 z!)Jt2sHdhW^NvZ7iKito6pI<+p#H55+^7&PWD`W}s z5u43su~|v z%r0J~^R(jbZE=UCs()JxerO%r9GTfRnYa7CGtK?7<+A4tky%Eh3fMW#;yO?_we|hD zNq>Kcbh3=jRnb!f-28^GDs_odp|Q9@hp z>H8HolaiPNN|L`ju3G|*j#WfOk<~~f`4EXT^i-A3K6jR#R+)Iz_q$|ipg4o#J>84N zdf?AaHfITCN#1Ym{)r;9Pa3O25YFnPdC{?Ywt!h{fiH~6ak$N3Qh*$@>lo527Ka@k zfOn4Jty#gcZ z?xd%40jw3daw_%3L+K;bt~&~<^id@t&S)QqO3-^Qay_G{j1&Hulg=h*Z1IoXY@^UE z04oZVTIYsk?+vowpCb^143=gXZjbg8EXu*4(VyK)aTJuAFCUd{#b7oYq6l^SFJF2b z@^bnI&EW$(pu6*P9b97s;RiVWM;+JCXDIwOD6^%Pq?(s{n_P0>%v2h2w|7P&m_XFvT^wT=V-mX(yx75)UP(t1SbVYlu4^2%%r76Ql?T)@kQh-fw%P3z zPl<3#@f6HU&7v=l2<00?KCsTlnfla}G*|6^Vtd<9}^C=$mr{<4bL0w;km3LOVK|&Qlw* z>d1hdD{ricT|mRXs?B{(L88K4KU?Vy4;GFPH08_$T*d~nlNhmgzJzE`^KQRP(p){+ z@*>^4%b%v{R|esqDjdQ0vE+gye15I&+~(6-gz_a{mo zHpAffxe^-kN-c{9!v^=|EqvmCu-_zI83ODBR`C>!!w}~^I@N=_@j~R7&Q^-QZ9qmx z1!^VN_Ra7=obIWR-GBYC^BU`}qqF%&I3>9s`DsB89*dnErRoWj6+dqdt{ppEcg}S^ zj$4cu&Wmg>|C^OQyolx>GB}C;z*9#eb9+FCww>&)KfNw%%HNh4vXKMhrE2Qu93k|O zR%jt;pdX6d|K0Qb?vzi*=75C>i2V>?ex!@C+0|2vlhy8^%URcI>DKhP?NI?Lty=_g2~h3+KzIM(yqDEw{v33+VWCfYLcq*{{H^LvU=X>{iCqL z#mds6qN19*_y7O^A^8LW0018VEC2ui02BZe000G?;3tk`X`X1B5)?(KB@00mJQCSN zE9B*0hM>X2$p{t>MWmN#dOXbs;)npedOjg>x~OhU6O8zQIdH3l0a%P7cOqTD;bAdt z9{7i*gQ;>J6LlpUY-9lzat#_A1ttt^9EFODjU@vQ92^px5)&Jr43#7UY!VHM8yXcA lp(dna6O$XO2?L@dmz|!U8w?Bswyp)k#Kpum$jK!k06V*Ud_@2N literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/table/images/table_cell_props.gif b/public/javascripts/tiny_mce/plugins/table/images/table_cell_props.gif new file mode 100755 index 0000000000000000000000000000000000000000..bee7ed652f83476471ca0c0cfa5f2b72c6f98fc8 GIT binary patch literal 189 zcwPa$07CyqNk%w1VH5xq0K*6XGD>2SrMS}4+=8g`!qMXL>f*A!(w4mb{r>)O6%hbCQiN7b literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/table/images/table_delete.gif b/public/javascripts/tiny_mce/plugins/table/images/table_delete.gif new file mode 100755 index 0000000000000000000000000000000000000000..2a00e6ad66aa907381ff742dfcb6aa2e2ec3df17 GIT binary patch literal 372 zcwTe&bhEHb6k!lyxXJ(m|NsC0^y%lMRiD=FywtS()2v-TmLL0b@8#d4r!Jkk_37m0 zM~gQcGWJTIwCYe$T-JmI8#W!fv~uABRt5$QCMID*=gj%{@86?GkAPM)PzDr# zvM@3*Xff!3I3PbUuuXKBTHv80)qi41(aD@XJ(Y{9AuV2Z^b%c^$j^>)S z^85Syjgq3Ovcf`IasU7TA^8LW000jFEC2ui02BZe000C~@X1N5y*TU5Yg=F;j03m~ z*9S7AQZ5E+6`;WiE*xJ4;S4OrVLD zq^HC5lAo_~pYs0x{r~^~A^8LW000jFEC2ui02BZe000D7@X1N5y*TU5>G|Nna879^ z3V9~RxRnWO7y-xJIHT+-78`=#Vo@mc9)Jo^FeDZl1O#9@r7(*PC}E43Bq@Wics$6M ZU5s;*CQxUf_d3_{csz*D~813(lGjTD@2z{n9^mxAJO7)Ys5OF}UnY`dU@qbmky T#N$E3kp`{PZ$%b~i~s;TfG0;) literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/table/images/table_insert_row_after.gif b/public/javascripts/tiny_mce/plugins/table/images/table_insert_row_after.gif new file mode 100755 index 0000000000000000000000000000000000000000..b9c14466138007454958671320914d9a7d8a6db5 GIT binary patch literal 163 zcwPac09^k^Nk%w1VH5xq0K*Od0s;b3hwZ}J{xV8pU2lbto3eVM^5XCQa(@5FN<(eWPqQV3Ig1XGua#QiUNM~QhRb*u41x>1^iLw6v{&bt_E>x1D!Tyq@xq`0#T6LwOvdL|b z(z4F}lDPhYn!-Y4ng9R*A^8LW000jFEC2ui02BZe000DY@X1N5y*TU5Y5HK87$oTl zLW8cziUMcq3atxINz(*;fcy>zVR(}yP=SSVxhOap#m7;QWHz6J=oGb%7 literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/table/images/table_row_props.gif b/public/javascripts/tiny_mce/plugins/table/images/table_row_props.gif new file mode 100755 index 0000000000000000000000000000000000000000..e5c7cc37aaded685d68a6f1d0f5f204415258489 GIT binary patch literal 187 zcwPa!07U;sNk%w1VH5xq0K*CZGD>2SrMS}5-GZj_!qMXH@&2N=(w4mbqOihJVuJnt z{^sQ3lB)8xz|uleasU7TA^8LW000jFEC2ui02BZe000DN@X1N5y*TU5EBnkKj-9KxjG%0%ik9LBwDPfF*DxWw(Ncc#J3` p0@_Nzrf3x2h<5?KWxL^Wx|%>X2mX2#XaIzThJ+o7ii;Hy06QxAQu6=+ literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/table/images/table_split_cells.gif b/public/javascripts/tiny_mce/plugins/table/images/table_split_cells.gif new file mode 100755 index 0000000000000000000000000000000000000000..8ccb1b5f89d35619c9fe7a81957305c93f3ed8fc GIT binary patch literal 210 zcwPb004@JVNk%w1VH5xq0K)FI0=7!2VKkqmrb#i?scsvdKbY znlMRZVtuQCnZ&Zr{r~^~A^8LW000jFEC2ui02BZe000Dk@X1N5y*TU5Y5HK893<%p zLW8c%iY{mB3dRgiNz(*8!x#pIfU#7qN5Q2I~2E2l>h($ literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/table/jscripts/cell.js b/public/javascripts/tiny_mce/plugins/table/jscripts/cell.js new file mode 100755 index 0000000..436eaad --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/jscripts/cell.js @@ -0,0 +1,249 @@ +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor') + + var inst = tinyMCE.selectedInstance; + var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th"); + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(tinyMCE.getAttrib(tdElm, "style")); + + // Get table cell data + var celltype = tdElm.nodeName.toLowerCase(); + var align = tinyMCE.getAttrib(tdElm, 'align'); + var valign = tinyMCE.getAttrib(tdElm, 'valign'); + var width = trimSize(getStyle(tdElm, 'width', 'width')); + var height = trimSize(getStyle(tdElm, 'height', 'height')); + var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor')); + var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor')); + var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tdElm, 'class'), false); + var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");; + var id = tinyMCE.getAttrib(tdElm, 'id'); + var lang = tinyMCE.getAttrib(tdElm, 'lang'); + var dir = tinyMCE.getAttrib(tdElm, 'dir'); + var scope = tinyMCE.getAttrib(tdElm, 'scope'); + + // Setup form + addClassesToList('class', 'table_cell_styles'); + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.backgroundimage.value = backgroundimage; + formObj.width.value = width; + formObj.height.value = height; + formObj.id.value = id; + formObj.lang.value = lang; + formObj.style.value = tinyMCE.serializeStyle(st); + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'valign', valign); + selectByValue(formObj, 'class', className); + selectByValue(formObj, 'celltype', celltype); + selectByValue(formObj, 'dir', dir); + selectByValue(formObj, 'scope', scope); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); +} + +function updateAction() { + tinyMCEPopup.restoreSelection(); + + var inst = tinyMCE.selectedInstance; + var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th"); + var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr"); + var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + var formObj = document.forms[0]; + + inst.execCommand('mceBeginUndoLevel'); + + switch (getSelectValue(formObj, 'action')) { + case "cell": + var celltype = getSelectValue(formObj, 'celltype'); + var scope = getSelectValue(formObj, 'scope'); + + if (tinyMCE.getParam("accessibility_warnings")) { + if (celltype == "th" && scope == "") + var answer = confirm(tinyMCE.getLang('lang_table_missing_scope', '', true)); + else + var answer = true; + + if (!answer) + return; + } + + updateCell(tdElm); + break; + + case "row": + var cell = trElm.firstChild; + + if (cell.nodeName != "TD" && cell.nodeName != "TH") + cell = nextCell(cell); + + do { + cell = updateCell(cell, true); + } while ((cell = nextCell(cell)) != null); + + break; + + case "all": + var rows = tableElm.getElementsByTagName("tr"); + + for (var i=0; i colLimit) { + alert(tinyMCE.getLang('lang_table_col_limit', '', true, {cols : colLimit})); + return false; + } else if (rowLimit && rows > rowLimit) { + alert(tinyMCE.getLang('lang_table_row_limit', '', true, {rows : rowLimit})); + return false; + } else if (cellLimit && cols * rows > cellLimit) { + alert(tinyMCE.getLang('lang_table_cell_limit', '', true, {cells : cellLimit})); + return false; + } + + // Update table + if (action == "update") { + inst.execCommand('mceBeginUndoLevel'); + + tinyMCE.setAttrib(elm, 'cellPadding', cellpadding, true); + tinyMCE.setAttrib(elm, 'cellSpacing', cellspacing, true); + tinyMCE.setAttrib(elm, 'border', border, true); + tinyMCE.setAttrib(elm, 'align', align); + tinyMCE.setAttrib(elm, 'class', className); + tinyMCE.setAttrib(elm, 'style', style); + tinyMCE.setAttrib(elm, 'id', id); + tinyMCE.setAttrib(elm, 'summary', summary); + tinyMCE.setAttrib(elm, 'dir', dir); + tinyMCE.setAttrib(elm, 'lang', lang); + + // Not inline styles + if (!tinyMCE.getParam("inline_styles")) + tinyMCE.setAttrib(elm, 'width', width, true); + + // Remove these since they are not valid XHTML + tinyMCE.setAttrib(elm, 'borderColor', ''); + tinyMCE.setAttrib(elm, 'bgColor', ''); + tinyMCE.setAttrib(elm, 'background', ''); + tinyMCE.setAttrib(elm, 'height', ''); + + if (background != '') + elm.style.backgroundImage = "url('" + background + "')"; + else + elm.style.backgroundImage = ''; + + if (tinyMCE.getParam("inline_styles")) + elm.style.borderWidth = border + "px"; + + if (tinyMCE.getParam("inline_styles")) { + if (width != '') + elm.style.width = getCSSSize(width); + } + + if (bordercolor != "") { + elm.style.borderColor = bordercolor; + elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle; + elm.style.borderWidth = border == "" ? "1px" : border; + } else + elm.style.borderColor = ''; + + elm.style.backgroundColor = bgcolor; + elm.style.height = getCSSSize(height); + + tinyMCE.handleVisualAid(tinyMCE.tableElm, false, inst.visualAid, inst); + + // Fix for stange MSIE align bug + tinyMCE.tableElm.outerHTML = tinyMCE.tableElm.outerHTML; + + tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst); + tinyMCE.triggerNodeChange(); + inst.execCommand('mceEndUndoLevel'); + + // Repaint if dimensions changed + if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight) + inst.repaint(); + + tinyMCEPopup.close(); + return true; + } + + // Create new table + html += '/g, '>'); + + return ' ' + attrib + '="' + value + '"'; +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + + var cols = 2, rows = 2, border = tinyMCE.getParam('table_default_border', '0'), cellpadding = tinyMCE.getParam('table_default_cellpadding', ''), cellspacing = tinyMCE.getParam('table_default_cellspacing', ''); + var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; + var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = ""; + var inst = tinyMCE.selectedInstance; + var formObj = document.forms[0]; + var elm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + + tinyMCE.tableElm = elm; + action = tinyMCE.getWindowArg('action'); + if (action == null) + action = tinyMCE.tableElm ? "update" : "insert"; + + if (tinyMCE.tableElm && action != "insert") { + var rowsAr = tinyMCE.tableElm.rows; + var cols = 0; + for (var i=0; i cols) + cols = rowsAr[i].cells.length; + + cols = cols; + rows = rowsAr.length; + + st = tinyMCE.parseStyle(tinyMCE.getAttrib(tinyMCE.tableElm, "style")); + border = trimSize(getStyle(elm, 'border', 'borderWidth')); + cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', ""); + cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', ""); + width = trimSize(getStyle(elm, 'width', 'width')); + height = trimSize(getStyle(elm, 'height', 'height')); + bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor')); + bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor')); + align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align); + className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false); + id = tinyMCE.getAttrib(tinyMCE.tableElm, 'id'); + summary = tinyMCE.getAttrib(tinyMCE.tableElm, 'summary'); + style = tinyMCE.serializeStyle(st); + dir = tinyMCE.getAttrib(tinyMCE.tableElm, 'dir'); + lang = tinyMCE.getAttrib(tinyMCE.tableElm, 'lang'); + background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + + orgTableWidth = width; + orgTableHeight = height; + + action = "update"; + } + + addClassesToList('class', "table_styles"); + + // Update form + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'class', className); + formObj.cols.value = cols; + formObj.rows.value = rows; + formObj.border.value = border; + formObj.cellpadding.value = cellpadding; + formObj.cellspacing.value = cellspacing; + formObj.width.value = width; + formObj.height.value = height; + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.id.value = id; + formObj.summary.value = summary; + formObj.style.value = style; + formObj.dir.value = dir; + formObj.lang.value = lang; + formObj.backgroundimage.value = background; + formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + // Disable some fields in update mode + if (action == "update") { + formObj.cols.disabled = true; + formObj.rows.disabled = true; + } +} + +function changedSize() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + var width = formObj.width.value; + if (width != "") + st['width'] = tinyMCE.getParam("inline_styles") ? getCSSSize(width) : ""; + else + st['width'] = ""; + + var height = formObj.height.value; + if (height != "") + st['height'] = getCSSSize(height); + else + st['height'] = ""; + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedBackgroundImage() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedBorder() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + // Update border width if the element has a color + if (formObj.border.value != "" && formObj.bordercolor.value != "") + st['border-width'] = formObj.border.value + "px"; + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedColor() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + st['background-color'] = formObj.bgcolor.value; + + if (formObj.bordercolor.value != "") { + st['border-color'] = formObj.bordercolor.value; + + // Add border-width if it's missing + if (!st['border-width']) + st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px"; + } + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedStyle() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + if (st['background-image']) + formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + else + formObj.backgroundimage.value = ''; + + if (st['width']) + formObj.width.value = trimSize(st['width']); + + if (st['height']) + formObj.height.value = trimSize(st['height']); + + if (st['background-color']) { + formObj.bgcolor.value = st['background-color']; + updateColor('bgcolor_pick','bgcolor'); + } + + if (st['border-color']) { + formObj.bordercolor.value = st['border-color']; + updateColor('bordercolor_pick','bordercolor'); + } +} diff --git a/public/javascripts/tiny_mce/plugins/table/langs/en.js b/public/javascripts/tiny_mce/plugins/table/langs/en.js new file mode 100755 index 0000000..108d6af --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/langs/en.js @@ -0,0 +1,78 @@ +// UK lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'General', +advanced_tab : 'Advanced', +general_props : 'General properties', +advanced_props : 'Advanced properties', +desc : 'Inserts a new table', +row_before_desc : 'Insert row before', +row_after_desc : 'Insert row after', +delete_row_desc : 'Delete row', +col_before_desc : 'Insert column before', +col_after_desc : 'Insert column after', +delete_col_desc : 'Remove column', +rowtype : 'Row in table part', +title : 'Insert/Modify table', +width : 'Width', +height : 'Height', +cols : 'Columns', +rows : 'Rows', +cellspacing : 'Cellspacing', +cellpadding : 'Cellpadding', +border : 'Border', +align : 'Alignment', +align_default : 'Default', +align_left : 'Left', +align_right : 'Right', +align_middle : 'Center', +row_title : 'Table row properties', +cell_title : 'Table cell properties', +cell_type : 'Cell type', +row_desc : 'Table row properties', +cell_desc : 'Table cell properties', +valign : 'Vertical alignment', +align_top : 'Top', +align_bottom : 'Bottom', +props_desc : 'Table properties', +bordercolor : 'Border color', +bgcolor : 'Background color', +merge_cells_title : 'Merge table cells', +split_cells_desc : 'Split table cells', +merge_cells_desc : 'Merge table cells', +cut_row_desc : 'Cut table row', +copy_row_desc : 'Copy table row', +paste_row_before_desc : 'Paste table row before', +paste_row_after_desc : 'Paste table row after', +id : 'Id', +style: 'Style', +langdir : 'Language direction', +langcode : 'Language code', +mime : 'Target MIME type', +ltr : 'Left to right', +rtl : 'Right to left', +bgimage : 'Background image', +summary : 'Summary', +td : "Data", +th : "Header", +cell_cell : 'Update current cell', +cell_row : 'Update all cells in row', +cell_all : 'Update all cells in table', +row_row : 'Update current row', +row_odd : 'Update odd rows in table', +row_even : 'Update even rows in table', +row_all : 'Update all rows in table', +thead : 'Table Head', +tbody : 'Table Body', +tfoot : 'Table Foot', +del : 'Delete table', +scope : 'Scope', +row : 'Row', +col : 'Col', +rowgroup : 'Row Group', +colgroup : 'Col Group', +col_limit : 'You\'ve exceeded the maximum number of columns of {$cols}.', +row_limit : 'You\'ve exceeded the maximum number of rows of {$rows}.', +cell_limit : 'You\'ve exceeded the maximum number of cells of {$cells}.', +missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.' +}); diff --git a/public/javascripts/tiny_mce/plugins/table/merge_cells.htm b/public/javascripts/tiny_mce/plugins/table/merge_cells.htm new file mode 100755 index 0000000..10896bf --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/merge_cells.htm @@ -0,0 +1,38 @@ + + + {$lang_table_merge_cells_title} + + + + + + + +
+
+ {$lang_table_merge_cells_title} + + + + + + + + + +
{$lang_table_cols}: +
{$lang_table_rows}:
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/table/readme.txt b/public/javascripts/tiny_mce/plugins/table/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/plugins/table/row.htm b/public/javascripts/tiny_mce/plugins/table/row.htm new file mode 100755 index 0000000..64f2afc --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/row.htm @@ -0,0 +1,159 @@ + + + {$lang_table_row_title} + + + + + + + + +
+ + +
+
+
+ {$lang_table_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+
+
+ +
+
+ {$lang_table_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/table/table.htm b/public/javascripts/tiny_mce/plugins/table/table.htm new file mode 100755 index 0000000..6c4078d --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/table/table.htm @@ -0,0 +1,156 @@ + + + {$lang_table_title} + + + + + + + + + +
+ + +
+
+
+ {$lang_table_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ {$lang_table_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/plugins/visualchars/editor_plugin.js b/public/javascripts/tiny_mce/plugins/visualchars/editor_plugin.js new file mode 100755 index 0000000..6056b9f --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/visualchars/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('visualchars');var TinyMCE_VisualCharsPlugin={getInfo:function(){return{longname:'Visual characters',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_visualchars.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){inst.visualChars={state:false}},getControlHTML:function(cn){switch(cn){case"visualchars":return tinyMCE.getButtonHTML(cn,'lang_visualchars_desc','{$pluginurl}/images/visualchars.gif','mceVisualChars',false)}return""},execCommand:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id);switch(command){case"mceVisualChars":this._toggleVisualChars(editor_id,inst);return true}return false},cleanup:function(type,content,inst){if(type=="insert_to_editor_dom"||type=="get_from_editor_dom"){inst.visualChars.state=true;this._toggleVisualChars(inst.editorId,inst)}return content},_toggleVisualChars:function(editor_id,inst){var nl,i,h,d=inst.getDoc(),b=inst.getBody(),nv,s=inst.selection,bo;inst.visualChars.state=!inst.visualChars.state;bo=s.getBookmark(true);tinyMCE.switchClass(editor_id+'_visualchars',inst.visualChars.state?'mceButtonSelected':'mceButtonNormal');if(inst.visualChars.state){nl=tinyMCE.selectNodes(b,function(n){return n.nodeType==3&&n.nodeValue&&n.nodeValue.indexOf('\u00a0')!=-1});for(i=0;i$1');nv=nv.replace(/\u00a0/g,'\u00b7');tinyMCE.setOuterHTML(nl[i],nv,d)}}else{nl=tinyMCE.selectNodes(b,function(n){return n.nodeType==1&&n.nodeName=='SPAN'&&n.className=='mceItemHiddenVisualChar'});for(i=0;i$1'); + nv = nv.replace(/\u00a0/g, '\u00b7'); + tinyMCE.setOuterHTML(nl[i], nv, d); + } + } else { + nl = tinyMCE.selectNodes(b, function(n) {return n.nodeType == 1 && n.nodeName == 'SPAN' && n.className == 'mceItemHiddenVisualChar';}); + + for (i=0; i69tt_pqET>MMXlZG|z`*eT|9=Kl zp!k!8k%57WK?lSEnZdwf9B|Te^;M1& literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/visualchars/langs/en.js b/public/javascripts/tiny_mce/plugins/visualchars/langs/en.js new file mode 100755 index 0000000..a82a4ee --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/visualchars/langs/en.js @@ -0,0 +1,5 @@ +// EN lang variables + +tinyMCE.addToLang('visualchars',{ +desc : 'Visual control characters on/off.' +}); diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/abbr.htm b/public/javascripts/tiny_mce/plugins/xhtmlxtras/abbr.htm new file mode 100755 index 0000000..30b0d1c --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/abbr.htm @@ -0,0 +1,148 @@ + + + {$lang_xhtmlxtras_title_abbr_element} + + + + + + + + + + +
+ + +
+
+
+ {$lang_xhtmlxtras_fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {$lang_xhtmlxtras_fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ + diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/acronym.htm b/public/javascripts/tiny_mce/plugins/xhtmlxtras/acronym.htm new file mode 100755 index 0000000..193760e --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/acronym.htm @@ -0,0 +1,148 @@ + + + {$lang_xhtmlxtras_title_acronym_element} + + + + + + + + + + +
+ + +
+
+
+ {$lang_xhtmlxtras_fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {$lang_xhtmlxtras_fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ + diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/cite.htm b/public/javascripts/tiny_mce/plugins/xhtmlxtras/cite.htm new file mode 100755 index 0000000..c72538c --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/cite.htm @@ -0,0 +1,148 @@ + + + {$lang_xhtmlxtras_title_cite_element} + + + + + + + + + + +
+ + +
+
+
+ {$lang_xhtmlxtras_fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {$lang_xhtmlxtras_fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ + diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/popup.css b/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/popup.css new file mode 100755 index 0000000..ecdc370 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/popup.css @@ -0,0 +1,46 @@ +a.mceButtonNormal img, a.mceButtonSelected img {border: 1px solid #F0F0EE !important;} +a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {border: 1px solid #0A246A !important; cursor: default; background-color: #B6BDD2;} + +img { + border: 0; +} + +input.field, select.field { + width: 200px; +} + +input.picker { + width: 179px; + margin-left: 5px; +} + +input.disabled { + border-color: #F2F2F2; +} + +img.picker { + vertical-align: text-bottom; + cursor: pointer; +} + +h1 { + padding: 0 0 5px 0; +} + +#remove { + font-weight: bold; + width: 90px; + height: 21px; + border: 0px; + background-image: url('../images/remove_button_bg.gif'); + cursor: pointer; + margin-left: 3px; +} + +.panel_wrapper div.current { + height: 160px; +} + +#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current { + height: 220px; +} diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css b/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css new file mode 100755 index 0000000..6838d90 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css @@ -0,0 +1,24 @@ +ins { + border-bottom: 1px solid green; + text-decoration: none; + color: green; +} + +del { + color: Red; + text-decoration: line-through; +} + +cite { + border-bottom: 1px dashed blue; +} + +acronym { + border-bottom: 1px dotted #CCC; + cursor: help; +} + +abbr, html\:abbr { + border-bottom: 1px dashed #CCC; + cursor: help; +} diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/del.htm b/public/javascripts/tiny_mce/plugins/xhtmlxtras/del.htm new file mode 100755 index 0000000..11a4d18 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/del.htm @@ -0,0 +1,169 @@ + + + {$lang_xhtmlxtras_title_del_element} + + + + + + + + + + +
+ + +
+
+
+ {$lang_xhtmlxtras_fieldset_general_tab} + + + + + + + + + +
: + + + + + +
{$lang_xhtmlxtras_insert_date}
+
:
+
+
+ {$lang_xhtmlxtras_fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {$lang_xhtmlxtras_fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ + + diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js new file mode 100755 index 0000000..464fe0b --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('xhtmlxtras');var TinyMCE_XHTMLXtrasPlugin={getInfo:function(){return{longname:'XHTML Xtras Plugin',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_xhtmlxtras.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/xhtmlxtras/css/xhtmlxtras.css")},getControlHTML:function(cn){switch(cn){case"cite":return tinyMCE.getButtonHTML(cn,'lang_xhtmlxtras_cite_desc','{$pluginurl}/images/cite.gif','mceCite',true);case"acronym":return tinyMCE.getButtonHTML(cn,'lang_xhtmlxtras_acronym_desc','{$pluginurl}/images/acronym.gif','mceAcronym',true);case"abbr":return tinyMCE.getButtonHTML(cn,'lang_xhtmlxtras_abbr_desc','{$pluginurl}/images/abbr.gif','mceAbbr',true);case"del":return tinyMCE.getButtonHTML(cn,'lang_xhtmlxtras_del_desc','{$pluginurl}/images/del.gif','mceDel',true);case"ins":return tinyMCE.getButtonHTML(cn,'lang_xhtmlxtras_ins_desc','{$pluginurl}/images/ins.gif','mceIns',true)}return""},execCommand:function(editor_id,element,command,user_interface,value){var template;switch(command){case"mceCite":if(!this._anySel(editor_id))return true;template=new Array();template['file']='../../plugins/xhtmlxtras/cite.htm';template['width']=350;template['height']=250;tinyMCE.openWindow(template,{editor_id:editor_id});return true;case"mceAcronym":if(!this._anySel(editor_id))return true;template=new Array();template['file']='../../plugins/xhtmlxtras/acronym.htm';template['width']=350;template['height']=250;tinyMCE.openWindow(template,{editor_id:editor_id});return true;case"mceAbbr":if(!this._anySel(editor_id))return true;template=new Array();template['file']='../../plugins/xhtmlxtras/abbr.htm';template['width']=350;template['height']=250;tinyMCE.openWindow(template,{editor_id:editor_id});return true;case"mceIns":if(!this._anySel(editor_id))return true;template=new Array();template['file']='../../plugins/xhtmlxtras/ins.htm';template['width']=350;template['height']=310;tinyMCE.openWindow(template,{editor_id:editor_id});return true;case"mceDel":if(!this._anySel(editor_id))return true;template=new Array();template['file']='../../plugins/xhtmlxtras/del.htm';template['width']=350;template['height']=310;tinyMCE.openWindow(template,{editor_id:editor_id});return true}return false},cleanup:function(type,content,inst){if(type=='insert_to_editor'&&tinyMCE.isIE&&!tinyMCE.isOpera){content=content.replace(/]+)>/gi,'');content=content.replace(/<\/abbr>/gi,'')}return content},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;if(!any_selection){tinyMCE.switchClass(editor_id+'_cite','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_acronym','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_abbr','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_del','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_ins','mceButtonDisabled')}else{tinyMCE.switchClass(editor_id+'_cite','mceButtonNormal');tinyMCE.switchClass(editor_id+'_acronym','mceButtonNormal');tinyMCE.switchClass(editor_id+'_abbr','mceButtonNormal');tinyMCE.switchClass(editor_id+'_del','mceButtonNormal');tinyMCE.switchClass(editor_id+'_ins','mceButtonNormal')}switch(node.nodeName){case"CITE":tinyMCE.switchClass(editor_id+'_cite','mceButtonSelected');return true;case"ACRONYM":tinyMCE.switchClass(editor_id+'_acronym','mceButtonSelected');return true;case"abbr":case"HTML:ABBR":case"ABBR":tinyMCE.switchClass(editor_id+'_abbr','mceButtonSelected');return true;case"DEL":tinyMCE.switchClass(editor_id+'_del','mceButtonSelected');return true;case"INS":tinyMCE.switchClass(editor_id+'_ins','mceButtonSelected');return true}return true},_anySel:function(editor_id){var inst=tinyMCE.getInstanceById(editor_id),t=inst.selection.getSelectedText(),pe;pe=tinyMCE.getParentElement(inst.getFocusElement(),'CITE,ACRONYM,ABBR,HTML:ABBR,DEL,INS');return pe||inst.getFocusElement().nodeName=="IMG"||(t&&t.length>0)}};tinyMCE.addPlugin("xhtmlxtras",TinyMCE_XHTMLXtrasPlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js new file mode 100755 index 0000000..7fce54b --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js @@ -0,0 +1,175 @@ + /** + * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ + * + * @author Moxiecode - based on work by Andrew Tetlaw + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('xhtmlxtras'); + +var TinyMCE_XHTMLXtrasPlugin = { + getInfo : function() { + return { + longname : 'XHTML Xtras Plugin', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_xhtmlxtras.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + initInstance : function(inst) { + tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/xhtmlxtras/css/xhtmlxtras.css"); + }, + + getControlHTML : function(cn) { + switch (cn) { + case "cite": + return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_cite_desc', '{$pluginurl}/images/cite.gif', 'mceCite', true); + + case "acronym": + return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_acronym_desc', '{$pluginurl}/images/acronym.gif', 'mceAcronym', true); + + case "abbr": + return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_abbr_desc', '{$pluginurl}/images/abbr.gif', 'mceAbbr', true); + + case "del": + return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_del_desc', '{$pluginurl}/images/del.gif', 'mceDel', true); + + case "ins": + return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_ins_desc', '{$pluginurl}/images/ins.gif', 'mceIns', true); + } + + return ""; + }, + + execCommand : function(editor_id, element, command, user_interface, value) { + var template; + + switch (command) { + case "mceCite": + if (!this._anySel(editor_id)) + return true; + + template = new Array(); + template['file'] = '../../plugins/xhtmlxtras/cite.htm'; + template['width'] = 350; + template['height'] = 250; + tinyMCE.openWindow(template, {editor_id : editor_id}); + return true; + + case "mceAcronym": + if (!this._anySel(editor_id)) + return true; + + template = new Array(); + template['file'] = '../../plugins/xhtmlxtras/acronym.htm'; + template['width'] = 350; + template['height'] = 250; + tinyMCE.openWindow(template, {editor_id : editor_id}); + return true; + + case "mceAbbr": + if (!this._anySel(editor_id)) + return true; + + template = new Array(); + template['file'] = '../../plugins/xhtmlxtras/abbr.htm'; + template['width'] = 350; + template['height'] = 250; + tinyMCE.openWindow(template, {editor_id : editor_id}); + return true; + + case "mceIns": + if (!this._anySel(editor_id)) + return true; + + template = new Array(); + template['file'] = '../../plugins/xhtmlxtras/ins.htm'; + template['width'] = 350; + template['height'] = 310; + tinyMCE.openWindow(template, {editor_id : editor_id}); + return true; + + case "mceDel": + if (!this._anySel(editor_id)) + return true; + + template = new Array(); + template['file'] = '../../plugins/xhtmlxtras/del.htm'; + template['width'] = 350; + template['height'] = 310; + tinyMCE.openWindow(template, {editor_id : editor_id}); + return true; + } + + return false; + }, + + cleanup : function(type, content, inst) { + if (type == 'insert_to_editor' && tinyMCE.isIE && !tinyMCE.isOpera) { + content = content.replace(/]+)>/gi, ''); + content = content.replace(/<\/abbr>/gi, ''); + } + + return content; + }, + + handleNodeChange : function(editor_id, node, undo_index,undo_levels, visual_aid, any_selection) { + if (node == null) + return; + + if (!any_selection) { + // Disable the buttons + tinyMCE.switchClass(editor_id + '_cite', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_acronym', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_abbr', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_del', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_ins', 'mceButtonDisabled'); + } else { + // A selection means the buttons should be active. + tinyMCE.switchClass(editor_id + '_cite', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_acronym', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_abbr', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_del', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_ins', 'mceButtonNormal'); + } + + switch (node.nodeName) { + case "CITE": + tinyMCE.switchClass(editor_id + '_cite', 'mceButtonSelected'); + return true; + + case "ACRONYM": + tinyMCE.switchClass(editor_id + '_acronym', 'mceButtonSelected'); + return true; + + case "abbr": // IE + case "HTML:ABBR": // FF + case "ABBR": + tinyMCE.switchClass(editor_id + '_abbr', 'mceButtonSelected'); + return true; + + case "DEL": + tinyMCE.switchClass(editor_id + '_del', 'mceButtonSelected'); + return true; + + case "INS": + tinyMCE.switchClass(editor_id + '_ins', 'mceButtonSelected'); + return true; + } + + return true; + }, + + _anySel : function(editor_id) { + var inst = tinyMCE.getInstanceById(editor_id), t = inst.selection.getSelectedText(), pe; + + pe = tinyMCE.getParentElement(inst.getFocusElement(), 'CITE,ACRONYM,ABBR,HTML:ABBR,DEL,INS'); + + return pe || inst.getFocusElement().nodeName == "IMG" || (t && t.length > 0); + } +}; + +tinyMCE.addPlugin("xhtmlxtras", TinyMCE_XHTMLXtrasPlugin); diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/images/abbr.gif b/public/javascripts/tiny_mce/plugins/xhtmlxtras/images/abbr.gif new file mode 100755 index 0000000000000000000000000000000000000000..d00d83017ffb2281edf45b1165ef4b961b2be99e GIT binary patch literal 144 zcwTe&bhEHb6k!ly*v!k|U%gi+V3KX>ay5@GMW>dqmSYB?)19){1~(isiJGJA+U{1c zDW?1E|Ns9Pz(DaQ3nK#qFM|$<12Thw#dgC<&((V^UZ36lKS86YOGIK)fd@m9;Mof- tzLz-8USjYK6y&<8x%Jl0x{Z-Hq)#3^1VhlZBCifrmi{!~vPXz+yh(r043r7O&6l{-2;x#LmhS+8Dy9?8A`kb3{~T ieM!*PtIv9F_*_cfDbc0SwQ<4+Z^fkB-? z2gCvSiGeNbz~llC9jX2kONvhBSj|7)(O6+B%FNo-)U@-!h1l*#K+sgxG=KdOCpWJH7oK&k{F0QClRxK; zUGY6FBdaM3*DEP01;r*^y7l_cpMSIV{WJ1PdiCl@R#_1PZlL&+g^__loIwY~0olpG zI_H6EUrOe@j8*eIZ|faCa3<5}?&aM&K5zBbh38z8mQ)dHIns9dqlddEvp~zqjtd=2 z6+5(4nU*v#O%-71TA?fuz@f#qDezH71dm{g^TG-To@_gNi{_VYXFskV_^UQ literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/images/del.gif b/public/javascripts/tiny_mce/plugins/xhtmlxtras/images/del.gif new file mode 100755 index 0000000000000000000000000000000000000000..ba494082d4b25fa73e1187f88c427d74db369577 GIT binary patch literal 222 zcwTe&bhEHb6k!lyI3mkn5HMlgwzEnOg`tJZW-i$`W8u!MmhCRd3r(XY1r%&hvdUVs z<aiyLdox@}$ATHGEp3PuDox-^Icas*9hOfg=xgSG3Z W<_84=E_6{9I25SH}zF5=% literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/images/ins.gif b/public/javascripts/tiny_mce/plugins/xhtmlxtras/images/ins.gif new file mode 100755 index 0000000000000000000000000000000000000000..277a364b26545defce337729f806cb0b154b4ee9 GIT binary patch literal 231 zcwPbL02u#ANk%w1VH5xq0K^{vB0zC9T9PnOkX3P}nWVlVI%=-A&1!_VL}Q^)aImbj z$}&oUNM@Xvp}A0Fk)El^lAXImU6hKPzLcWFoTkEKd8wzd%B8c>uei^Bjjcvqb#REl zqpZb1SfBua0RR90A^8LW0018VEC2ui02BZe000GK;3tk`X`X1RuI&08ZMh{^EMiH5 z*xzv=0*MV_U1{y2qvw;L*#U@EFDIK5m*#BtIB`?flw9zYswHXkSYa0$}(7J hMwvLEpg0*Q1Oy`r1Pz9LBp!;3jE#yskdZ1O06TIDUCICe literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/images/remove_button_bg.gif b/public/javascripts/tiny_mce/plugins/xhtmlxtras/images/remove_button_bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..5a069a8ce0da45f32363fb590f02e9eb8dcd3da0 GIT binary patch literal 433 zcwTe&bhEHbjA9UFIKsg2|NsAg|Ni~`3nG9N82|kP0>6KQ@b6#0e*FZ2Utsw22MB!s z4#Yt6`}c3(zJ31u`Q5vBuV24@`t<382M?}XxpL;rnVBOPrKVYqt@TZ z`P?L!xGJhEVvX+XcCml&P)#O8q>u=ggfqf5E~W4q?J~2?cKNk zz`;X@j~qRA{NSqH(wt|{vR}A(>GGAU*Dmb4e(UyC{!?-?GOTy5vORnL;^nK?&n`ZH z_vYi(he{7$vi|t_>-V3(|Nj5D!YkpiVZp&>wwH~M1r{tk+%BN(HOFJ)qNCk{qD3!& z9zWJD>)a*dY4qgyBn@A^pgS6in2%2}NIo^kbMms&)AWj8-8s2=`T6+{&0MTq#Val@ T_L$6;dvMFj%gg + + {$lang_xhtmlxtras_title_ins_element} + + + + + + + + + + +
+ + +
+
+
+ {$lang_xhtmlxtras_fieldset_general_tab} + + + + + + + + + +
: + + + + + +
{$lang_xhtmlxtras_insert_date}
+
:
+
+
+ {$lang_xhtmlxtras_fieldset_attrib_tab} + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
: + +
:
: + +
: + +
+
+
+
+
+ {$lang_xhtmlxtras_fieldset_events_tab} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
:
:
:
:
:
:
:
:
:
:
:
:
+
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+ + + diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/abbr.js b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/abbr.js new file mode 100755 index 0000000..90e349e --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/abbr.js @@ -0,0 +1,29 @@ + /** + * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ + * + * @author Moxiecode - based on work by Andrew Tetlaw + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +function preinit() { + // Initialize + tinyMCE.setWindowArg('mce_windowresize', false); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + SXE.initElementDialog('abbr'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertAbbr() { + SXE.insertElement(tinyMCE.isIE && !tinyMCE.isOpera ? 'html:ABBR' : 'abbr'); + tinyMCEPopup.close(); +} + +function removeAbbr() { + SXE.removeElement('abbr'); + tinyMCEPopup.close(); +} \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/acronym.js b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/acronym.js new file mode 100755 index 0000000..82d8e39 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/acronym.js @@ -0,0 +1,29 @@ + /** + * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ + * + * @author Moxiecode - based on work by Andrew Tetlaw + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +function preinit() { + // Initialize + tinyMCE.setWindowArg('mce_windowresize', false); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + SXE.initElementDialog('acronym'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertAcronym() { + SXE.insertElement('acronym'); + tinyMCEPopup.close(); +} + +function removeAcronym() { + SXE.removeElement('acronym'); + tinyMCEPopup.close(); +} \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/cite.js b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/cite.js new file mode 100755 index 0000000..33bc2c3 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/cite.js @@ -0,0 +1,29 @@ + /** + * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ + * + * @author Moxiecode - based on work by Andrew Tetlaw + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +function preinit() { + // Initialize + tinyMCE.setWindowArg('mce_windowresize', false); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + SXE.initElementDialog('cite'); + if (SXE.currentAction == "update") { + SXE.showRemoveButton(); + } +} + +function insertCite() { + SXE.insertElement('cite'); + tinyMCEPopup.close(); +} + +function removeCite() { + SXE.removeElement('cite'); + tinyMCEPopup.close(); +} \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/del.js b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/del.js new file mode 100755 index 0000000..58aa3af --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/del.js @@ -0,0 +1,54 @@ + /** + * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ + * + * @author Moxiecode - based on work by Andrew Tetlaw + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +function preinit() { + // Initialize + tinyMCE.setWindowArg('mce_windowresize', false); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + SXE.initElementDialog('del'); + if (SXE.currentAction == "update") { + setFormValue('datetime', tinyMCE.getAttrib(SXE.updateElement, 'datetime')); + setFormValue('cite', tinyMCE.getAttrib(SXE.updateElement, 'cite')); + SXE.showRemoveButton(); + } +} + +function setElementAttribs(elm) { + setAllCommonAttribs(elm); + setAttrib(elm, 'datetime'); + setAttrib(elm, 'cite'); +} + +function insertDel() { + var elm = tinyMCE.getParentElement(SXE.focusElement, 'del'); + + tinyMCEPopup.execCommand('mceBeginUndoLevel'); + if (elm == null) { + var s = SXE.inst.selection.getSelectedHTML(); + if(s.length > 0) { + tinyMCEPopup.execCommand('mceInsertContent', false, '' + s + ''); + var elementArray = tinyMCE.getElementsByAttributeValue(SXE.inst.getBody(), 'del', 'id', '#sxe_temp_del#'); + for (var i=0; i 0) { + tagName = element_name; + + if (tinyMCE.isIE && !tinyMCE.isOpera && element_name.indexOf('html:') == 0) + element_name = element_name.substring(5).toLowerCase(); + + h = '<' + tagName + ' id="#sxe_temp_' + element_name + '#">' + s + ''; + + tinyMCEPopup.execCommand('mceInsertContent', false, h); + + var elementArray = tinyMCE.getElementsByAttributeValue(SXE.inst.getBody(), element_name, 'id', '#sxe_temp_' + element_name + '#'); + for (var i=0; i -1) ? true : false; +} + +SXE.removeClass = function(elm,cl) { + if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) { + return true; + } + var classNames = elm.className.split(" "); + var newClassNames = ""; + for (var x = 0, cnl = classNames.length; x < cnl; x++) { + if (classNames[x] != cl) { + newClassNames += (classNames[x] + " "); + } + } + elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end +} + +SXE.addClass = function(elm,cl) { + if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl; + return true; +} \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/ins.js b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/ins.js new file mode 100755 index 0000000..97a8695 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/xhtmlxtras/jscripts/ins.js @@ -0,0 +1,53 @@ + /** + * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ + * + * @author Moxiecode - based on work by Andrew Tetlaw + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +function preinit() { + // Initialize + tinyMCE.setWindowArg('mce_windowresize', false); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + SXE.initElementDialog('ins'); + if (SXE.currentAction == "update") { + setFormValue('datetime', tinyMCE.getAttrib(SXE.updateElement, 'datetime')); + setFormValue('cite', tinyMCE.getAttrib(SXE.updateElement, 'cite')); + SXE.showRemoveButton(); + } +} + +function setElementAttribs(elm) { + setAllCommonAttribs(elm); + setAttrib(elm, 'datetime'); + setAttrib(elm, 'cite'); +} + +function insertIns() { + var elm = tinyMCE.getParentElement(SXE.focusElement, 'ins'); + tinyMCEPopup.execCommand('mceBeginUndoLevel'); + if (elm == null) { + var s = SXE.inst.selection.getSelectedHTML(); + if(s.length > 0) { + tinyMCEPopup.execCommand('mceInsertContent', false, '' + s + ''); + var elementArray = tinyMCE.getElementsByAttributeValue(SXE.inst.getBody(), 'ins', 'id', '#sxe_temp_ins#'); + for (var i=0; i'+''+''+''+''+''}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceZoom":tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom=value;tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom=value;return true}return false}};tinyMCE.addPlugin("zoom",TinyMCE_ZoomPlugin); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/plugins/zoom/editor_plugin_src.js b/public/javascripts/tiny_mce/plugins/zoom/editor_plugin_src.js new file mode 100755 index 0000000..8cc6ff0 --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/zoom/editor_plugin_src.js @@ -0,0 +1,56 @@ +/** + * $Id: editor_plugin_src.js 126 2006-10-22 16:19:55Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +var TinyMCE_ZoomPlugin = { + getInfo : function() { + return { + longname : 'Zoom', + author : 'Moxiecode Systems AB', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_zoom.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; + }, + + /** + * Returns the HTML contents of the zoom control. + */ + getControlHTML : function(control_name) { + if (!tinyMCE.isMSIE || tinyMCE.isMSIE5_0 || tinyMCE.isOpera) + return ""; + + switch (control_name) { + case "zoom": + return ''; + } + + return ""; + }, + + /** + * Executes the mceZoom command. + */ + execCommand : function(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceZoom": + tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom = value; + tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom = value; + return true; + } + + // Pass to next handler in chain + return false; + } +}; + +tinyMCE.addPlugin("zoom", TinyMCE_ZoomPlugin); diff --git a/public/javascripts/tiny_mce/plugins/zoom/readme.txt b/public/javascripts/tiny_mce/plugins/zoom/readme.txt new file mode 100755 index 0000000..4fdb78a --- /dev/null +++ b/public/javascripts/tiny_mce/plugins/zoom/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/public/javascripts/tiny_mce/themes/advanced/about.htm b/public/javascripts/tiny_mce/themes/advanced/about.htm new file mode 100755 index 0000000..d15ff3a --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/about.htm @@ -0,0 +1,52 @@ + + + {$lang_about_title} + + + + + + + + +
+
+

{$lang_about_title}

+

Version: {$tinymce_version} ({$tinymce_releasedate})

+

TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under LGPL + by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.

+

Copyright © 2003-2006, Moxiecode Systems AB, All rights reserved.

+

For more information about this software visit the TinyMCE website.

+ +
+
+ +
+
+

{$lang_loaded_plugins}

+ +
+
+ +

 

+
+
+ +
+
+
+
+ +
+
+ +
+
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/anchor.htm b/public/javascripts/tiny_mce/themes/advanced/anchor.htm new file mode 100755 index 0000000..53d7969 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/anchor.htm @@ -0,0 +1,33 @@ + + + {$lang_insert_anchor_title} + + + + + +
+ + + + + + + + + +
{$lang_insert_anchor_title}
{$lang_insert_anchor_name}:
+ +
+
+ +
+ +
+ +
+
+ +
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/charmap.htm b/public/javascripts/tiny_mce/themes/advanced/charmap.htm new file mode 100755 index 0000000..9aed1d4 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/charmap.htm @@ -0,0 +1,53 @@ + + + {$lang_theme_charmap_title} + + + + + + + + + + + + + + + + + +
{$lang_theme_charmap_title}
+ + + + + + + + + +
 
 
+
+ + + + + + + + + + + + + + + + +
HTML-Code
 
 
NUM-Code
 
+
+ + + diff --git a/public/javascripts/tiny_mce/themes/advanced/color_picker.htm b/public/javascripts/tiny_mce/themes/advanced/color_picker.htm new file mode 100755 index 0000000..3f5a198 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/color_picker.htm @@ -0,0 +1,13 @@ + + + {$lang_theme_colorpicker_title} + + + + + +
+ +
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/css/editor_content.css b/public/javascripts/tiny_mce/themes/advanced/css/editor_content.css new file mode 100755 index 0000000..182e791 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/css/editor_content.css @@ -0,0 +1,58 @@ +/* This file contains the CSS data for the editable area(iframe) of TinyMCE */ +/* You can extend this CSS by adding your own CSS file with the the content_css option */ + +body, td, pre { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +body { + background-color: #FFFFFF; +} + +.mceVisualAid { + border: 1px dashed #BBBBBB !important; +} + +div.mceVisualAid { + background-image:url('../images/spacer.gif'); + visibility: visible !important; +} + +.mceItemAnchor { + width: 12px; + line-height: 6px; + overflow: hidden; + padding-left: 12px; + background-image: url('../images/anchor_symbol.gif'); + background-position: bottom; + background-repeat: no-repeat; +} + +/* Important is needed in Gecko browsers inorder to style links */ +/* +a { + color: green !important; +} +*/ + +/* Style selection range colors in Gecko browsers */ +/* +::-moz-selection { + background-color: red; + color: green; +} +*/ + +/* MSIE specific */ + +* html body { + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} diff --git a/public/javascripts/tiny_mce/themes/advanced/css/editor_popup.css b/public/javascripts/tiny_mce/themes/advanced/css/editor_popup.css new file mode 100755 index 0000000..f8d3550 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/css/editor_popup.css @@ -0,0 +1,331 @@ +/* This file contains the CSS data for all popups in TinyMCE */ + +body { + background-color: #F0F0EE; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; + margin: 8px; +} + +td { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; +} + +input { + background: #FFFFFF; + border: 1px solid #cccccc; +} + +td, input, select, textarea { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +input, select, textarea { + border: 1px solid #808080; +} + +.input_noborder { + border: 0; +} + +#insert, .updateButton { + font-weight: bold; + width: 90px; + height: 21px; + border: 0; + background-image: url('../images/insert_button_bg.gif'); + cursor: pointer; +} + +#cancel { + font-weight: bold; + width: 90px; + height: 21px; + border: 0; + background-image: url('../images/cancel_button_bg.gif'); + cursor: pointer; +} + +/* Mozilla only style */ +html>body #insert, html>body #cancel { + padding-bottom: 2px; +} + +.title { + font-size: 12px; + font-weight: bold; + color: #2B6FB6; +} + +table.charmap { + border-style: solid; + border-width: 1px; + border-color: #AAAAAA; +} + +td.charmap, td.charmapOver { + color: #000000; + border-color: #AAAAAA; + border-style: solid; + border-width: 1px; + text-align: center; + font-size: 12px; +} + +td.charmapOver { + background-color: #CCCCCC; + cursor: default; +} + +a.charmap { + color: #000000; + text-decoration: none +} + +.wordWrapCode { + vertical-align: middle; + border: 1px none #000000; + background-color: transparent; +} + +input.radio { + border: 1px none #000000; + background-color: transparent; + vertical-align: middle; +} + +input.checkbox { + border: 1px none #000000; + background-color: transparent; + vertical-align: middle; +} + +.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected { + margin-left: 1px; +} + +.mceButtonNormal { + border-top: 1px solid; + border-left: 1px solid; + border-bottom: 1px solid; + border-right: 1px solid; + border-color: #F0F0EE; + cursor: default; +} + +.mceButtonOver { + border: 1px solid #0A246A; + cursor: default; + background-color: #B6BDD2; +} + +.mceButtonDown { + cursor: default; + border: 1px solid #0A246A; + background-color: #8592B5; +} + +.mceButtonDisabled { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; + border-top: 1px solid; + border-left: 1px solid; + border-bottom: 1px solid; + border-right: 1px solid; + border-color: #F0F0EE; + cursor: default; +} + +.mceActionPanel { + margin-top: 5px; +} + +/* Tabs classes */ + +.tabs { + float: left; + width: 100%; + line-height: normal; + background-image: url("../images/xp/tabs_bg.gif"); +} + +.tabs ul { + margin: 0; + padding: 0 0 0; + list-style: none; +} + +.tabs li { + float: left; + background: url("../images/xp/tab_bg.gif") no-repeat left top; + margin: 0; + margin-left: 0; + margin-right: 2px; + padding: 0 0 0 10px; + line-height: 18px; +} + +.tabs li.current { + background: url("../images/xp/tab_sel_bg.gif") no-repeat left top; + margin-right: 2px; +} + +.tabs span { + float: left; + display: block; + background: url("../images/xp/tab_end.gif") no-repeat right top; + padding: 0px 10px 0 0; +} + +.tabs .current span { + background: url("../images/xp/tab_sel_end.gif") no-repeat right top; +} + +.tabs a { + text-decoration: none; + font-family: Verdana, Arial; + font-size: 10px; +} + +.tabs a:link, .tabs a:visited, .tabs a:hover { + color: black; +} + +.tabs a:hover { +} + +.tabs .current { +} + +.tabs .current a, .tabs .current a:link, .tabs .current a:visited { +} + +.panel_wrapper div.panel { + display: none; +} + +.panel_wrapper div.current { + display: block; + width: 100%; + height: 300px; + overflow: visible; /* Should be auto but that breaks Safari */ +} + +.panel_wrapper { + border: 1px solid #919B9C; + border-top: 0px; + padding: 10px; + padding-top: 5px; + clear: both; + background-color: white; +} + +fieldset { + border: 1px solid #919B9C; + font-family: Verdana, Arial; + font-size: 10px; + padding: 0; + margin: 0; + padding: 4px; +} + +legend { + color: #2B6FB6; + font-weight: bold; +} + +.properties { + width: 100%; +} + +.properties .column1 { +} + +.properties .column2 { + text-align: left; +} + +a:link, a:visited { + color: black; +} + +a:hover { + color: #2B6FB6; +} + +#plugintable thead { + font-weight: bold; + background-color: #DDDDDD; +} + +#plugintable, #about #plugintable td { + border: 1px solid #919B9C; +} + +#plugintable { + width: 99%; + margin-top: 10px; +} + +#pluginscontainer { + height: 290px; + overflow: auto; +} + +/* MSIE Specific styles */ + +* html .panel_wrapper { + width: 100%; +} + +.column { + float: left; +} + +h1, h2, h3, h4 { + color: #2B6FB6; + margin: 0; + padding: 0; + padding-top: 5px; +} + +h3 { + font-size: 14px; +} + +#link .panel_wrapper, #link div.current { + height: 125px; +} + +#image .panel_wrapper, #image div.current { + height: 190px; +} + +label.msg { display: none; } +label.invalid { color: #EE0000; display: inline; } +input.invalid { border: 1px solid #EE0000; } + +/* Disables the advanced tab in the table plugin. */ +/* +#table #advanced_tab { + display: none; +} +*/ + +/* Disables the border input field and label in the table plugin. */ +/* +#table #border, #table #borderlabel { + display: none; +} +*/ diff --git a/public/javascripts/tiny_mce/themes/advanced/css/editor_ui.css b/public/javascripts/tiny_mce/themes/advanced/css/editor_ui.css new file mode 100755 index 0000000..e70405d --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/css/editor_ui.css @@ -0,0 +1,97 @@ +/* This file contains the CSS data for the editor UI of TinyMCE instances */ + +.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover {border: 0; margin: 0; padding: 0; background: transparent;} +.mceSeparatorLine {border: 0; padding: 0; margin-left: 4px; margin-right: 2px;} +.mceSelectList {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 7pt !important; font-weight: normal; margin-top: 3px; padding: 0; display: inline; vertical-align: top; background-color: #F0F0EE;} +.mceLabel, .mceLabelDisabled {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt;} +.mceLabel {color: #000000;} +.mceLabelDisabled {cursor: text; color: #999999;} +.mceEditor {background: #F0F0EE; border: 1px solid #cccccc; padding: 0; margin: 0;} +.mceEditorArea { font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; background: #FFFFFF; padding: 0; margin: 0; } +.mceToolbarTop, .mceToolbarBottom {background: #F0F0EE; line-height: 1px; font-size: 1px;} +.mceToolbarTop {border-bottom: 1px solid #cccccc; padding-bottom: 1px;} +.mceToolbarBottom {border-top: 1px solid #cccccc;} +.mceToolbarContainer {position: relative; left: 0; top: 0; display: block;} +.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar {height: 20px;} +.mceStatusbarTop .mceStatusbarPathText, .mceStatusbarBottom .mceStatusbarPathText, .mceStatusbar .mceStatusbarPathText {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; padding: 2px; line-height: 16px; overflow: visible;} +.mceStatusbarTop {border-bottom: 1px solid #cccccc;} +.mceStatusbarBottom {border-top: 1px solid #cccccc;} +.mceStatusbar {border-bottom: 1px solid #cccccc;} +.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {text-decoration: none; font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; color: #000000;} +.mcePathItem:hover {text-decoration: underline;} +.mceStatusbarPathText {float: left;} +.mceStatusbarResize {float: right; background-image: url('../images/statusbar_resize.gif'); background-repeat: no-repeat; width: 11px; height: 20px; cursor: se-resize;} +.mceResizeBox {width: 10px; height: 10px; display: none; border: 1px dotted gray; margin: 0; padding: 0;} +.mceEditorIframe {border: 0;} + +/* Button CSS rules */ + +a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img {width: 20px; height: 20px; cursor: default; margin-top: 1px; margin-left: 1px;} +a.mceButtonDisabled img {border: 0 !important;} +a.mceButtonNormal img, a.mceButtonSelected img {border: 1px solid #F0F0EE !important;} +a.mceButtonSelected img {border: 1px solid #6779AA !important; background-color: #D4D5D8;} +a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {border: 1px solid #0A246A !important; cursor: default; background-color: #B6BDD2;} +a.mceButtonDisabled img {-moz-opacity:0.3; opacity: 0.3; border: 1px solid #F0F0EE !important; cursor: default;} +a.mceTiledButton img {background-image: url('../images/buttons.gif'); background-repeat: no-repeat;} + +/* Menu button CSS rules */ + +span.mceMenuButton img, span.mceMenuButtonSelected img {border: 1px solid #F0F0EE; margin-left: 1px;} +span.mceMenuButtonSelected img {border: 1px solid #6779AA; background-color: #B6BDD2;} +span.mceMenuButtonSelected img.mceMenuButton {border: 1px solid #F0F0EE; background-color: transparent;} +span.mceMenuButton img.mceMenuButton, span.mceMenuButtonSelected img.mceMenuButton {border-left: 0; margin-left: 0;} +span.mceMenuButton:hover img, span.mceMenuButtonSelected:hover img {border: 1px solid #0A246A; background-color: #B6BDD2;} +span.mceMenuButton:hover img.mceMenuButton, span.mceMenuButtonSelected:hover img.mceMenuButton {border-left: 0;} +span.mceMenuButtonFocus img {border: 1px solid gray; border-right: 0; margin-left: 1px; background-color: #F5F4F2;} +span.mceMenuButtonFocus img.mceMenuButton {border: 1px solid gray; border-left: 1px solid #F5F4F2; margin-left: 0;} +span.mceMenuHover img {border: 1px solid #0A246A; background-color: #B6BDD2;} +span.mceMenuButtonSelected.mceMenuHover img.mceMenuButton {border: 1px solid #0A246A; background-color: #B6BDD2; border-left: 0;} + +/* Menu */ + +.mceMenu {position: absolute; left: 0; top: 0; display: none; z-index: 100; background-color: white; border: 1px solid gray; font-weight: normal;} +.mceMenu a, .mceMenuTitle, .mceMenuDisabled {display: block; width: 100%; text-decoration: none; background-color: white; font-family: Tahoma, Verdana, Arial, Helvetica; font-size: 11px; line-height: 20px; color: black;} +.mceMenu a:hover {background-color: #B6BDD2; color: black; text-decoration: none !important;} +.mceMenu span {padding-left: 10px; padding-right: 10px; display: block; line-height: 20px;} +.mceMenuSeparator {border-bottom: 1px solid gray; background-color: gray; height: 1px;} +.mceMenuTitle span {padding-left: 5px;} +.mceMenuTitle {background-color: #DDDDDD; font-weight: bold;} +.mceMenuDisabled {color: gray;} +span.mceMenuSelectedItem {background-image: url('../images/menu_check.gif'); background-repeat: no-repeat; background-position: 5px 8px; padding-left: 20px;} +span.mceMenuCheckItem {padding-left: 20px;} +span.mceMenuLine {display: block; position: absolute; left: 0; top: -1px; background-color: #F5F4F2; width: 30px; height: 1px; overflow: hidden; padding-left: 0; padding-right: 0;} +.mceColors table, .mceColors td {margin: 0; padding: 2px;} +a.mceMoreColors {width: 130px; margin: 0; padding: 0; margin-left: 3px; margin-bottom: 3px; text-align: center; border: 1px solid white;} +.mceColorPreview {position: absolute; left: 0; top: 0; margin-left: 3px; margin-top: 15px; width: 16px; height: 4px; background-color: red;} +a.mceMoreColors:hover {border: 1px solid #0A246A;} +.mceColors td a {width: 9px; height: 9px; overflow: hidden; border: 1px solid #808080;} + +/* MSIE 6 specific rules */ + +* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;} +* html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;} +* html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;} +* html a.mceButtonNormal, * html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;} +* html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;} +* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;} +* html .mceSelectList {margin-top: 2px;} +* html span.mceMenuButton, * html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;} +* html span.mceMenuButton img, * html span.mceMenuButtonSelected img, * html span.mceMenuButtonFocus img {position: relative; top: 1px;} +* html a.mceMoreColors {width: 132px;} +* html .mceColors td a {width: 10px; height: 10px;} +* html .mceColorPreview {margin-left: 2px; margin-top: 14px;} + +/* MSIE 7 specific rules */ + +*:first-child+html a.mceButtonNormal img, *:first-child+html a.mceButtonSelected img, *:first-child+html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;} +*:first-child+html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;} +*:first-child+html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;} +*:first-child+html a.mceButtonNormal, *:first-child+html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;} +*:first-child+html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;} +*:first-child+html a.mceButtonNormal:hover, *:first-child+html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;} +*:first-child+html .mceSelectList {margin-top: 2px;} +*:first-child+html span.mceMenuButton, *:first-child+html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;} +*:first-child+html span.mceMenuButton img, *:first-child+html span.mceMenuButtonSelected img, *:first-child+html span.mceMenuButtonFocus img {position: relative; top: 1px;} +*:first-child+html a.mceMoreColors {width: 132px;} +*:first-child+html .mceColors td a {width: 10px; height: 10px;} +*:first-child+html .mceColorPreview {margin: 0; padding-left: 4px; margin-top: 14px; width: 14px;} diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/about.htm b/public/javascripts/tiny_mce/themes/advanced/docs/en/about.htm new file mode 100755 index 0000000..a6957a6 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/docs/en/about.htm @@ -0,0 +1,31 @@ + + +About TinyMCE + + + + + + + + + + + +
+
+TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla +that enables you to edit HTML contents in a more user friendly way. It has common +features that are found in most word processors and should not be difficult to +use.
+
+
+ + + + + + +
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/common_buttons.htm b/public/javascripts/tiny_mce/themes/advanced/docs/en/common_buttons.htm new file mode 100755 index 0000000..518b285 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/docs/en/common_buttons.htm @@ -0,0 +1,162 @@ + + +Common buttons + + + + + + + + + + + +
+
+Below is a short description about each button. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bold text iconBold text style (Ctrl+B).
Italic text iconItalic text style (Ctrl+I).
Underline text icon.Underline text style (Ctrl+U).
Strikethrough text icon.Strikethrough text style.
Align left icon.Align left.
Align center icon.Align center.
Align right icon.Align right.
Align full icon.Align full.
Unordered list/bullet list icon.Unordered list/bullet list.
Ordered list/numbered list icon.Ordered list/numbered list
Outdent/decrease indentation icon.Outdent/decrease indentation.
Indent/increase indentation icon.Indent/increase indentation.
Undo the last operation.Undo the last operation (Ctrl+Z).
Redo the last operation icon.Redo the last operation (Ctrl+Y).
Insert a new link icon.Insert a new link, read more about this function in the Insert + link section.
Unlinks the current selection icon.Unlinks the current selection/removes all selected links.
Insert a new anchor icon.Insert a new anchor, read more about this function in the Insert anchor section.
Insert a new image icon.Insert a new image, read more about this function in the Insert + image section.
Cleanup code icon.Cleanup code/Removes unwanted formating. This function is useful when + you copy contents from for example a office product.
Show help icon.Shows this help window.
Source code editor icon.Opens HTML source code editor.
Insert table icon.Inserts a new table at the current location.
Adds a row above icon.Adds a row above the current one.
Adds a row under icon.Adds a row under the current one.
Remove row icon.Removes the row.
Add column before icon.Adds a column before the current one.
Add column after icon.Adds a column after the current one.
Remove column icon.Removes the current column.
Insert horizontal ruler icon.Inserts a new horizontal ruler
Remove formatting icon.Removes formatting from the selection.
Subscript icon.Makes the selection to be subscript.
Superscript icon.Makes the selection to be superscripted.
+
+
+ + + + + + + + diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm b/public/javascripts/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm new file mode 100755 index 0000000..f4070a3 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm @@ -0,0 +1,45 @@ + + +Insert table button + + + + + + + + + + + +
+

TinyMCE can create HTML content that will be accessible to all users, including those with disabilities using assistive technologies, as well as those using text-based browsers, or those browsing the Web with images turned off.

+ +

Things you can do to make your content accessible:

+
    +
  1. Include an Image Description: Blind users, or others who are unable to view images, will rely on the Image Description (or Alt text) to take the place of the image. If an image contains no meaning, such as a decoration or a spacer image, leave the Image Description empty. TinyMCE will then insert an empty Alt text attribute that will force assistive technologies to ignore the image.

  2. + +
  3. Add Scope to data table header cells: In the table cell editor dialog window, choose a Scope when creating Header cells so the column or row label in that cell becomes explicitely associated with its data cells. Table cell headers will then be announced with each data cell, making it easier for blind users using a screen reader to understand what the content of each cell represents.

  4. + +
  5. Structure content with properly nested headings: In the format selection menu choose Heading 1 to Heading 6 to represent headings in your content, rather than using other font formating options. Blind users using a screen reader can then extract the headings from the page to generate a summary of the content it contains, and use those headings to navigate quickly to subsections within the page.

  6. + +
  7. Include alternate content: Create an alternate page for non-HTML content such as Flash, Java applets, or embedded movies. This might be a static image, with a description of the image, and a description of the content that would have appeared in its place. An alternate HTML page could also be created, and a link to it included next to the non-HTML object. This will ensure that the content will be accessible to users of assistive technologies that can not view or play the content, and ensure the content will be available to those who do not have the appropriate plugin or helper application installed.

  8. + +
  9. Check accessbility: When the AChecker plugin is installed with TinyMCE, click on the Check Accessibility button to generate a report of potential accessibility problems.

  10. + +
+ +

See the AChecker Web Site for further details about creating content that will be accessible to all users.
+

+ +
+ + + + + + + +
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif b/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif new file mode 100755 index 0000000000000000000000000000000000000000..5b5f528dd57cae8e062919a66b0ff7fcf8f3bc42 GIT binary patch literal 5189 zcwPZT6uRq2Nk%w1VM+mu0QUd@H&l@lEO0qilOsNVFindaHh4i^nHDj05GrpUI(!r_ za}OzQrpoXNBx(yKYi5SIC`5!jS(O+wc1dTTm%8JFrP7M5*m|4FS$M8BQjd0*$5mBT z=;+h``|#@O>def{hpE;xP>o@MwWZ1MmAK&!C~YJ_fOC|^AUu7Ow%}WOucF57OlzZ* zw&0}4?rx62QE;bCYowvX>r85*c$vv8NQW{`j8k!_FH4CuP>z71&z->NKwX$paj0pE zye&zHq{#21$L&sRq?EVen7rhKrqiFo>V2NfQE#UjHF%J+-E@`3GEa?lmc|`9dpK2* zrOEF^Vw{Vv*__V48cJ%W#pxN@<~n zsMJnvrBH9C0A|c`lfyqtRHdBxl zFm#Qu+mEu`CPIROqtR4yshGRuX^FcMEpd*p+f{U`Cqjd5kGv^Gg(pLU88mmC!01S3 zpJ<4>VuH3?day-fos6#9fTGZuyya?&y^pcnB|w2?g}6OhmVBMeXNS5IE^=vtn#p8@xFtb?7czBwoy$gJoo$W3h^p6Mf3qq^g%B%mTzjybzvr605p*>rcFHDMBd9Qt+&3AWqElP-Sk;0I( z-5xo6E=q}UlEZhH$d{pUziytuto-k+j}!kHAxMsSGA;4JT}sxZ;L}hHsC- zGc(Nb@$mp=nVFfH004k9Gc%x*O#}o4z`(%&%$Wc)nKNe0UteD{=KnxIK!AXN)X>NP z00960|M2kcA^8LV00000EC2ui07?Oi000R80Qm_VNU)&6g9sBUT*$DY!-o(fN}Ncs zqQ#3CGZNIt&!5MSAVZ2ANwTELlPFWFT*BcR3xlMp%jWXM1X0Dva~1XRJ|EJ6fX z)6SqV!^1$9EM216ilWLFAvnuSO_(4J%%B-8Vh9n#Mavi@FnZiDrzz5>J8v9`1BU@a zH5I9dDOzM_%CTTq_=rHIY>gaUu^v4CpmpjNCm*h!;VJa%#fx(5AbrW!t&E-%OQffv2Za)dSExbcS$tRR!gBo$Op1T)Zt(FO>~0JDV!7T_YqD$Q8p$t#yA zp$$269Fjr{Ly(ZpHxy8?2@$Or1Bf8Sl(NGfMi{|H95OUw$O=KY00a~xFreg;Og8D{ zlTbz(B|k>##MCwFWT~Z=PC+FVRaRl86<1z?B^Fs`p`{jEZowrNU3TH67hiq>CKzFc zA*L8(jzK0FWtL&48E2k>CK_p`p{5#ZuE8c7ZMNa28*jb=CmeCcA*UR3&Os*~b=G00 z9e3V=Cmwm`p{E{u?!hM?efHu1ryqa*0Vp7W1|p~+gAPI{A%zxVs3C_Qf+!-1CZeb! zi!Q<_BaJrVs3VU)0x2YsMj|QYw%m3LC6zfLwbV5vy|aN*PenCVRaa%TRaakyHC9rnq8@FUB}yjW_1FV~;-uIb@MXCdt4``k<|(+6;hu)Rq2p zAotuIywkzC4W#=eyJEioTc*5d*1IOYZtfeWzjOwCC&79i+^52THasZAhEANQ#f)bB zD94h1T&c*Imb@v-o~|6K%cRD9D$T0i+^Wv7_B<=lwho=E(Yz-8E7QV0U98l|R=q6N z&Tbv8*VKl6E!oxStrnem=UubTI^ zsV|)V$oX%b0(+FF!F(qCC&Pk1T&TpP@ra@>)+miZs$-J^nWaXSDU)$3WuIc1s9sho znW3s?tHN11J`y`w{j63(!&T9Cg*0C+Em%$?R@9C~HDz6`Sz3cu*QNzFYmF^iW{ciJ zpeK-h`0$56?4kAloF}~@VozL3fk*ec*MV`gqXQp!$2HF70FZ#GU1NfmndX%yd$GkM zg@d2`5@)AG*v}(4@JRmrw6H)qj8G9f6b}T5IgB}KW0CS0r9vhgk2KH`9>IV|N(ZWz zjS6O_npvuB#;O;1L_QvgmCry@I}v(>guPN4u$ne3s2OW&O7Mu)m=zKkO6zOY5*xP4 zM!h0N4~VeT$@GZGkAC!nAhs0Z^{Rx#2EZc}eqaYX@?5R8Ss^Ewx

E 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 literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif b/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif new file mode 100755 index 0000000000000000000000000000000000000000..cdc617eab3be256173af047822671023c41d53c7 GIT binary patch literal 7195 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 AEdT%j literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif b/public/javascripts/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif new file mode 100755 index 0000000000000000000000000000000000000000..6a032c5ae8dfcf3fad7ed65c814c2b1a1e88d25d GIT binary patch literal 7094 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 literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/index.htm b/public/javascripts/tiny_mce/themes/advanced/docs/en/index.htm new file mode 100755 index 0000000..9810a93 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/docs/en/index.htm @@ -0,0 +1,27 @@ + + +Help Index + + + + + + + + + +


+
+Click the links below to go to the different help sections. + +
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm b/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm new file mode 100755 index 0000000..332cbc6 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm @@ -0,0 +1,32 @@ + + +Insert anchor button + + + + + + + + + + + +
+
+This button opens a new window with the insert/edit anchor function.
+
+Anchor dialog/window
+
+There are one field in this window, this is where you enter the name of you anchor point. Remember the anchor name needs to be unique.
+
+
+ + + + + + +
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_image_button.htm b/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_image_button.htm new file mode 100755 index 0000000..1529648 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_image_button.htm @@ -0,0 +1,65 @@ + + +Insert image button + + + + + + + + + + + +
+
+The insert image button opens the window shown below.
+
+Insert image dialog/window
+
+You simply enter a URL to the image you want to link to and enter a image description, +this is then displayed as an alternative text descripton of the image on the page.
+
+Field descriptions:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Image URL URL/path to the image.
Image description Alternative description of image contents.
DimentionsImage width/height.
AlignmentImage alignment, useful when wrapping text around images.
BorderBorder thickness.
VSpaceVertical space, useful when wrapping text around images.
HSpaceHorizontal space, useful when wrapping text around images.
+
+
+ + + + + + +
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_link_button.htm b/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_link_button.htm new file mode 100755 index 0000000..4f64450 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_link_button.htm @@ -0,0 +1,33 @@ + + +Insert link button + + + + + + + + + + + +
+
+This button opens a new window with the insert/edit link function.
+
+Insert link dialog/window
+
+There are two fields in this window the first one "Link URL" is the +URL of the link. The target enables you to select how the link is to be opened.
+
+
+ + + + + + +
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_table_button.htm b/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_table_button.htm new file mode 100755 index 0000000..f352a05 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/docs/en/insert_table_button.htm @@ -0,0 +1,71 @@ + + +Insert table button + + + + + + + + + + + +
+
+The insert table button opens the window shown below. This action enables you to create tables.
+
+Image of table window
+
+Field descriptions:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ColumnsNumber of columns in the table.
RowsNumber of rows in the new table.
CellpaddingCellpadding of the table .
CellspacingCellspacing of the table .
AlignmentTable alignment .
BorderBorder thinkness of table.
WidthWidth in pixels of table .
HeightHeight in pixels of table.
ClassStyle or CSS class of table.
+
+
+
+ + + + + + +
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/docs/en/style.css b/public/javascripts/tiny_mce/themes/advanced/docs/en/style.css new file mode 100755 index 0000000..ebc0538 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/docs/en/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/public/javascripts/tiny_mce/themes/advanced/editor_template.js b/public/javascripts/tiny_mce/themes/advanced/editor_template.js new file mode 100755 index 0000000..24277e6 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/editor_template.js @@ -0,0 +1 @@ +tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_AdvancedTheme={_defColors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",_autoImportCSSClasses:true,_resizer:{},_buttons:[['bold','{$lang_bold_img}','lang_bold_desc','Bold'],['italic','{$lang_italic_img}','lang_italic_desc','Italic'],['underline','{$lang_underline_img}','lang_underline_desc','Underline'],['strikethrough','strikethrough.gif','lang_striketrough_desc','Strikethrough'],['justifyleft','justifyleft.gif','lang_justifyleft_desc','JustifyLeft'],['justifycenter','justifycenter.gif','lang_justifycenter_desc','JustifyCenter'],['justifyright','justifyright.gif','lang_justifyright_desc','JustifyRight'],['justifyfull','justifyfull.gif','lang_justifyfull_desc','JustifyFull'],['bullist','bullist.gif','lang_bullist_desc','InsertUnorderedList'],['numlist','numlist.gif','lang_numlist_desc','InsertOrderedList'],['outdent','outdent.gif','lang_outdent_desc','Outdent'],['indent','indent.gif','lang_indent_desc','Indent'],['cut','cut.gif','lang_cut_desc','Cut'],['copy','copy.gif','lang_copy_desc','Copy'],['paste','paste.gif','lang_paste_desc','Paste'],['undo','undo.gif','lang_undo_desc','Undo'],['redo','redo.gif','lang_redo_desc','Redo'],['link','link.gif','lang_link_desc','mceLink',true],['unlink','unlink.gif','lang_unlink_desc','unlink'],['image','image.gif','lang_image_desc','mceImage',true],['cleanup','cleanup.gif','lang_cleanup_desc','mceCleanup'],['help','help.gif','lang_help_desc','mceHelp'],['code','code.gif','lang_theme_code_desc','mceCodeEditor'],['hr','hr.gif','lang_theme_hr_desc','inserthorizontalrule'],['removeformat','removeformat.gif','lang_theme_removeformat_desc','removeformat'],['sub','sub.gif','lang_theme_sub_desc','subscript'],['sup','sup.gif','lang_theme_sup_desc','superscript'],['forecolor','forecolor.gif','lang_theme_forecolor_desc','forecolor',true],['backcolor','backcolor.gif','lang_theme_backcolor_desc','HiliteColor',true],['charmap','charmap.gif','lang_theme_charmap_desc','mceCharMap'],['visualaid','visualaid.gif','lang_theme_visualaid_desc','mceToggleVisualAid'],['anchor','anchor.gif','lang_theme_anchor_desc','mceInsertAnchor'],['newdocument','newdocument.gif','lang_newdocument_desc','mceNewDocument']],_buttonMap:'anchor,backcolor,bold,bullist,charmap,cleanup,code,copy,cut,forecolor,help,hr,image,indent,italic,justifycenter,justifyfull,justifyleft,justifyright,link,newdocument,numlist,outdent,paste,redo,removeformat,strikethrough,sub,sup,underline,undo,unlink,visualaid,advhr,ltr,rtl,emotions,flash,fullpage,fullscreen,iespell,insertdate,inserttime,pastetext,pasteword,selectall,preview,print,save,replace,search,table,cell_props,delete_col,delete_row,col_after,col_before,row_after,row_before,merge_cells,row_props,split_cells,delete_table',getControlHTML:function(button_name){var i,x,but;for(i=0;i4?but[4]:false),(but.length>5?but[5]:null));if(but[0]==button_name)return tinyMCE.getButtonHTML(but[0],but[2],'{$themeurl}/images/'+but[1],but[3],(but.length>4?but[4]:false),(but.length>5?but[5]:null))}switch(button_name){case"formatselect":var html='';return html;case"styleselect":return'';case"fontselect":var fontHTML='';return fontHTML;case"fontsizeselect":return'';case"|":case"separator":return'';case"spacer":return'';case"rowseparator":return'
'}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case'mceHelp':tinyMCE.openWindow({file:'about.htm',width:480,height:380},{tinymce_version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion,tinymce_releasedate:tinyMCE.releaseDate,inline:"yes"});return true;case"mceLink":var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();var selectedText="";if(tinyMCE.isMSIE){var rng=doc.selection.createRange();selectedText=rng.text}else selectedText=inst.getSel().toString();if(!tinyMCE.linkElement){if((tinyMCE.selectedElement.nodeName.toLowerCase()!="img")&&(selectedText.length<=0))return true}var href="",target="",title="",onclick="",action="insert",style_class="";if(tinyMCE.selectedElement.nodeName.toLowerCase()=="a")tinyMCE.linkElement=tinyMCE.selectedElement;if(tinyMCE.linkElement!=null&&tinyMCE.getAttrib(tinyMCE.linkElement,'href')=="")tinyMCE.linkElement=null;if(tinyMCE.linkElement){href=tinyMCE.getAttrib(tinyMCE.linkElement,'href');target=tinyMCE.getAttrib(tinyMCE.linkElement,'target');title=tinyMCE.getAttrib(tinyMCE.linkElement,'title');onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');style_class=tinyMCE.getAttrib(tinyMCE.linkElement,'class');if(onclick=="")onclick=tinyMCE.getAttrib(tinyMCE.linkElement,'onclick');onclick=tinyMCE.cleanupEventStr(onclick);href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);");mceRealHref=tinyMCE.getAttrib(tinyMCE.linkElement,'mce_href');if(mceRealHref!=""){href=mceRealHref;if(tinyMCE.getParam('convert_urls'))href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement, true);")}action="update"}var template=new Array();template['file']='link.htm';template['width']=310;template['height']=200;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);if(inst.settings['insertlink_callback']){var returnVal=eval(inst.settings['insertlink_callback']+"(href, target, title, onclick, action, style_class);");if(returnVal&&returnVal['href'])TinyMCE_AdvancedTheme._insertLink(returnVal['href'],returnVal['target'],returnVal['title'],returnVal['onclick'],returnVal['style_class'])}else{tinyMCE.openWindow(template,{href:href,target:target,title:title,onclick:onclick,action:action,className:style_class,inline:"yes"})}return true;case"mceImage":var src="",alt="",border="",hspace="",vspace="",width="",height="",align="";var title="",onmouseover="",onmouseout="",action="insert";var img=tinyMCE.imgElement;var inst=tinyMCE.getInstanceById(editor_id);if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){img=tinyMCE.selectedElement;tinyMCE.imgElement=img}if(img){if(tinyMCE.getAttrib(img,'name').indexOf('mce_')==0)return true;src=tinyMCE.getAttrib(img,'src');alt=tinyMCE.getAttrib(img,'alt');if(alt=="")alt=tinyMCE.getAttrib(img,'title');if(tinyMCE.isGecko){var w=img.style.width;if(w!=null&&w!="")img.setAttribute("width",w);var h=img.style.height;if(h!=null&&h!="")img.setAttribute("height",h)}border=tinyMCE.getAttrib(img,'border');hspace=tinyMCE.getAttrib(img,'hspace');vspace=tinyMCE.getAttrib(img,'vspace');width=tinyMCE.getAttrib(img,'width');height=tinyMCE.getAttrib(img,'height');align=tinyMCE.getAttrib(img,'align');onmouseover=tinyMCE.getAttrib(img,'onmouseover');onmouseout=tinyMCE.getAttrib(img,'onmouseout');title=tinyMCE.getAttrib(img,'title');if(tinyMCE.isMSIE){width=img.attributes['width'].specified?width:"";height=img.attributes['height'].specified?height:""}src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);");mceRealSrc=tinyMCE.getAttrib(img,'mce_src');if(mceRealSrc!=""){src=mceRealSrc;if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, img, true);")}action="update"}var template=new Array();template['file']='image.htm?src={$src}';template['width']=355;template['height']=265+(tinyMCE.isMSIE?25:0);template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);if(inst.settings['insertimage_callback']){var returnVal=eval(inst.settings['insertimage_callback']+"(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");if(returnVal&&returnVal['src'])TinyMCE_AdvancedTheme._insertImage(returnVal['src'],returnVal['alt'],returnVal['border'],returnVal['hspace'],returnVal['vspace'],returnVal['width'],returnVal['height'],returnVal['align'],returnVal['title'],returnVal['onmouseover'],returnVal['onmouseout'])}else tinyMCE.openWindow(template,{src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout,action:action,inline:"yes"});return true;case"forecolor":var fcp=new TinyMCE_Layer(editor_id+'_fcPreview',false),p,img,elm;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!fcp.exists()){fcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=fcp.getElement();elm._editor_id=editor_id;elm._command="forecolor";elm._switchId=editor_id+"_forecolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_forecolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));fcp.moveTo(p.absLeft,p.absTop);fcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).foreColor;fcp.show();return false;case"forecolorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_fcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_text_colors','forecolor'));tinyMCE.switchClass(editor_id+'_forecolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_forecolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"HiliteColor":var bcp=new TinyMCE_Layer(editor_id+'_bcPreview',false),p,img;TinyMCE_AdvancedTheme._hideMenus(editor_id);if(!bcp.exists()){bcp.create('div','mceColorPreview',document.getElementById(editor_id+'_toolbar'));elm=bcp.getElement();elm._editor_id=editor_id;elm._command="HiliteColor";elm._switchId=editor_id+"_backcolor";tinyMCE.addEvent(elm,'click',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseover',TinyMCE_AdvancedTheme._handleMenuEvent);tinyMCE.addEvent(elm,'mouseout',TinyMCE_AdvancedTheme._handleMenuEvent)}img=tinyMCE.selectNodes(document.getElementById(editor_id+"_backcolor"),function(n){return n.nodeName=="IMG"})[0];p=tinyMCE.getAbsPosition(img,document.getElementById(editor_id+'_toolbar'));bcp.moveTo(p.absLeft,p.absTop);bcp.getElement().style.backgroundColor=value!=null?value:tinyMCE.getInstanceById(editor_id).backColor;bcp.show();return false;case"HiliteColorMenu":TinyMCE_AdvancedTheme._hideMenus(editor_id);var ml=new TinyMCE_Layer(editor_id+'_bcMenu');if(!ml.exists())ml.create('div','mceMenu',document.body,TinyMCE_AdvancedTheme._getColorHTML(editor_id,'theme_advanced_background_colors','HiliteColor'));tinyMCE.switchClass(editor_id+'_backcolor','mceMenuButtonFocus');ml.moveRelativeTo(document.getElementById(editor_id+"_backcolor"),'bl');ml.moveBy(tinyMCE.isMSIE&&!tinyMCE.isOpera?-1:1,-1);if(tinyMCE.isOpera)ml.moveBy(0,-2);ml.show();return true;case"mceColorPicker":if(user_interface){var template=new Array();var inputColor=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=220;template['height']=190;template['close_previous']="no";template['width']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height',0);if(typeof(value['store_selection'])=="undefined")value['store_selection']=true;tinyMCE.lastColorPickerValue=value;tinyMCE.openWindow(template,{editor_id:editor_id,mce_store_selection:value['store_selection'],inline:"yes",command:"mceColorPicker",input_color:inputColor})}else{var savedVal=tinyMCE.lastColorPickerValue;var elm=savedVal['document'].getElementById(savedVal['element_id']);elm.value=value;if(elm.onchange!=null&&elm.onchange!='')eval('elm.onchange();')}return true;case"mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_width",720));template['height']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_height",580));tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no",inline:"yes"});return true;case"mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550+(tinyMCE.isOpera?40:0);template['height']=250;template['width']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=90+(tinyMCE.isNS7?30:0);template['width']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case"mceNewDocument":if(confirm(tinyMCE.getLang('lang_newdocument')))tinyMCE.execInstanceCommand(editor_id,'mceSetContent',false,' ');return true}return false},getEditorTemplate:function(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array(),skip;for(var i=0;i 

';var layoutManager=tinyMCE.getParam("theme_advanced_layout_manager","SimpleLayout");var styleSelectHTML='';if(settings['theme_advanced_styles']){var stylesAr=settings['theme_advanced_styles'].split(';');for(var i=0;i'+key+''}TinyMCE_AdvancedTheme._autoImportCSSClasses=false}switch(layoutManager){case"SimpleLayout":var toolbarHTML="";var toolbarLocation=tinyMCE.getParam("theme_advanced_toolbar_location","bottom");var toolbarAlign=tinyMCE.getParam("theme_advanced_toolbar_align","center");var pathLocation=tinyMCE.getParam("theme_advanced_path_location","none");var statusbarLocation=tinyMCE.getParam("theme_advanced_statusbar_location",pathLocation);var defVals={theme_advanced_buttons1:"bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,separator,sub,sup,separator,charmap"};toolbarHTML+='0){toolbarHTML+="
";deltaHeight-=23}}toolbarHTML+='
';template['html']='';if(toolbarLocation=="top"){template['html']+=''}if(statusbarLocation=="top"){template['html']+='';deltaHeight-=23}template['html']+='';if(toolbarLocation=="bottom"){template['html']+=''}if(toolbarLocation=="external"){var bod=document.body;var elm=document.createElement("div");toolbarHTML=tinyMCE.replaceVar(toolbarHTML,'style_select_options',styleSelectHTML);toolbarHTML=tinyMCE.applyTemplate(toolbarHTML,{editor_id:editorId});elm.className="mceToolbarExternal";elm.id=editorId+"_toolbar";elm.innerHTML='
'+toolbarHTML+'
'+statusbarHTML+'
'+toolbarHTML+'
'+toolbarHTML+'
';bod.appendChild(elm);deltaHeight=0;tinyMCE.getInstanceById(editorId).toolbarElement=elm;}else{tinyMCE.getInstanceById(editorId).toolbarElement=null}if(statusbarLocation=="bottom"){template['html']+=''+statusbarHTML+'';deltaHeight-=23}template['html']+='';break;case"RowLayout":template['html']='';var containers=tinyMCE.getParam("theme_advanced_containers","",true,",");var defaultContainerCSS=tinyMCE.getParam("theme_advanced_containers_default_class","container");var defaultContainerAlign=tinyMCE.getParam("theme_advanced_containers_default_align","center");for(var i=0;i';else if(containers[i]=="mceElementpath"||containers[i]=="mceStatusbar"){var pathClass="mceStatusbar";if(i==containers.length-1){pathClass="mceStatusbarBottom"}else if(i==0){pathClass="mceStatusbar"}else{deltaHeight-=2}template['html']+='';deltaHeight-=22}else{var curContainer=tinyMCE.getParam("theme_advanced_container_"+containers[i],"",true,',');var curContainerHTML="";var curAlign=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align",defaultContainerAlign);var curCSS=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class",defaultContainerCSS);curContainer=removeFromArray(curContainer,tinyMCE.getParam("theme_advanced_disable","",true,','));for(var j=0;j0){curContainerHTML+="
";deltaHeight-=23}template['html']+='
'}}template['html']+='
'+statusbarHTML+'
'+curContainerHTML+'
';break;case"CustomLayout":var customLayout=tinyMCE.getParam("theme_advanced_custom_layout","");if(customLayout!=""&&eval("typeof("+customLayout+")")!="undefined"){template=eval(customLayout+"(template);")}break}if(resizing)template['html']+='';template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);template['delta_width']=0;template['delta_height']=deltaHeight;return template},initInstance:function(inst){if(tinyMCE.getParam("theme_advanced_resizing",false)){if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var w=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_width");var h=TinyMCE_AdvancedTheme._getCookie("TinyMCE_"+inst.editorId+"_height");TinyMCE_AdvancedTheme._resizeTo(inst,w,h,tinyMCE.getParam("theme_advanced_resize_horizontal",true))}}inst.addShortcut('ctrl','k','lang_link_desc','mceLink')},_handleMenuEvent:function(e){var te=tinyMCE.isMSIE?window.event.srcElement:e.target;tinyMCE._menuButtonEvent(e.type=="mouseover"?"over":"out",document.getElementById(te._switchId));if(e.type=="click")tinyMCE.execInstanceCommand(te._editor_id,te._command)},_hideMenus:function(id){var fcml=new TinyMCE_Layer(id+'_fcMenu'),bcml=new TinyMCE_Layer(id+'_bcMenu');if(fcml.exists()&&fcml.isVisible()){tinyMCE.switchClass(id+'_forecolor','mceMenuButton');fcml.hide()}if(bcml.exists()&&bcml.isVisible()){tinyMCE.switchClass(id+'_backcolor','mceMenuButton');bcml.hide()}},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection,setup_content){var alignNode,breakOut,classNode;function selectByValue(select_elm,value,first_index){first_index=typeof(first_index)=="undefined"?false:true;if(select_elm){for(var i=0;i=0;i--){var nodeName=path[i].nodeName.toLowerCase();var nodeData="";if(nodeName.indexOf("html:")==0)nodeName=nodeName.substring(5);if(nodeName=="b"){nodeName="strong"}if(nodeName=="i"){nodeName="em"}if(nodeName=="span"){var cn=tinyMCE.getAttrib(path[i],"class");if(cn!=""&&cn.indexOf('mceItem')==-1)nodeData+="class: "+cn+" ";var st=tinyMCE.getAttrib(path[i],"style");if(st!=""){st=tinyMCE.serializeStyle(tinyMCE.parseStyle(st));nodeData+="style: "+st+" "}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+face+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+size+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+color+" "}if(getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" "}var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1)nodeData+="class: "+className+" ";if(getAttrib(path[i],'src')!=""){var src=tinyMCE.getAttrib(path[i],"mce_src");if(src=="")src=tinyMCE.getAttrib(path[i],"src");nodeData+="src: "+src+" "}if(path[i].nodeName=='A'&&getAttrib(path[i],'href')!=""){var href=tinyMCE.getAttrib(path[i],"mce_href");if(href=="")href=tinyMCE.getAttrib(path[i],"href");nodeData+="href: "+href+" "}className=tinyMCE.getAttrib(path[i],"class");if((nodeName=="img"||nodeName=="span")&&className.indexOf('mceItem')!=-1){nodeName=className.replace(/mceItem([a-z]+)/gi,'$1').toLowerCase();nodeData=path[i].getAttribute('title')}if(nodeName=="a"&&(anchor=tinyMCE.getAttrib(path[i],"name"))!=""){nodeName="a";nodeName+="#"+anchor;nodeData=""}if(getAttrib(path[i],'name').indexOf("mce_")!=0){var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1){nodeName+="."+className}}var cmd='tinyMCE.execInstanceCommand(\''+editor_id+'\',\'mceSelectNodeDepth\',false,\''+i+'\');';html+=''+nodeName+'';if(i>0){html+=" » "}}pathElm.innerHTML=''+tinyMCE.getLang('lang_theme_path')+": "+html+' '}tinyMCE.switchClass(editor_id+'_justifyleft','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyright','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonNormal');tinyMCE.switchClass(editor_id+'_justifyfull','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClass(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClass(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClass(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_numlist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sub','mceButtonNormal');tinyMCE.switchClass(editor_id+'_sup','mceButtonNormal');tinyMCE.switchClass(editor_id+'_anchor','mceButtonNormal');tinyMCE.switchClass(editor_id+'_link','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_unlink','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_outdent','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_image','mceButtonNormal');tinyMCE.switchClass(editor_id+'_hr','mceButtonNormal');if(node.nodeName=="A"&&tinyMCE.getAttrib(node,"class").indexOf('mceItemAnchor')!=-1)tinyMCE.switchClass(editor_id+'_anchor','mceButtonSelected');var anchorLink=tinyMCE.getParentElement(node,"a","href");if(anchorLink||any_selection){tinyMCE.switchClass(editor_id+'_link',anchorLink?'mceButtonSelected':'mceButtonNormal');tinyMCE.switchClass(editor_id+'_unlink',anchorLink?'mceButtonSelected':'mceButtonNormal')}tinyMCE.switchClass(editor_id+'_visualaid',visual_aid?'mceButtonSelected':'mceButtonNormal');if(undo_levels!=-1){tinyMCE.switchClass(editor_id+'_undo','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_redo','mceButtonDisabled')}if(tinyMCE.getParentElement(node,"li,blockquote"))tinyMCE.switchClass(editor_id+'_outdent','mceButtonNormal');if(undo_index!=-1&&(undo_index0))tinyMCE.switchClass(editor_id+'_redo','mceButtonNormal');if(undo_index!=-1&&(undo_index>0&&undo_levels>0))tinyMCE.switchClass(editor_id+'_undo','mceButtonNormal');var selectElm=document.getElementById(editor_id+"_styleSelect");if(selectElm){TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);classNode=node;breakOut=false;var index=0;do{if(classNode&&classNode.className){for(var i=0;i");else selectByValue(selectElm,"")}var selectElm=document.getElementById(editor_id+"_fontNameSelect");if(selectElm){if(!tinyMCE.isSafari&&!(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var face=inst.queryCommandValue('FontName');face=face==null||face==""?"":face;selectByValue(selectElm,face,face!="")}else{var elm=tinyMCE.getParentElement(node,"font","face");if(elm){var family=tinyMCE.getAttrib(elm,"face");if(family=='')family=''+elm.style.fontFamily;if(!selectByValue(selectElm,family,family!=""))selectByValue(selectElm,"")}else selectByValue(selectElm,"")}}var selectElm=document.getElementById(editor_id+"_fontSizeSelect");if(selectElm){if(!tinyMCE.isSafari&&!tinyMCE.isOpera){var size=inst.queryCommandValue('FontSize');selectByValue(selectElm,size==null||size==""?"0":size)}else{var elm=tinyMCE.getParentElement(node,"font","size");if(elm){var size=tinyMCE.getAttrib(elm,"size");if(size==''){var sizes=new Array('','8px','10px','12px','14px','18px','24px','36px');size=''+elm.style.fontSize;for(var i=0;i0)selectElm.setAttribute('cssImported','true')}},_setCookie:function(name,value,expires,path,domain,secure){var curCookie=name+"="+escape(value)+((expires)?"; expires="+expires.toGMTString():"")+((path)?"; path="+escape(path):"")+((domain)?"; domain="+domain:"")+((secure)?"; secure":"");document.cookie=curCookie},_getCookie:function(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)return null}else begin+=2;var end=document.cookie.indexOf(";",begin);if(end==-1)end=dc.length;return unescape(dc.substring(begin+prefix.length,end))},_resizeTo:function(inst,w,h,set_w){var editorContainer=document.getElementById(inst.editorId+'_parent');var tableElm=editorContainer.firstChild;var iframe=inst.iframeElement;if(w==null||w=="null"){set_w=false;w=0}if(h==null||h=="null")return;w=parseInt(w);h=parseInt(h);if(tinyMCE.isGecko){w+=2;h+=2}var dx=w-tableElm.clientWidth;var dy=h-tableElm.clientHeight;w=w<1?30:w;h=h<1?30:h;if(set_w)tableElm.style.width=w+"px";tableElm.style.height=h+"px";iw=iframe.clientWidth+dx;ih=iframe.clientHeight+dy;iw=iw<1?30:iw;ih=ih<1?30:ih;if(tinyMCE.isGecko){iw-=2;ih-=2}if(set_w)iframe.style.width=iw+"px";iframe.style.height=ih+"px";if(set_w){var tableBodyElm=tableElm.firstChild;var minIframeWidth=tableBodyElm.scrollWidth;if(inst.iframeElement.clientWidth';for(i=0;i';if((i+1)%8==0)h+=''}h+='';return h},_insertImage:function(src,alt,border,hspace,vspace,width,height,align,title,onmouseover,onmouseout){tinyMCE.execCommand('mceBeginUndoLevel');if(src=="")return;if(!tinyMCE.imgElement&&tinyMCE.isSafari){var html="";html+=''+alt+'';tinyMCE.execCommand("mceInsertContent",false,html)}else{if(!tinyMCE.imgElement&&tinyMCE.selectedInstance){if(tinyMCE.isSafari)tinyMCE.execCommand("mceInsertContent",false,'');else tinyMCE.selectedInstance.contentDocument.execCommand("insertimage",false,tinyMCE.uniqueURL);tinyMCE.imgElement=tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"img","src",tinyMCE.uniqueURL)}}if(tinyMCE.imgElement){var needsRepaint=false;var msrc=src;src=eval(tinyMCE.settings['urlconverter_callback']+"(src, tinyMCE.imgElement);");if(tinyMCE.getParam('convert_urls'))msrc=src;if(onmouseover&&onmouseover!="")onmouseover="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseover, tinyMCE.imgElement);")+"';";if(onmouseout&&onmouseout!="")onmouseout="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseout, tinyMCE.imgElement);")+"';";if(typeof(title)=="undefined")title=alt;if(width!=tinyMCE.imgElement.getAttribute("width")||height!=tinyMCE.imgElement.getAttribute("height")||align!=tinyMCE.imgElement.getAttribute("align"))needsRepaint=true;tinyMCE.setAttrib(tinyMCE.imgElement,'src',src);tinyMCE.setAttrib(tinyMCE.imgElement,'mce_src',msrc);tinyMCE.setAttrib(tinyMCE.imgElement,'alt',alt);tinyMCE.setAttrib(tinyMCE.imgElement,'title',title);tinyMCE.setAttrib(tinyMCE.imgElement,'align',align);tinyMCE.setAttrib(tinyMCE.imgElement,'border',border,true);tinyMCE.setAttrib(tinyMCE.imgElement,'hspace',hspace,true);tinyMCE.setAttrib(tinyMCE.imgElement,'vspace',vspace,true);tinyMCE.setAttrib(tinyMCE.imgElement,'width',width,true);tinyMCE.setAttrib(tinyMCE.imgElement,'height',height,true);tinyMCE.setAttrib(tinyMCE.imgElement,'onmouseover',onmouseover);tinyMCE.setAttrib(tinyMCE.imgElement,'onmouseout',onmouseout);if(width&&width!="")tinyMCE.imgElement.style.pixelWidth=width;if(height&&height!="")tinyMCE.imgElement.style.pixelHeight=height;if(needsRepaint)tinyMCE.selectedInstance.repaint()}tinyMCE.execCommand('mceEndUndoLevel')},_insertLink:function(href,target,title,onclick,style_class){tinyMCE.execCommand('mceBeginUndoLevel');if(tinyMCE.selectedInstance&&tinyMCE.selectedElement&&tinyMCE.selectedElement.nodeName.toLowerCase()=="img"){var doc=tinyMCE.selectedInstance.getDoc();var linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");var newLink=false;if(!linkElement){linkElement=doc.createElement("a");newLink=true}var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(linkElement,'href',thref);tinyMCE.setAttrib(linkElement,'mce_href',mhref);tinyMCE.setAttrib(linkElement,'target',target);tinyMCE.setAttrib(linkElement,'title',title);tinyMCE.setAttrib(linkElement,'onclick',onclick);tinyMCE.setAttrib(linkElement,'class',style_class);if(newLink){linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));tinyMCE.selectedElement.parentNode.replaceChild(linkElement,tinyMCE.selectedElement)}return}if(!tinyMCE.linkElement&&tinyMCE.selectedInstance){if(tinyMCE.isSafari){tinyMCE.execCommand("mceInsertContent",false,''+tinyMCE.selectedInstance.selection.getSelectedHTML()+'')}else tinyMCE.selectedInstance.contentDocument.execCommand("createlink",false,tinyMCE.uniqueURL);tinyMCE.linkElement=tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);var elementArray=tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);for(var i=0;i 4 ? but[4] : false), (but.length > 5 ? but[5] : null)); + + if (but[0] == button_name) + return tinyMCE.getButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null)); + } + + // Custom controlls other than buttons + switch (button_name) { + case "formatselect": + var html = ''; + + return html; + + case "styleselect": + return ''; + + case "fontselect": + var fontHTML = ''; + return fontHTML; + + case "fontsizeselect": + return ''; + + case "|": + case "separator": + return ''; + + case "spacer": + return ''; + + case "rowseparator": + return '
'; + } + + return ""; + }, + + /** + * Theme specific execcommand handling. + */ + execCommand : function(editor_id, element, command, user_interface, value) { + switch (command) { + case 'mceHelp': + tinyMCE.openWindow({ + file : 'about.htm', + width : 480, + height : 380 + }, { + tinymce_version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion, + tinymce_releasedate : tinyMCE.releaseDate, + inline : "yes" + }); + return true; + + case "mceLink": + var inst = tinyMCE.getInstanceById(editor_id); + var doc = inst.getDoc(); + var selectedText = ""; + + if (tinyMCE.isMSIE) { + var rng = doc.selection.createRange(); + selectedText = rng.text; + } else + selectedText = inst.getSel().toString(); + + if (!tinyMCE.linkElement) { + if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0)) + return true; + } + + var href = "", target = "", title = "", onclick = "", action = "insert", style_class = ""; + + if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a") + tinyMCE.linkElement = tinyMCE.selectedElement; + + // Is anchor not a link + if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "") + tinyMCE.linkElement = null; + + if (tinyMCE.linkElement) { + href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href'); + target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target'); + title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title'); + onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick'); + style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class'); + + // Try old onclick to if copy/pasted content + if (onclick == "") + onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick'); + + onclick = tinyMCE.cleanupEventStr(onclick); + + href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);"); + + // Use mce_href if defined + mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href'); + if (mceRealHref != "") { + href = mceRealHref; + + if (tinyMCE.getParam('convert_urls')) + href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);"); + } + + action = "update"; + } + + var template = new Array(); + + template['file'] = 'link.htm'; + template['width'] = 310; + template['height'] = 200; + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0); + + if (inst.settings['insertlink_callback']) { + var returnVal = eval(inst.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);"); + if (returnVal && returnVal['href']) + TinyMCE_AdvancedTheme._insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']); + } else { + tinyMCE.openWindow(template, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"}); + } + + return true; + + case "mceImage": + var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = ""; + var title = "", onmouseover = "", onmouseout = "", action = "insert"; + var img = tinyMCE.imgElement; + var inst = tinyMCE.getInstanceById(editor_id); + + if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") { + img = tinyMCE.selectedElement; + tinyMCE.imgElement = img; + } + + if (img) { + // Is it a internal MCE visual aid image, then skip this one. + if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0) + return true; + + src = tinyMCE.getAttrib(img, 'src'); + alt = tinyMCE.getAttrib(img, 'alt'); + + // Try polling out the title + if (alt == "") + alt = tinyMCE.getAttrib(img, 'title'); + + // Fix width/height attributes if the styles is specified + if (tinyMCE.isGecko) { + var w = img.style.width; + if (w != null && w != "") + img.setAttribute("width", w); + + var h = img.style.height; + if (h != null && h != "") + img.setAttribute("height", h); + } + + border = tinyMCE.getAttrib(img, 'border'); + hspace = tinyMCE.getAttrib(img, 'hspace'); + vspace = tinyMCE.getAttrib(img, 'vspace'); + width = tinyMCE.getAttrib(img, 'width'); + height = tinyMCE.getAttrib(img, 'height'); + align = tinyMCE.getAttrib(img, 'align'); + onmouseover = tinyMCE.getAttrib(img, 'onmouseover'); + onmouseout = tinyMCE.getAttrib(img, 'onmouseout'); + title = tinyMCE.getAttrib(img, 'title'); + + // Is realy specified? + if (tinyMCE.isMSIE) { + width = img.attributes['width'].specified ? width : ""; + height = img.attributes['height'].specified ? height : ""; + } + + //onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover)); + //onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout)); + + src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);"); + + // Use mce_src if defined + mceRealSrc = tinyMCE.getAttrib(img, 'mce_src'); + if (mceRealSrc != "") { + src = mceRealSrc; + + if (tinyMCE.getParam('convert_urls')) + src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);"); + } + + //if (onmouseover != "") + // onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);"); + + //if (onmouseout != "") + // onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);"); + + action = "update"; + } + + var template = new Array(); + + template['file'] = 'image.htm?src={$src}'; + template['width'] = 355; + template['height'] = 265 + (tinyMCE.isMSIE ? 25 : 0); + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0); + + if (inst.settings['insertimage_callback']) { + var returnVal = eval(inst.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);"); + if (returnVal && returnVal['src']) + TinyMCE_AdvancedTheme._insertImage(returnVal['src'], returnVal['alt'], returnVal['border'], returnVal['hspace'], returnVal['vspace'], returnVal['width'], returnVal['height'], returnVal['align'], returnVal['title'], returnVal['onmouseover'], returnVal['onmouseout']); + } else + tinyMCE.openWindow(template, {src : src, alt : alt, border : border, hspace : hspace, vspace : vspace, width : width, height : height, align : align, title : title, onmouseover : onmouseover, onmouseout : onmouseout, action : action, inline : "yes"}); + + return true; + + case "forecolor": + var fcp = new TinyMCE_Layer(editor_id + '_fcPreview', false), p, img, elm; + + TinyMCE_AdvancedTheme._hideMenus(editor_id); + + if (!fcp.exists()) { + fcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar')); + elm = fcp.getElement(); + elm._editor_id = editor_id; + elm._command = "forecolor"; + elm._switchId = editor_id + "_forecolor"; + tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent); + tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent); + tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent); + } + + img = tinyMCE.selectNodes(document.getElementById(editor_id + "_forecolor"), function(n) {return n.nodeName == "IMG";})[0]; + p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar')); + + fcp.moveTo(p.absLeft, p.absTop); + fcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).foreColor; + fcp.show(); + + return false; + + case "forecolorMenu": + TinyMCE_AdvancedTheme._hideMenus(editor_id); + + // Create color layer + var ml = new TinyMCE_Layer(editor_id + '_fcMenu'); + + if (!ml.exists()) + ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_text_colors', 'forecolor')); + + tinyMCE.switchClass(editor_id + '_forecolor', 'mceMenuButtonFocus'); + ml.moveRelativeTo(document.getElementById(editor_id + "_forecolor"), 'bl'); + + ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1); + + if (tinyMCE.isOpera) + ml.moveBy(0, -2); + + ml.show(); + return true; + + case "HiliteColor": + var bcp = new TinyMCE_Layer(editor_id + '_bcPreview', false), p, img; + + TinyMCE_AdvancedTheme._hideMenus(editor_id); + + if (!bcp.exists()) { + bcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar')); + elm = bcp.getElement(); + elm._editor_id = editor_id; + elm._command = "HiliteColor"; + elm._switchId = editor_id + "_backcolor"; + tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent); + tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent); + tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent); + } + + img = tinyMCE.selectNodes(document.getElementById(editor_id + "_backcolor"), function(n) {return n.nodeName == "IMG";})[0]; + p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar')); + + bcp.moveTo(p.absLeft, p.absTop); + bcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).backColor; + bcp.show(); + + return false; + + case "HiliteColorMenu": + TinyMCE_AdvancedTheme._hideMenus(editor_id); + + // Create color layer + var ml = new TinyMCE_Layer(editor_id + '_bcMenu'); + + if (!ml.exists()) + ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_background_colors', 'HiliteColor')); + + tinyMCE.switchClass(editor_id + '_backcolor', 'mceMenuButtonFocus'); + ml.moveRelativeTo(document.getElementById(editor_id + "_backcolor"), 'bl'); + + ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1); + + if (tinyMCE.isOpera) + ml.moveBy(0, -2); + + ml.show(); + return true; + + case "mceColorPicker": + if (user_interface) { + var template = new Array(); + var inputColor = value['document'].getElementById(value['element_id']).value; + + template['file'] = 'color_picker.htm'; + template['width'] = 220; + template['height'] = 190; + template['close_previous'] = "no"; + + template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0); + + if (typeof(value['store_selection']) == "undefined") + value['store_selection'] = true; + + tinyMCE.lastColorPickerValue = value; + tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : inputColor}); + } else { + var savedVal = tinyMCE.lastColorPickerValue; + var elm = savedVal['document'].getElementById(savedVal['element_id']); + elm.value = value; + + if (elm.onchange != null && elm.onchange != '') + eval('elm.onchange();'); + } + return true; + + case "mceCodeEditor": + var template = new Array(); + + template['file'] = 'source_editor.htm'; + template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 720)); + template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 580)); + + tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"}); + return true; + + case "mceCharMap": + var template = new Array(); + + template['file'] = 'charmap.htm'; + template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0); + template['height'] = 250; + + template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + return true; + + case "mceInsertAnchor": + var template = new Array(); + + template['file'] = 'anchor.htm'; + template['width'] = 320; + template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0); + + template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + return true; + + case "mceNewDocument": + if (confirm(tinyMCE.getLang('lang_newdocument'))) + tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ' '); + + return true; + } + + return false; + }, + + /** + * Editor instance template function. + */ + getEditorTemplate : function(settings, editorId) { + function removeFromArray(in_array, remove_array) { + var outArray = new Array(), skip; + + for (var i=0; i 

'; + var layoutManager = tinyMCE.getParam("theme_advanced_layout_manager", "SimpleLayout"); + + // Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY! + var styleSelectHTML = ''; + if (settings['theme_advanced_styles']) { + var stylesAr = settings['theme_advanced_styles'].split(';'); + + for (var i=0; i' + key + ''; + } + + TinyMCE_AdvancedTheme._autoImportCSSClasses = false; + } + + switch(layoutManager) { + case "SimpleLayout" : //the default TinyMCE Layout (for backwards compatibility)... + var toolbarHTML = ""; + var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom"); + var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center"); + var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); // Compatiblity + var statusbarLocation = tinyMCE.getParam("theme_advanced_statusbar_location", pathLocation); + var defVals = { + theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect", + theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code", + theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap" + }; + + // Add accessibility control + toolbarHTML += ' 0) { + toolbarHTML += "
"; + deltaHeight -= 23; + } + } + + // Add accessibility control + toolbarHTML += '
'; + + // Setup template html + template['html'] = ''; + + if (toolbarLocation == "top") { + template['html'] += ''; + } + + if (statusbarLocation == "top") { + template['html'] += ''; + deltaHeight -= 23; + } + + template['html'] += ''; + + if (toolbarLocation == "bottom") { + template['html'] += ''; + } + + // External toolbar changes + if (toolbarLocation == "external") { + var bod = document.body; + var elm = document.createElement ("div"); + + toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML); + toolbarHTML = tinyMCE.applyTemplate(toolbarHTML, {editor_id : editorId}); + + elm.className = "mceToolbarExternal"; + elm.id = editorId+"_toolbar"; + elm.innerHTML = '
' + toolbarHTML + '
' + statusbarHTML + '
' + toolbarHTML + '
'+toolbarHTML+'
'; + bod.appendChild (elm); + // bod.style.marginTop = elm.offsetHeight + "px"; + + deltaHeight = 0; + tinyMCE.getInstanceById(editorId).toolbarElement = elm; + + //template['html'] = '
'+toolbarHTML+'
' + template["html"]; + } else { + tinyMCE.getInstanceById(editorId).toolbarElement = null; + } + + if (statusbarLocation == "bottom") { + template['html'] += '' + statusbarHTML + ''; + deltaHeight -= 23; + } + + template['html'] += ''; + //"SimpleLayout" + break; + + case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom. + template['html'] = ''; + + var containers = tinyMCE.getParam("theme_advanced_containers", "", true, ","); + var defaultContainerCSS = tinyMCE.getParam("theme_advanced_containers_default_class", "container"); + var defaultContainerAlign = tinyMCE.getParam("theme_advanced_containers_default_align", "center"); + + //Render Containers: + for (var i = 0; i < containers.length; i++) + { + if (containers[i] == "mceEditor") //Exceptions for mceEditor and ... + template['html'] += ''; + else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath: + { + var pathClass = "mceStatusbar"; + + if (i == containers.length-1) + { + pathClass = "mceStatusbarBottom"; + } + else if (i == 0) + { + pathClass = "mceStatusbar"; + } + else + { + deltaHeight-=2; + } + + template['html'] += ''; + deltaHeight -= 22; + } else { // Render normal Container + var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ','); + var curContainerHTML = ""; + var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign); + var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS); + + curContainer = removeFromArray(curContainer, tinyMCE.getParam("theme_advanced_disable", "", true, ',')); + + for (var j=0; j 0) { + curContainerHTML += "
"; + deltaHeight -= 23; + } + + template['html'] += '
'; + } + } + + template['html'] += '
' + statusbarHTML + '
' + curContainerHTML + '
'; + //RowLayout + break; + + case "CustomLayout" : //User defined layout callback... + var customLayout = tinyMCE.getParam("theme_advanced_custom_layout",""); + + if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined") { + template = eval(customLayout + "(template);"); + } + break; + } + + if (resizing) + template['html'] += ''; + + template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML); + template['delta_width'] = 0; + template['delta_height'] = deltaHeight; + + return template; + }, + + initInstance : function(inst) { + if (tinyMCE.getParam("theme_advanced_resizing", false)) { + if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) { + var w = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_width"); + var h = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_height"); + + TinyMCE_AdvancedTheme._resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true)); + } + } + + inst.addShortcut('ctrl', 'k', 'lang_link_desc', 'mceLink'); + }, + + _handleMenuEvent : function(e) { + var te = tinyMCE.isMSIE ? window.event.srcElement : e.target; + tinyMCE._menuButtonEvent(e.type == "mouseover" ? "over" : "out", document.getElementById(te._switchId)); + + if (e.type == "click") + tinyMCE.execInstanceCommand(te._editor_id, te._command); + }, + + _hideMenus : function(id) { + var fcml = new TinyMCE_Layer(id + '_fcMenu'), bcml = new TinyMCE_Layer(id + '_bcMenu'); + + if (fcml.exists() && fcml.isVisible()) { + tinyMCE.switchClass(id + '_forecolor', 'mceMenuButton'); + fcml.hide(); + } + + if (bcml.exists() && bcml.isVisible()) { + tinyMCE.switchClass(id + '_backcolor', 'mceMenuButton'); + bcml.hide(); + } + }, + + /** + * Node change handler. + */ + handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) { + var alignNode, breakOut, classNode; + + function selectByValue(select_elm, value, first_index) { + first_index = typeof(first_index) == "undefined" ? false : true; + + if (select_elm) { + for (var i=0; i=0; i--) { + var nodeName = path[i].nodeName.toLowerCase(); + var nodeData = ""; + + if (nodeName.indexOf("html:") == 0) + nodeName = nodeName.substring(5); + + if (nodeName == "b") { + nodeName = "strong"; + } + + if (nodeName == "i") { + nodeName = "em"; + } + + if (nodeName == "span") { + var cn = tinyMCE.getAttrib(path[i], "class"); + if (cn != "" && cn.indexOf('mceItem') == -1) + nodeData += "class: " + cn + " "; + + var st = tinyMCE.getAttrib(path[i], "style"); + if (st != "") { + st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st)); + nodeData += "style: " + st + " "; + } + } + + if (nodeName == "font") { + if (tinyMCE.getParam("convert_fonts_to_spans")) + nodeName = "span"; + + var face = tinyMCE.getAttrib(path[i], "face"); + if (face != "") + nodeData += "font: " + face + " "; + + var size = tinyMCE.getAttrib(path[i], "size"); + if (size != "") + nodeData += "size: " + size + " "; + + var color = tinyMCE.getAttrib(path[i], "color"); + if (color != "") + nodeData += "color: " + color + " "; + } + + if (getAttrib(path[i], 'id') != "") { + nodeData += "id: " + path[i].getAttribute('id') + " "; + } + + var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false); + if (className != "" && className.indexOf('mceItem') == -1) + nodeData += "class: " + className + " "; + + if (getAttrib(path[i], 'src') != "") { + var src = tinyMCE.getAttrib(path[i], "mce_src"); + + if (src == "") + src = tinyMCE.getAttrib(path[i], "src"); + + nodeData += "src: " + src + " "; + } + + if (path[i].nodeName == 'A' && getAttrib(path[i], 'href') != "") { + var href = tinyMCE.getAttrib(path[i], "mce_href"); + + if (href == "") + href = tinyMCE.getAttrib(path[i], "href"); + + nodeData += "href: " + href + " "; + } + + className = tinyMCE.getAttrib(path[i], "class"); + if ((nodeName == "img" || nodeName == "span") && className.indexOf('mceItem') != -1) { + nodeName = className.replace(/mceItem([a-z]+)/gi, '$1').toLowerCase(); + nodeData = path[i].getAttribute('title'); + } + + if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") { + nodeName = "a"; + nodeName += "#" + anchor; + nodeData = ""; + } + + if (getAttrib(path[i], 'name').indexOf("mce_") != 0) { + var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false); + if (className != "" && className.indexOf('mceItem') == -1) { + nodeName += "." + className; + } + } + + var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');'; + html += '' + nodeName + ''; + + if (i > 0) { + html += " » "; + } + } + + pathElm.innerHTML = '' + tinyMCE.getLang('lang_theme_path') + ": " + html + ' '; + } + + // Reset old states + tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_bold', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_italic', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_underline', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_sub', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_sup', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_link', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_unlink', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_image', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_hr', 'mceButtonNormal'); + + if (node.nodeName == "A" && tinyMCE.getAttrib(node, "class").indexOf('mceItemAnchor') != -1) + tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonSelected'); + + // Get link + var anchorLink = tinyMCE.getParentElement(node, "a", "href"); + + if (anchorLink || any_selection) { + tinyMCE.switchClass(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal'); + } + + // Handle visual aid + tinyMCE.switchClass(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal'); + + if (undo_levels != -1) { + tinyMCE.switchClass(editor_id + '_undo', 'mceButtonDisabled'); + tinyMCE.switchClass(editor_id + '_redo', 'mceButtonDisabled'); + } + + // Within li, blockquote + if (tinyMCE.getParentElement(node, "li,blockquote")) + tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonNormal'); + + // Has redo levels + if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0)) + tinyMCE.switchClass(editor_id + '_redo', 'mceButtonNormal'); + + // Has undo levels + if (undo_index != -1 && (undo_index > 0 && undo_levels > 0)) + tinyMCE.switchClass(editor_id + '_undo', 'mceButtonNormal'); + + // Select class in select box + var selectElm = document.getElementById(editor_id + "_styleSelect"); + + if (selectElm) { + TinyMCE_AdvancedTheme._setupCSSClasses(editor_id); + + classNode = node; + breakOut = false; + var index = 0; + + do { + if (classNode && classNode.className) { + for (var i=0; i"); + else + selectByValue(selectElm, ""); + } + + // Select fontselect + var selectElm = document.getElementById(editor_id + "_fontNameSelect"); + if (selectElm) { + if (!tinyMCE.isSafari && !(tinyMCE.isMSIE && !tinyMCE.isOpera)) { + var face = inst.queryCommandValue('FontName'); + + face = face == null || face == "" ? "" : face; + + selectByValue(selectElm, face, face != ""); + } else { + var elm = tinyMCE.getParentElement(node, "font", "face"); + + if (elm) { + var family = tinyMCE.getAttrib(elm, "face"); + + if (family == '') + family = '' + elm.style.fontFamily; + + if (!selectByValue(selectElm, family, family != "")) + selectByValue(selectElm, ""); + } else + selectByValue(selectElm, ""); + } + } + + // Select fontsize + var selectElm = document.getElementById(editor_id + "_fontSizeSelect"); + if (selectElm) { + if (!tinyMCE.isSafari && !tinyMCE.isOpera) { + var size = inst.queryCommandValue('FontSize'); + selectByValue(selectElm, size == null || size == "" ? "0" : size); + } else { + var elm = tinyMCE.getParentElement(node, "font", "size"); + if (elm) { + var size = tinyMCE.getAttrib(elm, "size"); + + if (size == '') { + var sizes = new Array('', '8px', '10px', '12px', '14px', '18px', '24px', '36px'); + + size = '' + elm.style.fontSize; + + for (var i=0; i 0) + selectElm.setAttribute('cssImported', 'true'); + } + }, + + _setCookie : function(name, value, expires, path, domain, secure) { + var curCookie = name + "=" + escape(value) + + ((expires) ? "; expires=" + expires.toGMTString() : "") + + ((path) ? "; path=" + escape(path) : "") + + ((domain) ? "; domain=" + domain : "") + + ((secure) ? "; secure" : ""); + + document.cookie = curCookie; + }, + + _getCookie : function(name) { + var dc = document.cookie; + var prefix = name + "="; + var begin = dc.indexOf("; " + prefix); + + if (begin == -1) { + begin = dc.indexOf(prefix); + + if (begin != 0) + return null; + } else + begin += 2; + + var end = document.cookie.indexOf(";", begin); + + if (end == -1) + end = dc.length; + + return unescape(dc.substring(begin + prefix.length, end)); + }, + + _resizeTo : function(inst, w, h, set_w) { + var editorContainer = document.getElementById(inst.editorId + '_parent'); + var tableElm = editorContainer.firstChild; + var iframe = inst.iframeElement; + + if (w == null || w == "null") { + set_w = false; + w = 0; + } + + if (h == null || h == "null") + return; + + w = parseInt(w); + h = parseInt(h); + + if (tinyMCE.isGecko) { + w += 2; + h += 2; + } + + var dx = w - tableElm.clientWidth; + var dy = h - tableElm.clientHeight; + + w = w < 1 ? 30 : w; + h = h < 1 ? 30 : h; + + if (set_w) + tableElm.style.width = w + "px"; + + tableElm.style.height = h + "px"; + + iw = iframe.clientWidth + dx; + ih = iframe.clientHeight + dy; + + iw = iw < 1 ? 30 : iw; + ih = ih < 1 ? 30 : ih; + + if (tinyMCE.isGecko) { + iw -= 2; + ih -= 2; + } + + if (set_w) + iframe.style.width = iw + "px"; + + iframe.style.height = ih + "px"; + + // Is it to small, make it bigger again + if (set_w) { + var tableBodyElm = tableElm.firstChild; + var minIframeWidth = tableBodyElm.scrollWidth; + if (inst.iframeElement.clientWidth < minIframeWidth) { + dx = minIframeWidth - inst.iframeElement.clientWidth; + + inst.iframeElement.style.width = (iw + dx) + "px"; + } + } + + // Remove pesky table controls + inst.useCSS = false; + }, + + /** + * Handles resizing events. + */ + _resizeEventHandler : function(e) { + var resizer = TinyMCE_AdvancedTheme._resizer; + + // Do nothing + if (!resizer.resizing) + return; + + e = typeof(e) == "undefined" ? window.event : e; + + var dx = e.screenX - resizer.downX; + var dy = e.screenY - resizer.downY; + var resizeBox = resizer.resizeBox; + var editorId = resizer.editorId; + + switch (e.type) { + case "mousemove": + var w, h; + + w = resizer.width + dx; + h = resizer.height + dy; + + w = w < 1 ? 1 : w; + h = h < 1 ? 1 : h; + + if (resizer.horizontal) + resizeBox.style.width = w + "px"; + + resizeBox.style.height = h + "px"; + break; + + case "mouseup": + TinyMCE_AdvancedTheme._setResizing(e, editorId, false); + TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal); + + // Expire in a month + if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) { + var expires = new Date(); + expires.setTime(expires.getTime() + 3600000 * 24 * 30); + + // Set the cookies + TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires); + TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires); + } + break; + } + }, + + /** + * Starts/stops the editor resizing. + */ + _setResizing : function(e, editor_id, state) { + e = typeof(e) == "undefined" ? window.event : e; + + var resizer = TinyMCE_AdvancedTheme._resizer; + var editorContainer = document.getElementById(editor_id + '_parent'); + var editorArea = document.getElementById(editor_id + '_parent').firstChild; + var resizeBox = document.getElementById(editor_id + '_resize_box'); + var inst = tinyMCE.getInstanceById(editor_id); + + if (state) { + // Place box over editor area + var width = editorArea.clientWidth; + var height = editorArea.clientHeight; + + resizeBox.style.width = width + "px"; + resizeBox.style.height = height + "px"; + + resizer.iframeWidth = inst.iframeElement.clientWidth; + resizer.iframeHeight = inst.iframeElement.clientHeight; + + // Hide editor and show resize box + editorArea.style.display = "none"; + resizeBox.style.display = "block"; + + // Add event handlers, only once + if (!resizer.eventHandlers) { + if (tinyMCE.isMSIE) + tinyMCE.addEvent(document, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler); + else + tinyMCE.addEvent(window, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler); + + tinyMCE.addEvent(document, "mouseup", TinyMCE_AdvancedTheme._resizeEventHandler); + + resizer.eventHandlers = true; + } + + resizer.resizing = true; + resizer.downX = e.screenX; + resizer.downY = e.screenY; + resizer.width = parseInt(resizeBox.style.width); + resizer.height = parseInt(resizeBox.style.height); + resizer.editorId = editor_id; + resizer.resizeBox = resizeBox; + resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true); + } else { + resizer.resizing = false; + resizeBox.style.display = "none"; + editorArea.style.display = tinyMCE.isMSIE && !tinyMCE.isOpera ? "block" : "table"; + tinyMCE.execCommand('mceResetDesignMode'); + } + }, + + _getColorHTML : function(id, n, cm) { + var i, h, cl; + + h = ''; + cl = tinyMCE.getParam(n, TinyMCE_AdvancedTheme._defColors).split(','); + + h += ''; + for (i=0; i'; + + if ((i+1) % 8 == 0) + h += ''; + } + + h += '
'; + /* + h += 'More colors'; + */ + + return h; + }, + + _insertImage : function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) { + tinyMCE.execCommand('mceBeginUndoLevel'); + + if (src == "") + return; + + if (!tinyMCE.imgElement && tinyMCE.isSafari) { + var html = ""; + + html += '' + alt + ''; + + tinyMCE.execCommand("mceInsertContent", false, html); + } else { + if (!tinyMCE.imgElement && tinyMCE.selectedInstance) { + if (tinyMCE.isSafari) + tinyMCE.execCommand("mceInsertContent", false, ''); + else + tinyMCE.selectedInstance.contentDocument.execCommand("insertimage", false, tinyMCE.uniqueURL); + + tinyMCE.imgElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "img", "src", tinyMCE.uniqueURL); + } + } + + if (tinyMCE.imgElement) { + var needsRepaint = false; + var msrc = src; + + src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, tinyMCE.imgElement);"); + + if (tinyMCE.getParam('convert_urls')) + msrc = src; + + if (onmouseover && onmouseover != "") + onmouseover = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, tinyMCE.imgElement);") + "';"; + + if (onmouseout && onmouseout != "") + onmouseout = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, tinyMCE.imgElement);") + "';"; + + // Use alt as title if it's undefined + if (typeof(title) == "undefined") + title = alt; + + if (width != tinyMCE.imgElement.getAttribute("width") || height != tinyMCE.imgElement.getAttribute("height") || align != tinyMCE.imgElement.getAttribute("align")) + needsRepaint = true; + + tinyMCE.setAttrib(tinyMCE.imgElement, 'src', src); + tinyMCE.setAttrib(tinyMCE.imgElement, 'mce_src', msrc); + tinyMCE.setAttrib(tinyMCE.imgElement, 'alt', alt); + tinyMCE.setAttrib(tinyMCE.imgElement, 'title', title); + tinyMCE.setAttrib(tinyMCE.imgElement, 'align', align); + tinyMCE.setAttrib(tinyMCE.imgElement, 'border', border, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'hspace', hspace, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'vspace', vspace, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'width', width, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'height', height, true); + tinyMCE.setAttrib(tinyMCE.imgElement, 'onmouseover', onmouseover); + tinyMCE.setAttrib(tinyMCE.imgElement, 'onmouseout', onmouseout); + + // Fix for bug #989846 - Image resize bug + if (width && width != "") + tinyMCE.imgElement.style.pixelWidth = width; + + if (height && height != "") + tinyMCE.imgElement.style.pixelHeight = height; + + if (needsRepaint) + tinyMCE.selectedInstance.repaint(); + } + + tinyMCE.execCommand('mceEndUndoLevel'); + }, + + _insertLink : function(href, target, title, onclick, style_class) { + tinyMCE.execCommand('mceBeginUndoLevel'); + + if (tinyMCE.selectedInstance && tinyMCE.selectedElement && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") { + var doc = tinyMCE.selectedInstance.getDoc(); + var linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a"); + var newLink = false; + + if (!linkElement) { + linkElement = doc.createElement("a"); + newLink = true; + } + + var mhref = href; + var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);"); + mhref = tinyMCE.getParam('convert_urls') ? href : mhref; + + tinyMCE.setAttrib(linkElement, 'href', thref); + tinyMCE.setAttrib(linkElement, 'mce_href', mhref); + tinyMCE.setAttrib(linkElement, 'target', target); + tinyMCE.setAttrib(linkElement, 'title', title); + tinyMCE.setAttrib(linkElement, 'onclick', onclick); + tinyMCE.setAttrib(linkElement, 'class', style_class); + + if (newLink) { + linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true)); + tinyMCE.selectedElement.parentNode.replaceChild(linkElement, tinyMCE.selectedElement); + } + + return; + } + + if (!tinyMCE.linkElement && tinyMCE.selectedInstance) { + if (tinyMCE.isSafari) { + tinyMCE.execCommand("mceInsertContent", false, '' + tinyMCE.selectedInstance.selection.getSelectedHTML() + ''); + } else + tinyMCE.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL); + + tinyMCE.linkElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL); + + var elementArray = tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL); + + for (var i=0; i + + {$lang_insert_image_title} + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
+ x +
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/images/anchor.gif b/public/javascripts/tiny_mce/themes/advanced/images/anchor.gif new file mode 100755 index 0000000000000000000000000000000000000000..34ab71534b74e1f8eb01a822d2073cde4cd878cb GIT binary patch literal 171 zcwPak095}+Nk%w1VH5xq0K*0VDLrY1lc!y3io(UtI8lV8tiaOK*PC=h8YL;9lhufQV@{Qv1;Q^ z1CN9aCpLWeabVHPfD1Po9zQKUa3H|IK=i|h0tE$u0|yFDoLI16K|_GA>4F&r|37SK zt%&~c;lqUs7iP|!2{fF6mO$|*3nK%A0)q~S1M(9CTZ_Yl0uLRjeh=l;oofs*YXZ^guMbd&2qRRtiHb@Gu3*71|zhmdF-SRGb V_V3(xVE>`RySJS<>Fmg04FJ-%aohj^ literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/bold.gif b/public/javascripts/tiny_mce/themes/advanced/images/bold.gif new file mode 100755 index 0000000000000000000000000000000000000000..d6a9cc2cd4117526156fa29c06156ba5971823c4 GIT binary patch literal 76 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*&Mzw-23{>3a?E=Bm(Rqw7V Z4AWqey4jFcx$b3$*C(Ir-+DzDtN~+a79aos literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/bold_de_se.gif b/public/javascripts/tiny_mce/themes/advanced/images/bold_de_se.gif new file mode 100755 index 0000000000000000000000000000000000000000..9b129de25e916946792c89f08a7b30b2f9dc8b72 GIT binary patch literal 73 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*UAzw-23e#sdnZdC`i8W!&j Xl@)6cxHjEB<6*$FFxbIg;(p2 i&djr5P5jX#dNVh}IZO5VUiUMXvRj`2I%m$xU=0AHn;dum literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/bold_fr.gif b/public/javascripts/tiny_mce/themes/advanced/images/bold_fr.gif new file mode 100755 index 0000000000000000000000000000000000000000..2816454515a2b3d031ee1762f9308db99e9d3940 GIT binary patch literal 78 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*yKzw-23e%TquY+VNzx0~n3 bPUX;xQ|oohT$M9BQ$Xt4x8CPfj11NQWJeUX literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/bold_ru.gif b/public/javascripts/tiny_mce/themes/advanced/images/bold_ru.gif new file mode 100755 index 0000000000000000000000000000000000000000..e000d461c96188c26fe081920ba332593e5b60ca GIT binary patch literal 77 zcwTe&bhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@W&p`BFsbzPuRQ&he=&V4Auam85Vf} literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/bold_tw.gif b/public/javascripts/tiny_mce/themes/advanced/images/bold_tw.gif new file mode 100755 index 0000000000000000000000000000000000000000..82085432c622fb9b195d45480ce0c00f80d24027 GIT binary patch literal 207 zcwPa|05JbYNk%w1VH5xq0J9DNySuyH-QDi)?jj;0%*@PHRaKdpnGq2YcXxM0L_~;) zh%+-YW@csp00960{{R30A^8LW000gEEC2ui02BZe000Dh(8)=wy*N7}G;WM{HHkzh zs6t%9fi%d0HcQepm#{3&(I_#A0+$;m0FJ}}WxKp?w}cH!tRNB$k|H1#RxPhVL6BGg z09nkC_M1X4*#RtJD4)}o#(?mXbR9t%Fa-%dPzMPG0V6gC3@He52a9TEFU_>xB^?a&6>B~^ R#bfrS$(b43?=Ue~0{~-MC*lAA literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/bullist.gif b/public/javascripts/tiny_mce/themes/advanced/images/bullist.gif new file mode 100755 index 0000000000000000000000000000000000000000..6e19467c70e337bbfb2a3fe3eff1bc3acab0eaec GIT binary patch literal 108 zcwTe&bhEHb6k!ly*u>1h#Kfdz)l@%W&!*iMf|{-?85Jc}En;9`Q2fcl$iTqPpaWzx zfYdTD8&>SP^UvUv=WT(-MvhHP2^@CL3KjEB<5wG8q|kKzxu41Cu~c|H{*E`Gsc$hp{fYx2K(n G!5RQ}Dh{In literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/buttons.gif b/public/javascripts/tiny_mce/themes/advanced/images/buttons.gif new file mode 100755 index 0000000000000000000000000000000000000000..5ad99a7c4321610124833ba05bdf0df236f5d5a9 GIT binary patch literal 5662 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 MOZg;}3;>4z2Y$7PF8}}l literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/cancel_button_bg.gif b/public/javascripts/tiny_mce/themes/advanced/images/cancel_button_bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..4b4aeefcbbba8ed33383d99e3ad38a2b9683044e GIT binary patch literal 677 zcwPae0$Tk?Nk%w1VOjtc0K@)fLs#+_}=< z+2GjQ)C|ia%M}g|2-*$|4jAv++6)X8?f3NB2<-a^7%Bu**N)yjcm?$#=+|zcKYj)I zIjF!OVTE%a3KYO_;R1$_A3cH`Nit-~lPFRDiUhfmW6G2Q3W(6yv1UzC}*s)i?z8nAt58I(vAO9Tu2JqX_n^*5Vy?OEB-=jZ2zyA2} z=ksr%;9UfV@9G68;D7`cXyAbe9{8UkfB!Y;;DZoGDB*+@R%juG3|^?=h8%WSVGAIJ LDB_4Bh5!IN$Y@?j literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/charmap.gif b/public/javascripts/tiny_mce/themes/advanced/images/charmap.gif new file mode 100755 index 0000000000000000000000000000000000000000..3cdc4ac9134258a9a1a83b6afd5c7055bebbcbf9 GIT binary patch literal 245 zcwPbZ01E#{Nk%w1VH5xq0MrWrCQ7P`mf9kF)@pOQz`oR6i`Xtt!h(*@9+vKJ7UM8qsvB8x<;Dr zSg7=Nn%Hi7)&KwiA^8LW0018VEC2ui02BZe000GY;3tk`X`X1RuI#x~)x&X5LaDKL zBuP+gmjjC8P!LL;h9PruTqdW2VQ_jhm?kOJM8RlI0sywOkQfrBgdlP}Q6Q310n$b# v>y*a!grF>@BLxiv8314c77P(14Hy;xh9(V(3=AWV77>droSmMZC?Nnljc8>f literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/cleanup.gif b/public/javascripts/tiny_mce/themes/advanced/images/cleanup.gif new file mode 100755 index 0000000000000000000000000000000000000000..16491f6cfcf3e1123f08352c895f8010f791c469 GIT binary patch literal 256 zcwPYj0ssC-Nk%w1VH5xq0MrlwMm#2xdP3^ge4>(aXJcF2&#c0@g7@*TXJyAiI+Bx- z!osRT%E{EUw6tz+enw7G^6K)^$d=yS-J+Ue{{6y&f`-z%VxXFs!L^y{+>(HFVv>^L zOipLAk}~7mu>b%7A^8LW0018VEC2ui02BZe000Gj;3tk`X`X1RuBfCa3_CK)hB&I! z?6jS5DV>BNxhN371`1>FG$6!^gQF}JB8CHn;<-pFjYq{)@NCbANaf;iJjfX><#5Od z41@~dZSq94bpiqw6C4j!WCnJE77HB!h$k2WjE(>oEEpP%kC-wT1Ob;aBcK|jsHv(a GApkq`d~Wvu literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/close.gif b/public/javascripts/tiny_mce/themes/advanced/images/close.gif new file mode 100755 index 0000000000000000000000000000000000000000..679ca2aa47644793fc7096142233af6d18cfc9ac GIT binary patch literal 102 zcwTe&bhEHb6kykgyRDb3@HEuthi uXU;40To}M5{dDdNj=JDqn~K=yn?_%YeELo4K!S&k81soGMV&qj4Aubob0FOS literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/code.gif b/public/javascripts/tiny_mce/themes/advanced/images/code.gif new file mode 100755 index 0000000000000000000000000000000000000000..c5d5a67275c504e85e93da488aca85f4b2aa240d GIT binary patch literal 110 zcwTe&bhEHb6k!ly*u>1B=+vSZwA88iSX|!)1|*>PlZBCifrUW_!~v;gU^e#Hb?2YK zDbLk=cQ9^kR(FyRV%{v6zJMbkTF+t5I^Ewz77MSfoB4i?LT15fiT)EyiZXo|7_0&5 Cg&`pT literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/color.gif b/public/javascripts/tiny_mce/themes/advanced/images/color.gif new file mode 100755 index 0000000000000000000000000000000000000000..1ecd5743b64464068d80fe0c306375bc0f36a3f9 GIT binary patch literal 125 zcwTe&bhEHb6k!lxSi}GV|NsBLa^b|RS+g7*9Dr=F7=z+Z7DfgJRt6mq2c(vP*~wzp z9Utctp08V)UYxZ)DHzz35?MDRW1X_prZuwmzXRH=pKYwZWOr?gDO&r}E WQznT77&6ApIg)ei@KZGg25SKIc`;M~ literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/copy.gif b/public/javascripts/tiny_mce/themes/advanced/images/copy.gif new file mode 100755 index 0000000000000000000000000000000000000000..dc146865c5952aa48b82fc54677db621322465b9 GIT binary patch literal 263 zcwPYq0r>t$Nk%w1VH5xq0MrKnGD>2SrMb<|)0(p4GF`Q=%=coD-uwLia-!n0ztXb8 z>SB7D(cbRC&Eb``_99D}N_N7cveI&z@*+Zl!qxWT>hhwp!g8A0g0kXLg3_YG@}jE3 za+1=5r|rPV)BpegA^8LW0018VEC2ui02BZe000Gq;3tk`X`X1Rt}Ll2NgN5Sa@>ct z&})Jp0ne^?pcEK^!b{_DFiw_VrSR(z8m7&Gi9u+7k^;d~3fw9c#^BIo7zl(%`OrmN z*0>5KA}5&{3=It(2OS6o85w+K0F8|tI1CgD7JVrO2Z)Io8#2N9wc8v&jt5O5Ex Ns}n7+u(2f}06RB$bN>JU literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/custom_1.gif b/public/javascripts/tiny_mce/themes/advanced/images/custom_1.gif new file mode 100755 index 0000000000000000000000000000000000000000..4cbccdadf60dfccaf532fd56a567c47b131f80a8 GIT binary patch literal 76 zcwTe&bhEHb6k!lySjfQ8(7@2Zz`(%B2qYALvH&S21|1-q0VL1BBs-;l<>|Nli|1^K bVmxqW)~8vOa|LodDi=dm7`y6hp@H0TzRe{O`Us&m(k6|m7uZ$S-vl0 zv81W9YJ#%8z`z1cvH$=8A^8LW000jFEC2ui02BZe000DN@X1N5y*RH`2hYzS9F#DC z&mja;FrrU@G*7b_@UslKvE>g#z<@B2axx(c_%I2W2u49rARu4_N5ZktItZW!fI&z+ p0E8?Jvj7|jibsJV{#*tC#rVODXii?U706WgML@)pV literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/forecolor.gif b/public/javascripts/tiny_mce/themes/advanced/images/forecolor.gif new file mode 100755 index 0000000000000000000000000000000000000000..8b703616081fa7e20cb176d77a750ef15006d390 GIT binary patch literal 342 zcwTe&bhEHb6k!lyxXJ(m|NsAYh*&Ub?(TUjPtI9(XvV^wi`N`ox9#kjEvEvKCobQ3 zYW*CKPz+NcEpknb;7hBro2% z`NWPGonR%ljV$ z;UXX+>&Y$6EAK4XFDt_7&cP}y?93_5wq&-8!itrvRx2!Dvwp?84Qn=SUX`#T(viU$ E0CtUHQvd(} literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/help.gif b/public/javascripts/tiny_mce/themes/advanced/images/help.gif new file mode 100755 index 0000000000000000000000000000000000000000..51a1ee42073402ce787b60d151219ef7ce367615 GIT binary patch literal 295 zcwPY~0oeXWNk%w1VH5xq0Mrfu6i>3FyW3udp6K!Ub&;kbTH+f8tqUysbN$lQ^w;v!hW z!pq(wXY{hj_W%F@A^8LW0018VEC2ui02BZe000G~;3tk`X`X1Ru1KI+h83(|W>rq^ zR7RF&f!#zRnN$X{6T;$HBo?`WVllvQOo2)zp>TL49!J8HVVDe#NumhpbS0R9z=Ux~ zAoz}Cx7j!jCJ$n5dR`j5{)+~RJ$w}+Xh M?UBc{1V#pH0B+0Sa+3=zusNGZfNrz9ht9 i9nSdU){UIHY6f=qw$={!=Hi}e$^HowCkY8MSOWl@;6e`o literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/indent.gif b/public/javascripts/tiny_mce/themes/advanced/images/indent.gif new file mode 100755 index 0000000000000000000000000000000000000000..acd315bb16c47c2f1679bdf440b511497f9d633b GIT binary patch literal 112 zcwTe&bhEHb6k!ly*u=uX#KdGBHM?usrNEX)r!GH;tJ<(`*C_@D2F0H&j0_Cy3_3tI z14u0cvuVYyJO2z$?PS<1n6Z2JvC9SmQ@5M8XiRvvv%^`TxkW~zol}%`<%en~1 Q7%x9x_%qo`os+>D07#xF8UO$Q literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/insert_button_bg.gif b/public/javascripts/tiny_mce/themes/advanced/images/insert_button_bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..69c131ce2992df593b0f4299bca3b823819bfafa GIT binary patch literal 703 zcwPa&0zmyoNk%w1VOjtc0K@s=_xSkz{{8#>`}z9$_xShz{{8*^{QUg;`}_L%`1kks_WJqx{r&y?{QUd-`}+F& z`T6KpoHUDH@N+q;kn@I-kkc5K66DuS_Z6KrDKY7RyI09*;fWvU%-gtB;niQErU0 zm*isj!{r@5Xn}%*gn@BrfQ5mHij9PfUyfe}2OBRWtq`cJq8+WUnh>9$sjjjey0H)tuAaQc9f1|Fwgs1#2OS*J)Y8+b*w@wD)!H1| z*x};Wufcfgl`*#qaLw)i7 z zoH>KW+zFGYhMgLD9zY-h0fGes24t9!p{j-j6DCB>;GpUR4OAyM=(>QbRjLa#3_uGO z>HrN@Gf0g)AZ^&Gar5dmTXybOr%e$Eh>L-6)xsGhB#tWqL*v4b9V>pE7=z`>iZc|> ztl2VQ$DKVp7OfcZVa0#}IK>dbvVaB+6ueeo*>VKfu`$SQfI)y|-o6|7?%lifYXPr$ z!>-Mob%f^%8bpZhntE^Fvsq(UkUGIr1<%7n7f-%?_yFe9t6xtZ{rU9?5{QT&pnm=7 z5zyOrUtfX!=lcb?pMU?kmmhlI6)505fd}4aAAtcXfPj1e&?n%97-p#9h8%WyVSMw& lC*p`CmT2OMD5j|5iYbQ3;)^iGD5Huk)M(?4INlfn06R=DYYYGY literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/italic.gif b/public/javascripts/tiny_mce/themes/advanced/images/italic.gif new file mode 100755 index 0000000000000000000000000000000000000000..8bb330bd0bbf61fdb5ce86388ecbeae16465bc17 GIT binary patch literal 79 zcwTe&bhEHb6k!lySjfl#1T8Hs)z#IEjEssuS%3n}3_2iDkURsE!kqq_+b+wcJF`jEB<5wG8q|kK!gZ`FaraVVo(3d({K5uXIu`5a6TsH a;#+zDYvZ#Uy^qv#6FHB6^105+U=0A})fi&{ literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/italic_ru.gif b/public/javascripts/tiny_mce/themes/advanced/images/italic_ru.gif new file mode 100755 index 0000000000000000000000000000000000000000..a2bb69a725e823b8e671f0640098c4fa80939b2f GIT binary patch literal 78 zcwTe&bhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@W&p`BFsb(RuRQ&hf3e8|rl>@| g-;s5$k$uy}dmH1H=FS{~1UDia%Kx85jf@bU+-CoeZq~3Mzdmne#HN^t7sMoHaM3 zKeDON5$Z4EYhX`qtk99-JldR4#mcjY<*+8l94Yoj UgwLW=vT`Q(s%`JMrCAxQ0qpY;qW}N^ literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/justifyright.gif b/public/javascripts/tiny_mce/themes/advanced/images/justifyright.gif new file mode 100755 index 0000000000000000000000000000000000000000..e4cea971489cf2526bd45b5044e6d3435741f830 GIT binary patch literal 70 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz$Dw#zw-23e&HEgu66Wp{rQ%^ UM8cwz_vB2umD}FE7Gtmm0QJ%n+yDRo literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/link.gif b/public/javascripts/tiny_mce/themes/advanced/images/link.gif new file mode 100755 index 0000000000000000000000000000000000000000..1accf426260eabe2f3113bab599ee26991407576 GIT binary patch literal 175 zcwPao08sx&Nk%w1VH5xq0K)|U7cWe7jH1WO&q7mgq_fHP{QhovkA|48(BJg3yUmlM zwNqn#%+lYo$Ksc#!~g&QA^8LW000jFEC2ui02BZe000DB@X1N5y*TU5yZ;lDIEo`Y zBB>;nh!jN=5Xl<{ELAJRLi`OvPeCwL9EE`(0V^O727v-Gs1O*6fC9h;473EtqJph4 d4hzK!aZXzV=z)RofG^|jEB<5wG8q|kKzxu40~1#dfBJzLcf(v(F)&yI02q@C APXGV_ literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/newdocument.gif b/public/javascripts/tiny_mce/themes/advanced/images/newdocument.gif new file mode 100755 index 0000000000000000000000000000000000000000..a9d293842354bade04fc9607e55763fd0ea9efec GIT binary patch literal 170 zcwPaj09F4-Nk%w1VH5xq0K*0VGD>2SqO#J~;-aN z((?HJ(%tf+t-`|0-T(jqA^8LW000jFEC2ui02BZe000D6@X1N5y*TTfdRNNeY>8o> z4KQZPc^-wzx@G{}*+AEJzAuCxrm-U+gcqV~fj9y(hozB$v;>w-LA7!<0TB$xmeMs$ Y1>z^>8fd%Q>Wl40uW#=7ygmW|J7pwMu>b%7 literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/numlist.gif b/public/javascripts/tiny_mce/themes/advanced/images/numlist.gif new file mode 100755 index 0000000000000000000000000000000000000000..a2683522f4fbca7c59cdce63c7ac20211e006f49 GIT binary patch literal 111 zcwTe&bhEHb6k!ly*u=`f#KdG1Icv?%i(Ywq+h(1*bmK)(&22$|NLMcr)@lr3G4b21>PvGV9&5-I=QIi%&s}{E7Q0w PIrj2oy~qv|Vz34P1?eX! literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/opacity.png b/public/javascripts/tiny_mce/themes/advanced/images/opacity.png new file mode 100755 index 0000000000000000000000000000000000000000..b4217cb212926ce7abfde5e045380e3f6a5d54b7 GIT binary patch literal 147 zcwXxa@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOS+@4BLl_jZKS5jZLdL qklCGA#xkX{UyXMU`oN>#hy=Lc( O>hK6Evh-wNum%A9#3rEt literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/paste.gif b/public/javascripts/tiny_mce/themes/advanced/images/paste.gif new file mode 100755 index 0000000000000000000000000000000000000000..1b45000a0140b8f9e04c933154c915f4322d7533 GIT binary patch literal 286 zcwPY>0pb2fNk%w1VH5xq0Mr}+LNg;3tk`X`X1Rt{>*It?NM0VL6(E zVp#@75XZ#A7$__!UdC~NbOwn>K!P;!f|hLd!H_&o5ubBI-bl_Ku=A;)xD5t@Ks^{# z+MN7ifk2od9Tj&Q6dVnQ7YGCeB^rSW3L6F-dlv)<1qEp%4jqtY1`CG`6a;PnBn}E^ kX95eB1O$f^sHqkY9smLtZoQ`}2mr#v!!X9j$Rr^EJMbBDr~m)} literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/redo.gif b/public/javascripts/tiny_mce/themes/advanced/images/redo.gif new file mode 100755 index 0000000000000000000000000000000000000000..3af90697f0b74d0b6b07b585614a6dc67ff87f1d GIT binary patch literal 169 zcwPai09OA;Nk%w1VH5xq0K*FaEl-kjqwqa)*O$8QUUsNeit)O{)H!9gj;!cSf8=SD z@4U+CH(H=qeZQ%{>Hq)$A^8LW000jFEC2ui02BZe000D5@X1N5y*TU5@mkK(Nsfb@ zh`52taWqPx3Yb$cP21Nib_4)BqDn)z literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/removeformat.gif b/public/javascripts/tiny_mce/themes/advanced/images/removeformat.gif new file mode 100755 index 0000000000000000000000000000000000000000..0fa3cb79734b6ddadaded7a30dbbab4cdf7ee11a GIT binary patch literal 168 zcwPah09XG3d^!9RvqL!@E;^*>mjX*~6o0ZXGB7YP=m6OaAbAERt|_b&SD$^K#C1@F G!5RSXJ`hL% literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/spacer.gif b/public/javascripts/tiny_mce/themes/advanced/images/spacer.gif new file mode 100755 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncwTe&bhEHbWMp7un7{x9ia%KxMS!#phy#*gU}AD%WUvMRb)f_x literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/statusbar_resize.gif b/public/javascripts/tiny_mce/themes/advanced/images/statusbar_resize.gif new file mode 100755 index 0000000000000000000000000000000000000000..af89d803f8f0eeb965d9443473d5be009641cacf GIT binary patch literal 79 zcwTe&bhEHbX*~6o0ZXGB7YP=m6OaAbAERg(>|jPrv0~%%#ha d_MXKm)lqT2YSDtso)?w9Z@gz^T^C`n1_07v8bkm9 literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/strikethrough.gif b/public/javascripts/tiny_mce/themes/advanced/images/strikethrough.gif new file mode 100755 index 0000000000000000000000000000000000000000..3264635918e2237257811a745f3a7e31b4369432 GIT binary patch literal 83 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*jFzw-23{>5`RB^ury^=8j) h^eUTr??>*V8C&%_D;C}?e9svC>)iK$`!yICtN}048)X0h literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/sub.gif b/public/javascripts/tiny_mce/themes/advanced/images/sub.gif new file mode 100755 index 0000000000000000000000000000000000000000..4d7ce30ff9147412d24dafd5ebeef67479edfa58 GIT binary patch literal 148 zcwTe&bhEHb6k!lyILyhw%*<>Q)HHe0gtl3SJX}2%FIo^(b}BP7-N@8v{qD<7Nz0X_ zl!BTbZCbxRC@hG9fkE*n3nK#qKZ6dC%>XikfyME|Nzc`LEnc79{r^g#Nzh}R7)J|V zX9lNm3qGd$rrH|42gm2Mtqu5LE78W7#;D=Z#o+10Smh%e+N>1twrc+a9~K5{0GD(# AWdHyG literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/sup.gif b/public/javascripts/tiny_mce/themes/advanced/images/sup.gif new file mode 100755 index 0000000000000000000000000000000000000000..a7145e019a92a53ba6831d7da62c67419bb3ae03 GIT binary patch literal 147 zcwTe&bhEHb6k!lyILyMp%*;G_(uCD3R~Q8~y?XxG&cSZ|?#n@Sx15reM}&tP85tE7 z6}8Peq$H&jRCI`efkE*n3nK#qKZ6dC%>XikfyLp&Nzc`LEnc7fZNvUJkj=)iK!0SpY*0G3P}*Z=?k literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/underline_es.gif b/public/javascripts/tiny_mce/themes/advanced/images/underline_es.gif new file mode 100755 index 0000000000000000000000000000000000000000..551d9148d302c5f58b3b20d2c6a642450889a7ef GIT binary patch literal 79 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*mGzw-23e(4zsAr}6}u9vvi dPIT?{=$xyxd19dGtWDy_KKDM~70ke34FHj_7K8u* literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/underline_fr.gif b/public/javascripts/tiny_mce/themes/advanced/images/underline_fr.gif new file mode 100755 index 0000000000000000000000000000000000000000..551d9148d302c5f58b3b20d2c6a642450889a7ef GIT binary patch literal 79 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*mGzw-23e(4zsAr}6}u9vvi dPIT?{=$xyxd19dGtWDy_KKDM~70ke34FHj_7K8u* literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/underline_ru.gif b/public/javascripts/tiny_mce/themes/advanced/images/underline_ru.gif new file mode 100755 index 0000000000000000000000000000000000000000..b78e2a498fb9406ef378d7c543756db552d87cba GIT binary patch literal 77 zcwTe&bhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@W&p`BFsbzPuRQ&he=&b6$oQ-^4DvkU-JNSuB@*WkdRx^dDpvoXMfpGVe^t0s*%M50L^JPNgOW9=DY{ zwRUPR{VJ=i!y~Yn|5a^3pX^@$7R;GXz&U2_VU>FP2yDM T6q-JRmwm<@?$-GliVW5OQO`~G literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/undo.gif b/public/javascripts/tiny_mce/themes/advanced/images/undo.gif new file mode 100755 index 0000000000000000000000000000000000000000..520796d69defa118055d191eec33cc67f7551710 GIT binary patch literal 175 zcwPao08sx&Nk%w1VH5xq0K*FaI$fTWtk6Go+_}Zyr?=K#e#T#ZwX4DHa-Hu#XSz{; z-OtzKVv^{Tv+z=g@&Et;A^8LW000jFEC2ui02BZe000DB@X1N5y*TU5^*Z3vJx60U zVAe<_A|#2DUTDd{g#kDRhWrRvKmt&#E(`|)VHiweM~gz>Krlp-Snncu!2ps)!r>e} d2m*##Qg9H=3xcDt9yk2euEN*a>RflBvc=VMi?aIs{*Scsi=V=*#PZ+j z{;astf|jzv(Biz+@&Et;A^8LW000jFEC2ui02BZe000Dg@X1N5y*TU5Y5N}`E=ypZ zo?#$r>naM6uI>xVQ-d%k;xmkbaDbB#Q~{NMWoQ&&iQ?mEND2guCgGWgQWh%TE;t;R zrC?g~sYnb2jsrT}bhh1bIVEWT3JYd|XL~9PPy-4A2LldqQhZ!)ii>%V0GF7VnjM^- Io)i%PJHdZeUH||9 literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/xp/tab_bg.gif b/public/javascripts/tiny_mce/themes/advanced/images/xp/tab_bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..897a01f2baea1ae5f61f642f508c27f356b35260 GIT binary patch literal 694 zcwPav0!jTxNk%w1VUPh50K@Fo9O z^8Eb#`uh6u@89F;?DO;Q@$v2O@aq2l{`U6r`uh3s@ay>a_VV)W^z`ua^X~Tc^Y!)d z@$u}Dr?mh7{{R30A^8LV00000EC2ui0FVI^000I5U_%&PX`X1Ru59bRa4gSsZQppV z?|kpu1Vq9^EE3jl(HgoTEOh>41ejE#aB*8r|OC z;Njxq>Ry;kxw7TUm@{kM z%(=7Y&!9t#9!C>oFt6t5TbcX>0AjqCgySDAyxO3~?&AYen-@t=y!-i+yC*K5ef#nAwj*aBzkGe++J%)n_rHGi z_~ZNgpFh5P|L(<$r}sa8c>VI(gJ+NLe*5z2!~0iHAKiNQ_Sx$f58u3gI&t|H25dm_ zCkvR?0TCcO8Cca8IOw!CGPnzQ%rHqj(`tJy#$Vvtlc~*LXPj1$P)rgL=~3;>Y-3=s F1^~o$RVDxc literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif b/public/javascripts/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif new file mode 100755 index 0000000000000000000000000000000000000000..9dc8abe1a4f20643367ea9548fa2d93be7f0fb0b GIT binary patch literal 428 zcwPal0aN}*Nk%w1VJrbC0J8u9k(-?1#*X>8IO~@#-Jw(NpE2?8-}$*X|HwS%i!A@g zJpcdy{QUj^0000000000A^8LV00000EC2ui04xD0000F4(1ekyy*TU5yZ>M)j$~<` zXsV(?aUgIk&vb3yc&_h!@BhG{a7Zi;2?B+3$!t2G(5Q4uty-_xtai)odcR%(V@xia z&uH^v&2GEj@VIuMl4*~XmY0~BntqX! zo@AS$qNAjxdYzx1rmL*2u8ydwlCQM2wzqGwvV^$3zQ3WmyOhAi#>ard!)M6N&d+hm z%Vp5j*2mJ*W7pi>w%OX=;^U>@)8y#sm*(2-?(gvN^7Hid)9m*7`uqI-{{IZ{0USuM zpuvOl1R`9>u%W|(3Li?GNU@@fG5cC(oZi'; + html += '' + tinyMCE.getLang('lang_author') + ''; + html += '' + tinyMCE.getLang('lang_version') + ''; + html += ''; + html += ''; + html += ''; + + for (var i=0; i' + info.longname + ''; + else + html += '' + info.longname + ''; + + if (info.authorurl != null && info.authorurl != '') + html += '' + info.author + ''; + else + html += '' + info.author + ''; + + html += '' + info.version + ''; + html += ''; + } + + html += ''; + html += ''; + + tcont.innerHTML = html; +} + +function getPluginInfo(name) { + if (tinyMCE.plugins[name].getInfo) + return tinyMCE.plugins[name].getInfo(); + + return { + longname : name, + authorurl : '', + infourl : '', + author : '--', + version : '--' + }; +} + +function insertHelpIFrame() { + var html = ''; + + document.getElementById('iframecontainer').innerHTML = html; + + html = ''; + html += 'Got Moxie? '; + html += 'Hosted By Sourceforge '; + html += 'Also on freshmeat '; + + document.getElementById('buttoncontainer').innerHTML = html; +} diff --git a/public/javascripts/tiny_mce/themes/advanced/jscripts/anchor.js b/public/javascripts/tiny_mce/themes/advanced/jscripts/anchor.js new file mode 100755 index 0000000..e7c1c62 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/jscripts/anchor.js @@ -0,0 +1,74 @@ +var action, element; + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name"); + var img = inst.getFocusElement(); + action = 'insert'; + + if (anchor != null) { + element = anchor; + action = "update"; + } + + if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") { + element = img; + action = "update"; + } + + if (action == "update") + document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name"); + + document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); +} + +function insertAnchor() { + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var name = document.forms[0].anchorName.value, e; + + tinyMCEPopup.execCommand("mceBeginUndoLevel"); + + if (action == "update") { + if (element.nodeName == "IMG") + element.setAttribute("title", name); + else + element.setAttribute("name", name); + } else { + var rng = inst.getRng(); + + if (rng.collapse) + rng.collapse(false); + + name = name.replace(/&/g, '&'); + name = name.replace(/\"/g, '"'); + name = name.replace(//g, '>'); + + // Fix for bug #1447335 + if (tinyMCE.isGecko) + html = ''; + else + html = ''; + + tinyMCEPopup.execCommand("mceInsertContent", false, html); + + // Fix for bug #1447335 force cursor after the anchor element + if (tinyMCE.isGecko) { + e = inst.getDoc().getElementById('mceNewAnchor'); + + if (e) { + inst.selection.selectNode(e, true, false, false); + e.removeAttribute('id'); + } + } + + tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + + tinyMCE.triggerNodeChange(); + tinyMCEPopup.close(); +} diff --git a/public/javascripts/tiny_mce/themes/advanced/jscripts/charmap.js b/public/javascripts/tiny_mce/themes/advanced/jscripts/charmap.js new file mode 100755 index 0000000..eaa6a94 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/jscripts/charmap.js @@ -0,0 +1,326 @@ +function init() { + tinyMCEPopup.resizeToInnerSize(); +} + +var charmap = new Array(); + +// for mor details please see w3c.org +// now here is the complete list ;) + +charmap = [ + [' ', ' ', true, 'no-break space'], + ['&', '&', true, 'ampersand'], + ['"', '"', true, 'quotation mark'], +// finance + ['¢', '¢', true, 'cent sign'], + ['€', '€', true, 'euro sign'], + ['£', '£', true, 'pound sign'], + ['¥', '¥', true, 'yen sign'], +// signs + ['©', '©', true, 'copyright sign'], + ['®', '®', true, 'registered sign'], + ['™', '™', true, 'trade mark sign'], + ['‰', '‰', true, 'per mille sign'], + ['µ', 'µ', true, 'micro sign'], + ['·', '·', true, 'middle dot'], + ['•', '•', true, 'bullet'], + ['…', '…', true, 'three dot leader'], + ['′', '′', true, 'minutes / feet'], + ['″', '″', true, 'seconds / inches'], + ['§', '§', true, 'section sign'], + ['¶', '¶', true, 'paragraph sign'], + ['ß', 'ß', true, 'sharp s / ess-zed'], +// quotations + ['‹', '‹', true, 'single left-pointing angle quotation mark'], + ['›', '›', true, 'single right-pointing angle quotation mark'], + ['«', '«', true, 'left pointing guillemet'], + ['»', '»', true, 'right pointing guillemet'], + ['‘', '‘', true, 'left single quotation mark'], + ['’', '’', true, 'right single quotation mark'], + ['“', '“', true, 'left double quotation mark'], + ['”', '”', true, 'right double quotation mark'], + ['‚', '‚', true, 'single low-9 quotation mark'], + ['„', '„', true, 'double low-9 quotation mark'], + ['<', '<', true, 'less-than sign'], + ['>', '>', true, 'greater-than sign'], + ['≤', '≤', true, 'less-than or equal to'], + ['≥', '≥', true, 'greater-than or equal to'], + ['–', '–', true, 'en dash'], + ['—', '—', true, 'em dash'], + ['¯', '¯', true, 'macron'], + ['‾', '‾', true, 'overline'], + ['¤', '¤', true, 'currency sign'], + ['¦', '¦', true, 'broken bar'], + ['¨', '¨', true, 'diaeresis'], + ['¡', '¡', true, 'inverted exclamation mark'], + ['¿', '¿', true, 'turned question mark'], + ['ˆ', 'ˆ', true, 'circumflex accent'], + ['˜', '˜', true, 'small tilde'], + ['°', '°', true, 'degree sign'], + ['−', '−', true, 'minus sign'], + ['±', '±', true, 'plus-minus sign'], + ['÷', '÷', true, 'division sign'], + ['⁄', '⁄', true, 'fraction slash'], + ['×', '×', true, 'multiplication sign'], + ['¹', '¹', true, 'superscript one'], + ['²', '²', true, 'superscript two'], + ['³', '³', true, 'superscript three'], + ['¼', '¼', true, 'fraction one quarter'], + ['½', '½', true, 'fraction one half'], + ['¾', '¾', true, 'fraction three quarters'], +// math / logical + ['ƒ', 'ƒ', true, 'function / florin'], + ['∫', '∫', true, 'integral'], + ['∑', '∑', true, 'n-ary sumation'], + ['∞', '∞', true, 'infinity'], + ['√', '√', true, 'square root'], + ['∼', '∼', false,'similar to'], + ['≅', '≅', false,'approximately equal to'], + ['≈', '≈', true, 'almost equal to'], + ['≠', '≠', true, 'not equal to'], + ['≡', '≡', true, 'identical to'], + ['∈', '∈', false,'element of'], + ['∉', '∉', false,'not an element of'], + ['∋', '∋', false,'contains as member'], + ['∏', '∏', true, 'n-ary product'], + ['∧', '∧', false,'logical and'], + ['∨', '∨', false,'logical or'], + ['¬', '¬', true, 'not sign'], + ['∩', '∩', true, 'intersection'], + ['∪', '∪', false,'union'], + ['∂', '∂', true, 'partial differential'], + ['∀', '∀', false,'for all'], + ['∃', '∃', false,'there exists'], + ['∅', '∅', false,'diameter'], + ['∇', '∇', false,'backward difference'], + ['∗', '∗', false,'asterisk operator'], + ['∝', '∝', false,'proportional to'], + ['∠', '∠', false,'angle'], +// undefined + ['´', '´', true, 'acute accent'], + ['¸', '¸', true, 'cedilla'], + ['ª', 'ª', true, 'feminine ordinal indicator'], + ['º', 'º', true, 'masculine ordinal indicator'], + ['†', '†', true, 'dagger'], + ['‡', '‡', true, 'double dagger'], +// alphabetical special chars + ['À', 'À', true, 'A - grave'], + ['Á', 'Á', true, 'A - acute'], + ['Â', 'Â', true, 'A - circumflex'], + ['Ã', 'Ã', true, 'A - tilde'], + ['Ä', 'Ä', true, 'A - diaeresis'], + ['Å', 'Å', true, 'A - ring above'], + ['Æ', 'Æ', true, 'ligature AE'], + ['Ç', 'Ç', true, 'C - cedilla'], + ['È', 'È', true, 'E - grave'], + ['É', 'É', true, 'E - acute'], + ['Ê', 'Ê', true, 'E - circumflex'], + ['Ë', 'Ë', true, 'E - diaeresis'], + ['Ì', 'Ì', true, 'I - grave'], + ['Í', 'Í', true, 'I - acute'], + ['Î', 'Î', true, 'I - circumflex'], + ['Ï', 'Ï', true, 'I - diaeresis'], + ['Ð', 'Ð', true, 'ETH'], + ['Ñ', 'Ñ', true, 'N - tilde'], + ['Ò', 'Ò', true, 'O - grave'], + ['Ó', 'Ó', true, 'O - acute'], + ['Ô', 'Ô', true, 'O - circumflex'], + ['Õ', 'Õ', true, 'O - tilde'], + ['Ö', 'Ö', true, 'O - diaeresis'], + ['Ø', 'Ø', true, 'O - slash'], + ['Œ', 'Œ', true, 'ligature OE'], + ['Š', 'Š', true, 'S - caron'], + ['Ù', 'Ù', true, 'U - grave'], + ['Ú', 'Ú', true, 'U - acute'], + ['Û', 'Û', true, 'U - circumflex'], + ['Ü', 'Ü', true, 'U - diaeresis'], + ['Ý', 'Ý', true, 'Y - acute'], + ['Ÿ', 'Ÿ', true, 'Y - diaeresis'], + ['Þ', 'Þ', true, 'THORN'], + ['à', 'à', true, 'a - grave'], + ['á', 'á', true, 'a - acute'], + ['â', 'â', true, 'a - circumflex'], + ['ã', 'ã', true, 'a - tilde'], + ['ä', 'ä', true, 'a - diaeresis'], + ['å', 'å', true, 'a - ring above'], + ['æ', 'æ', true, 'ligature ae'], + ['ç', 'ç', true, 'c - cedilla'], + ['è', 'è', true, 'e - grave'], + ['é', 'é', true, 'e - acute'], + ['ê', 'ê', true, 'e - circumflex'], + ['ë', 'ë', true, 'e - diaeresis'], + ['ì', 'ì', true, 'i - grave'], + ['í', 'í', true, 'i - acute'], + ['î', 'î', true, 'i - circumflex'], + ['ï', 'ï', true, 'i - diaeresis'], + ['ð', 'ð', true, 'eth'], + ['ñ', 'ñ', true, 'n - tilde'], + ['ò', 'ò', true, 'o - grave'], + ['ó', 'ó', true, 'o - acute'], + ['ô', 'ô', true, 'o - circumflex'], + ['õ', 'õ', true, 'o - tilde'], + ['ö', 'ö', true, 'o - diaeresis'], + ['ø', 'ø', true, 'o slash'], + ['œ', 'œ', true, 'ligature oe'], + ['š', 'š', true, 's - caron'], + ['ù', 'ù', true, 'u - grave'], + ['ú', 'ú', true, 'u - acute'], + ['û', 'û', true, 'u - circumflex'], + ['ü', 'ü', true, 'u - diaeresis'], + ['ý', 'ý', true, 'y - acute'], + ['þ', 'þ', true, 'thorn'], + ['ÿ', 'ÿ', true, 'y - diaeresis'], + ['Α', 'Α', true, 'Alpha'], + ['Β', 'Β', true, 'Beta'], + ['Γ', 'Γ', true, 'Gamma'], + ['Δ', 'Δ', true, 'Delta'], + ['Ε', 'Ε', true, 'Epsilon'], + ['Ζ', 'Ζ', true, 'Zeta'], + ['Η', 'Η', true, 'Eta'], + ['Θ', 'Θ', true, 'Theta'], + ['Ι', 'Ι', true, 'Iota'], + ['Κ', 'Κ', true, 'Kappa'], + ['Λ', 'Λ', true, 'Lambda'], + ['Μ', 'Μ', true, 'Mu'], + ['Ν', 'Ν', true, 'Nu'], + ['Ξ', 'Ξ', true, 'Xi'], + ['Ο', 'Ο', true, 'Omicron'], + ['Π', 'Π', true, 'Pi'], + ['Ρ', 'Ρ', true, 'Rho'], + ['Σ', 'Σ', true, 'Sigma'], + ['Τ', 'Τ', true, 'Tau'], + ['Υ', 'Υ', true, 'Upsilon'], + ['Φ', 'Φ', true, 'Phi'], + ['Χ', 'Χ', true, 'Chi'], + ['Ψ', 'Ψ', true, 'Psi'], + ['Ω', 'Ω', true, 'Omega'], + ['α', 'α', true, 'alpha'], + ['β', 'β', true, 'beta'], + ['γ', 'γ', true, 'gamma'], + ['δ', 'δ', true, 'delta'], + ['ε', 'ε', true, 'epsilon'], + ['ζ', 'ζ', true, 'zeta'], + ['η', 'η', true, 'eta'], + ['θ', 'θ', true, 'theta'], + ['ι', 'ι', true, 'iota'], + ['κ', 'κ', true, 'kappa'], + ['λ', 'λ', true, 'lambda'], + ['μ', 'μ', true, 'mu'], + ['ν', 'ν', true, 'nu'], + ['ξ', 'ξ', true, 'xi'], + ['ο', 'ο', true, 'omicron'], + ['π', 'π', true, 'pi'], + ['ρ', 'ρ', true, 'rho'], + ['ς', 'ς', true, 'final sigma'], + ['σ', 'σ', true, 'sigma'], + ['τ', 'τ', true, 'tau'], + ['υ', 'υ', true, 'upsilon'], + ['φ', 'φ', true, 'phi'], + ['χ', 'χ', true, 'chi'], + ['ψ', 'ψ', true, 'psi'], + ['ω', 'ω', true, 'omega'], +// symbols + ['ℵ', 'ℵ', false,'alef symbol'], + ['ϖ', 'ϖ', false,'pi symbol'], + ['ℜ', 'ℜ', false,'real part symbol'], + ['ϑ','ϑ', false,'theta symbol'], + ['ϒ', 'ϒ', false,'upsilon - hook symbol'], + ['℘', '℘', false,'Weierstrass p'], + ['ℑ', 'ℑ', false,'imaginary part'], +// arrows + ['←', '←', true, 'leftwards arrow'], + ['↑', '↑', true, 'upwards arrow'], + ['→', '→', true, 'rightwards arrow'], + ['↓', '↓', true, 'downwards arrow'], + ['↔', '↔', true, 'left right arrow'], + ['↵', '↵', false,'carriage return'], + ['⇐', '⇐', false,'leftwards double arrow'], + ['⇑', '⇑', false,'upwards double arrow'], + ['⇒', '⇒', false,'rightwards double arrow'], + ['⇓', '⇓', false,'downwards double arrow'], + ['⇔', '⇔', false,'left right double arrow'], + ['∴', '∴', false,'therefore'], + ['⊂', '⊂', false,'subset of'], + ['⊃', '⊃', false,'superset of'], + ['⊄', '⊄', false,'not a subset of'], + ['⊆', '⊆', false,'subset of or equal to'], + ['⊇', '⊇', false,'superset of or equal to'], + ['⊕', '⊕', false,'circled plus'], + ['⊗', '⊗', false,'circled times'], + ['⊥', '⊥', false,'perpendicular'], + ['⋅', '⋅', false,'dot operator'], + ['⌈', '⌈', false,'left ceiling'], + ['⌉', '⌉', false,'right ceiling'], + ['⌊', '⌊', false,'left floor'], + ['⌋', '⌋', false,'right floor'], + ['⟨', '〈', false,'left-pointing angle bracket'], + ['⟩', '〉', false,'right-pointing angle bracket'], + ['◊', '◊', true,'lozenge'], + ['♠', '♠', false,'black spade suit'], + ['♣', '♣', true, 'black club suit'], + ['♥', '♥', true, 'black heart suit'], + ['♦', '♦', true, 'black diamond suit'], + [' ', ' ', false,'en space'], + [' ', ' ', false,'em space'], + [' ', ' ', false,'thin space'], + ['‌', '‌', false,'zero width non-joiner'], + ['‍', '‍', false,'zero width joiner'], + ['‎', '‎', false,'left-to-right mark'], + ['‏', '‏', false,'right-to-left mark'], + ['­', '­', false,'soft hyphen'] +]; + +function renderCharMapHTML() { + var charsPerRow = 20, tdWidth=20, tdHeight=20; + var html = ''; + var cols=-1; + for (var i=0; i' + + charmap[i][1] + + ''; + if ((cols+1) % charsPerRow == 0) + html += ''; + } + } + if (cols % charsPerRow > 0) { + var padd = charsPerRow - (cols % charsPerRow); + for (var i=0; i '; + } + html += '
'; + document.write(html); +} + +function insertChar(chr) { + tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); + + // Refocus in window + if (tinyMCEPopup.isWindow) + window.focus(); + + tinyMCEPopup.close(); +} + +function previewChar(codeA, codeB, codeN) { + var elmA = document.getElementById('codeA'); + var elmB = document.getElementById('codeB'); + var elmV = document.getElementById('codeV'); + var elmN = document.getElementById('codeN'); + + if (codeA=='#160;') { + elmV.innerHTML = '__'; + } else { + elmV.innerHTML = '&' + codeA; + } + + elmB.innerHTML = '&' + codeA; + elmA.innerHTML = '&' + codeB; + elmN.innerHTML = codeN; +} diff --git a/public/javascripts/tiny_mce/themes/advanced/jscripts/color_picker.js b/public/javascripts/tiny_mce/themes/advanced/jscripts/color_picker.js new file mode 100755 index 0000000..68b5db2 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/jscripts/color_picker.js @@ -0,0 +1,108 @@ +function init() { + if (tinyMCE.isMSIE) + tinyMCEPopup.resizeToInnerSize(); +} + +function selectColor() { + var color = document.getElementById("selectedColorBox").value; + + tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color); + tinyMCEPopup.close(); +} + +function showColor(color) { + document.getElementById("selectedColor").style.backgroundColor = color; + document.getElementById("selectedColorBox").value = color; +} + +var colors = new Array( + "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", + "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099", + "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff", + "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033", + "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399", + "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff", + "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333", + "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399", + "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff", + "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633", + "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699", + "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff", + "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633", + "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999", + "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff", + "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933", + "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999", + "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff", + "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33", + "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99", + "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff", + "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33", + "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99", + "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff", + "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33", + "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99", + "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff" +); + +function convertRGBToHex(col) { + var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); + + var rgb = col.replace(re, "$1,$2,$3").split(','); + if (rgb.length == 3) { + r = parseInt(rgb[0]).toString(16); + g = parseInt(rgb[1]).toString(16); + b = parseInt(rgb[2]).toString(16); + + r = r.length == 1 ? '0' + r : r; + g = g.length == 1 ? '0' + g : g; + b = b.length == 1 ? '0' + b : b; + + return "#" + r + g + b; + } + + return col; +} + +function convertHexToRGB(col) { + if (col.indexOf('#') != -1) { + col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); + + r = parseInt(col.substring(0, 2), 16); + g = parseInt(col.substring(2, 4), 16); + b = parseInt(col.substring(4, 6), 16); + + return "rgb(" + r + "," + g + "," + b + ")"; + } + + return col; +} + +function renderColorMap() { + var html = ""; + var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color')); + + html += '' + + ''; + for (var i=0; i' + + '' + + '' + colors[i] +  ''; + if ((i+1) % 18 == 0) + html += ''; + } + html += '' + + '
' + + '' + + '' + + '
' + + '' + + '' + + '' + + '
' + + '
' + + '
' + + '
'; + + document.write(html); +} \ No newline at end of file diff --git a/public/javascripts/tiny_mce/themes/advanced/jscripts/image.js b/public/javascripts/tiny_mce/themes/advanced/jscripts/image.js new file mode 100755 index 0000000..a52bfad --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/jscripts/image.js @@ -0,0 +1,81 @@ +var url = tinyMCE.getParam("external_image_list_url"); +if (url != null) { + // Fix relative + if (url.charAt(0) != '/' && url.indexOf('://') == -1) + url = tinyMCE.documentBasePath + "/" + url; + + document.write(''); +} + +function insertImage() { + var src = document.forms[0].src.value; + var alt = document.forms[0].alt.value; + var border = document.forms[0].border.value; + var vspace = document.forms[0].vspace.value; + var hspace = document.forms[0].hspace.value; + var width = document.forms[0].width.value; + var height = document.forms[0].height.value; + var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value; + + tinyMCEPopup.restoreSelection(); + tinyMCE.themes['advanced']._insertImage(src, alt, border, hspace, vspace, width, height, align); + tinyMCEPopup.close(); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); + + var formObj = document.forms[0]; + + for (var i=0; i 0) { + for (var i=0; i'); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link'); + + // Handle file browser + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '180px'; + + var formObj = document.forms[0]; + + for (var i=0; i 0) { + var formObj = document.forms[0]; + + for (var i=0; i + + {$lang_insert_link_title} + + + + + + + +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/themes/advanced/source_editor.htm b/public/javascripts/tiny_mce/themes/advanced/source_editor.htm new file mode 100755 index 0000000..a8fb005 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/advanced/source_editor.htm @@ -0,0 +1,32 @@ + + + + {$lang_theme_code_title} + + + + + +
+
{$lang_theme_code_title}
+ +
+ +
+ +
+ + + +
+
+ +
+ +
+ +
+
+
+ + diff --git a/public/javascripts/tiny_mce/themes/simple/css/editor_content.css b/public/javascripts/tiny_mce/themes/simple/css/editor_content.css new file mode 100755 index 0000000..2506c80 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/simple/css/editor_content.css @@ -0,0 +1,25 @@ +body, td, pre { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +body { + background-color: #FFFFFF; +} + +.mceVisualAid { + border: 1px dashed #BBBBBB; +} + +/* MSIE specific */ + +* html body { + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} diff --git a/public/javascripts/tiny_mce/themes/simple/css/editor_popup.css b/public/javascripts/tiny_mce/themes/simple/css/editor_popup.css new file mode 100755 index 0000000..f29b04a --- /dev/null +++ b/public/javascripts/tiny_mce/themes/simple/css/editor_popup.css @@ -0,0 +1,41 @@ +body { + background-color: #F0F0EE; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} + +td { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; +} + +input { + background: #FFFFFF; + border: 1px solid #cccccc; +} + +td, input, select, textarea { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +input, select, textarea { + border: 1px solid #808080; +} + +.input_noborder { + border: 0; +} + +.title { + font-size: 12px; + font-weight: bold; +} \ No newline at end of file diff --git a/public/javascripts/tiny_mce/themes/simple/css/editor_ui.css b/public/javascripts/tiny_mce/themes/simple/css/editor_ui.css new file mode 100755 index 0000000..6f57768 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/simple/css/editor_ui.css @@ -0,0 +1,125 @@ +.mceSeparatorLine { + border: 0; + padding: 0; + margin-left: 4px; + margin-right: 2px; +} + +.mceSelectList { + font-family: "MS Sans Serif"; + font-size: 7pt; + font-weight: normal; + margin-top: 2px; +} + +.mceLabel, .mceLabelDisabled { + font-family: "MS Sans Serif"; + font-size: 9pt; +} + +.mceLabel { + color: #000000; +} + +.mceLabelDisabled { + cursor: text; + color: #999999; +} + +.mceEditor { + background: #F0F0EE; + border: 1px solid #cccccc; +} + +.mceEditorArea { + font-family: "MS Sans Serif"; + background: #FFFFFF; +} + +.mceToolbar { + background: #F0F0EE; + border-top: 1px solid #cccccc; + line-height: 1px; + font-size: 1px; + padding-bottom: 1px; +} + +.mceEditorIframe { + border: 0; +} + +/* Button CSS rules */ + +a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img { + width: 20px; + height: 20px; + cursor: default; + margin-top: 1px; + margin-left: 1px; +} + +a.mceButtonDisabled img { + border: 0 !important; +} + +a.mceButtonNormal img, a.mceButtonSelected img { + border: 1px solid #F0F0EE !important; +} + +a.mceButtonSelected img { + border: 1px solid #C0C0BB !important; +} + +a.mceButtonNormal img:hover, a.mceButtonSelected img:hover { + border: 1px solid #0A246A !important; + cursor: default; + background-color: #B6BDD2; +} + +a.mceButtonDisabled img { + -moz-opacity:0.3; + opacity: 0.3; + border: 1px solid #F0F0EE !important; + cursor: default; +} + +a.mceTiledButton img { + background-image: url('../images/buttons.gif'); + background-repeat: no-repeat; +} + +/* MSIE specific rules */ + +* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img { + border: 0px !important; + margin-top: 2px; + margin-bottom: 1px; +} + +* html a.mceButtonDisabled img { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + border: 0px !important; +} + +* html a.mceButtonDisabled { + border: 1px solid #F0F0EE !important; +} + +* html a.mceButtonNormal, * html a.mceButtonSelected { + border: 1px solid #F0F0EE; + cursor: default; +} + +* html a.mceButtonSelected { + border: 1px solid #C0C0BB; +} + +* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover { + border: 1px solid #0A246A; + cursor: default; + background-color: #B6BDD2; +} + +* html .mceSelectList { + margin-top: 2px; +} diff --git a/public/javascripts/tiny_mce/themes/simple/editor_template.js b/public/javascripts/tiny_mce/themes/simple/editor_template.js new file mode 100755 index 0000000..ef99fa2 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/simple/editor_template.js @@ -0,0 +1 @@ +var TinyMCE_SimpleTheme={_buttonMap:'bold,bullist,cleanup,italic,numlist,redo,strikethrough,underline,undo',getEditorTemplate:function(){var html='';html+='';html+='';html+='
';html+='IFRAME';html+='
';html+=tinyMCE.getButtonHTML('bold','lang_bold_desc','{$themeurl}/images/{$lang_bold_img}','Bold');html+=tinyMCE.getButtonHTML('italic','lang_italic_desc','{$themeurl}/images/{$lang_italic_img}','Italic');html+=tinyMCE.getButtonHTML('underline','lang_underline_desc','{$themeurl}/images/{$lang_underline_img}','Underline');html+=tinyMCE.getButtonHTML('strikethrough','lang_striketrough_desc','{$themeurl}/images/strikethrough.gif','Strikethrough');html+='';html+=tinyMCE.getButtonHTML('undo','lang_undo_desc','{$themeurl}/images/undo.gif','Undo');html+=tinyMCE.getButtonHTML('redo','lang_redo_desc','{$themeurl}/images/redo.gif','Redo');html+='';html+=tinyMCE.getButtonHTML('cleanup','lang_cleanup_desc','{$themeurl}/images/cleanup.gif','mceCleanup');html+='';html+=tinyMCE.getButtonHTML('bullist','lang_bullist_desc','{$themeurl}/images/bullist.gif','InsertUnorderedList');html+=tinyMCE.getButtonHTML('numlist','lang_numlist_desc','{$themeurl}/images/numlist.gif','InsertOrderedList');html+='
';return{delta_width:0,delta_height:20,html:html}},handleNodeChange:function(editor_id,node){tinyMCE.switchClass(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClass(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClass(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClass(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClass(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClass(editor_id+'_numlist','mceButtonNormal');do{switch(node.nodeName.toLowerCase()){case"b":case"strong":tinyMCE.switchClass(editor_id+'_bold','mceButtonSelected');break;case"i":case"em":tinyMCE.switchClass(editor_id+'_italic','mceButtonSelected');break;case"u":tinyMCE.switchClass(editor_id+'_underline','mceButtonSelected');break;case"strike":tinyMCE.switchClass(editor_id+'_strikethrough','mceButtonSelected');break;case"ul":tinyMCE.switchClass(editor_id+'_bullist','mceButtonSelected');break;case"ol":tinyMCE.switchClass(editor_id+'_numlist','mceButtonSelected');break}}while((node=node.parentNode)!=null)}};tinyMCE.addTheme("simple",TinyMCE_SimpleTheme);tinyMCE.addButtonMap(TinyMCE_SimpleTheme._buttonMap); \ No newline at end of file diff --git a/public/javascripts/tiny_mce/themes/simple/editor_template_src.js b/public/javascripts/tiny_mce/themes/simple/editor_template_src.js new file mode 100755 index 0000000..3734dc4 --- /dev/null +++ b/public/javascripts/tiny_mce/themes/simple/editor_template_src.js @@ -0,0 +1,84 @@ +/** + * $Id: editor_template_src.js 114 2006-10-17 09:29:32Z spocke $ + * + * @author Moxiecode + * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved. + */ + +var TinyMCE_SimpleTheme = { + // List of button ids in tile map + _buttonMap : 'bold,bullist,cleanup,italic,numlist,redo,strikethrough,underline,undo', + + getEditorTemplate : function() { + var html = ''; + + html += ''; + html += ''; + html += '
'; + html += 'IFRAME'; + html += '
'; + html += tinyMCE.getButtonHTML('bold', 'lang_bold_desc', '{$themeurl}/images/{$lang_bold_img}', 'Bold'); + html += tinyMCE.getButtonHTML('italic', 'lang_italic_desc', '{$themeurl}/images/{$lang_italic_img}', 'Italic'); + html += tinyMCE.getButtonHTML('underline', 'lang_underline_desc', '{$themeurl}/images/{$lang_underline_img}', 'Underline'); + html += tinyMCE.getButtonHTML('strikethrough', 'lang_striketrough_desc', '{$themeurl}/images/strikethrough.gif', 'Strikethrough'); + html += ''; + html += tinyMCE.getButtonHTML('undo', 'lang_undo_desc', '{$themeurl}/images/undo.gif', 'Undo'); + html += tinyMCE.getButtonHTML('redo', 'lang_redo_desc', '{$themeurl}/images/redo.gif', 'Redo'); + html += ''; + html += tinyMCE.getButtonHTML('cleanup', 'lang_cleanup_desc', '{$themeurl}/images/cleanup.gif', 'mceCleanup'); + html += ''; + html += tinyMCE.getButtonHTML('bullist', 'lang_bullist_desc', '{$themeurl}/images/bullist.gif', 'InsertUnorderedList'); + html += tinyMCE.getButtonHTML('numlist', 'lang_numlist_desc', '{$themeurl}/images/numlist.gif', 'InsertOrderedList'); + html += '
'; + + return { + delta_width : 0, + delta_height : 20, + html : html + }; + }, + + handleNodeChange : function(editor_id, node) { + // Reset old states + tinyMCE.switchClass(editor_id + '_bold', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_italic', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_underline', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonNormal'); + tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonNormal'); + + // Handle elements + do { + switch (node.nodeName.toLowerCase()) { + case "b": + case "strong": + tinyMCE.switchClass(editor_id + '_bold', 'mceButtonSelected'); + break; + + case "i": + case "em": + tinyMCE.switchClass(editor_id + '_italic', 'mceButtonSelected'); + break; + + case "u": + tinyMCE.switchClass(editor_id + '_underline', 'mceButtonSelected'); + break; + + case "strike": + tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonSelected'); + break; + + case "ul": + tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonSelected'); + break; + + case "ol": + tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonSelected'); + break; + } + } while ((node = node.parentNode) != null); + } +}; + +tinyMCE.addTheme("simple", TinyMCE_SimpleTheme); +tinyMCE.addButtonMap(TinyMCE_SimpleTheme._buttonMap); diff --git a/public/javascripts/tiny_mce/themes/simple/images/bold.gif b/public/javascripts/tiny_mce/themes/simple/images/bold.gif new file mode 100755 index 0000000000000000000000000000000000000000..d6a9cc2cd4117526156fa29c06156ba5971823c4 GIT binary patch literal 76 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*&Mzw-23{>3a?E=Bm(Rqw7V Z4AWqey4jFcx$b3$*C(Ir-+DzDtN~+a79aos literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/bold_de_se.gif b/public/javascripts/tiny_mce/themes/simple/images/bold_de_se.gif new file mode 100755 index 0000000000000000000000000000000000000000..9b129de25e916946792c89f08a7b30b2f9dc8b72 GIT binary patch literal 73 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*UAzw-23e#sdnZdC`i8W!&j Xl@)6cxH+8$Fz@Ye(g^_`QkwFK@W&p`BFsbzPuRQ&he=&V4Auam85Vf} literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/bold_tw.gif b/public/javascripts/tiny_mce/themes/simple/images/bold_tw.gif new file mode 100755 index 0000000000000000000000000000000000000000..82085432c622fb9b195d45480ce0c00f80d24027 GIT binary patch literal 207 zcwPa|05JbYNk%w1VH5xq0J9DNySuyH-QDi)?jj;0%*@PHRaKdpnGq2YcXxM0L_~;) zh%+-YW@csp00960{{R30A^8LW000gEEC2ui02BZe000Dh(8)=wy*N7}G;WM{HHkzh zs6t%9fi%d0HcQepm#{3&(I_#A0+$;m0FJ}}WxKp?w}cH!tRNB$k|H1#RxPhVL6BGg z09nkC_M1X4*#RtJD4)}o#(?mXbR9t%Fa-%dPzMPG0V6gC3@He52a91h#Kfdz)l@%W&!*iMf|{-?85Jc}En;9`Q2fcl$iTqPpaWzx zfYdTD8&>SP^UvUv=WT(-MvhHP2^@CL3Kgu4H>o$?I%%c|6PuTPQj@ zlcU}If|RV9+-%ftpI?)gR~OWD-L~lZr4!TAQ;%E4&f7G}D6a0<&ZGBr{U;q-D8x}mX=9XPKzcL zEt-|Yz`y_$WEgxv@h1x-1A`xf4u}Ja69)GG4Sr3{Ev;?s9i3g>J-vPX6DCfYJZ0*% z=`&`|nmuRky!i_jE)-Q%R9>`V<*H^*0nXXViY_JwGwpb%GBdL?ukhXP>v!N_uQ=mz z@t(tny95k%n;0%#zSJYia%1CWTh;Ew2#bJF#RG|!BEw_rwy;_@KWn*T;;bLiqbs1;#Ko!-RuOS==IdxT z={hm@oz zK2r`b`E}M@JHf_dxuqe_?}WfbX3H7n_kwD+ZVwdB*PPM8p*A<9SwWn`;9%a5+!czd z`V&6PY0!L;(9F&8uk5apZKil9n}*0k54+y8*Y255nxnwP5ySfPWHr0@0gc7n5-Ka_ zsXLZ#@KQ7PDR5HfdQ7YnwZ zVAs}QRMp@$*)n%t=Z0hFrcQcb;K&wTB*{`g<-<>B4YwB-oq8R9LJR_5QeUl9wB`Ku Va>bHqS+7>EShgxly^(>z8UTl=n>+vj literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/cleanup.gif b/public/javascripts/tiny_mce/themes/simple/images/cleanup.gif new file mode 100755 index 0000000000000000000000000000000000000000..16491f6cfcf3e1123f08352c895f8010f791c469 GIT binary patch literal 256 zcwPYj0ssC-Nk%w1VH5xq0MrlwMm#2xdP3^ge4>(aXJcF2&#c0@g7@*TXJyAiI+Bx- z!osRT%E{EUw6tz+enw7G^6K)^$d=yS-J+Ue{{6y&f`-z%VxXFs!L^y{+>(HFVv>^L zOipLAk}~7mu>b%7A^8LW0018VEC2ui02BZe000Gj;3tk`X`X1RuBfCa3_CK)hB&I! z?6jS5DV>BNxhN371`1>FG$6!^gQF}JB8CHn;<-pFjYq{)@NCbANaf;iJjfX><#5Od z41@~dZSq94bpiqw6C4j!WCnJE77HB!h$k2WjE(>oEEpP%kC-wT1Ob;aBcK|jsHv(a GApkq`d~Wvu literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/italic.gif b/public/javascripts/tiny_mce/themes/simple/images/italic.gif new file mode 100755 index 0000000000000000000000000000000000000000..8bb330bd0bbf61fdb5ce86388ecbeae16465bc17 GIT binary patch literal 79 zcwTe&bhEHb6k!lySjfl#1T8Hs)z#IEjEssuS%3n}3_2iDkURsE!kqq_+b+wcJF`+8$Fz@Ye(g^_`QkwFK@W&p`BFsb(RuRQ&hf3e8|rl>@| g-;s5$k$uy}dmH1H=FS{~1UDia%Kx85jf@bU+-CoeZq~3Mzdmne#HN^t7sMoHaM3 zKeDON5$Z4EYhX`qtk99-JldR4#mcjY<*+8l94Yoj2$|NLMcr)@lr3G4b21>PvGV9&5-I=QIi%&s}{E7Q0w PIrj2oy~qv|Vz34P1?eX! literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/redo.gif b/public/javascripts/tiny_mce/themes/simple/images/redo.gif new file mode 100755 index 0000000000000000000000000000000000000000..3af90697f0b74d0b6b07b585614a6dc67ff87f1d GIT binary patch literal 169 zcwPai09OA;Nk%w1VH5xq0K*FaEl-kjqwqa)*O$8QUUsNeit)O{)H!9gj;!cSf8=SD z@4U+CH(H=qeZQ%{>Hq)$A^8LW000jFEC2ui02BZe000D5@X1N5y*TU5@mkK(Nsfb@ zh`52taWqPx3Yb$cP21Nib_4)BqDn)z literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/separator.gif b/public/javascripts/tiny_mce/themes/simple/images/separator.gif new file mode 100755 index 0000000000000000000000000000000000000000..4f39b809e98103422a7a8815d9e0ff23123034b5 GIT binary patch literal 57 zcwTe&bhEHbWMU9un8?J?(9rN73>X*~6o0ZXGB7YP=m6OaAbAERt|_b&SD$^K#C1@F G!5RSXJ`hL% literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/spacer.gif b/public/javascripts/tiny_mce/themes/simple/images/spacer.gif new file mode 100755 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncwTe&bhEHbWMp7un7{x9ia%KxMS!#phy#*gU}AD%WUvMRb)f_x literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/strikethrough.gif b/public/javascripts/tiny_mce/themes/simple/images/strikethrough.gif new file mode 100755 index 0000000000000000000000000000000000000000..3264635918e2237257811a745f3a7e31b4369432 GIT binary patch literal 83 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*jFzw-23{>5`RB^ury^=8j) h^eUTr??>*V8C&%_D;C}?e9svC>)iK$`!yICtN}048)X0h literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/underline.gif b/public/javascripts/tiny_mce/themes/simple/images/underline.gif new file mode 100755 index 0000000000000000000000000000000000000000..1dfeb5f6d06e21a25615a9eb0cbd2a74ab0efa42 GIT binary patch literal 88 zcwTe&bhEHb6k!lySjfl#1l85mjEo?b;!hSJ#l)Zk5(UXKFlkQdUwQg1zxWJ?3%{OS koDe;yao*!zU(QKMRZNWnGjv6-o@%}Q>)iK!0SpY*0G3P}*Z=?k literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/underline_fr.gif b/public/javascripts/tiny_mce/themes/simple/images/underline_fr.gif new file mode 100755 index 0000000000000000000000000000000000000000..551d9148d302c5f58b3b20d2c6a642450889a7ef GIT binary patch literal 79 zcwTe&bhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*mGzw-23e(4zsAr}6}u9vvi dPIT?{=$xyxd19dGtWDy_KKDM~70ke34FHj_7K8u* literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/underline_ru.gif b/public/javascripts/tiny_mce/themes/simple/images/underline_ru.gif new file mode 100755 index 0000000000000000000000000000000000000000..b78e2a498fb9406ef378d7c543756db552d87cba GIT binary patch literal 77 zcwTe&bhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@W&p`BFsbzPuRQ&he=&b6$oQ-^4DvkU-JNSuB@*WkdRx^dDpvoXMfpGVe^t0s*%M50L^JPNgOW9=DY{ zwRUPR{VJ=i!y~Yn|5a^3pX^@$7R;GXz&U2_VU>FP2yDM T6q-JRmwm<@?$-GliVW5OQO`~G literal 0 HcwPel00001 diff --git a/public/javascripts/tiny_mce/themes/simple/images/undo.gif b/public/javascripts/tiny_mce/themes/simple/images/undo.gif new file mode 100755 index 0000000000000000000000000000000000000000..520796d69defa118055d191eec33cc67f7551710 GIT binary patch literal 175 zcwPao08sx&Nk%w1VH5xq0K*FaI$fTWtk6Go+_}Zyr?=K#e#T#ZwX4DHa-Hu#XSz{; z-OtzKVv^{Tv+z=g@&Et;A^8LW000jFEC2ui02BZe000DB@X1N5y*TU5^*Z3vJx60U zVAe<_A|#2DUTDd{g#kDRhWrRvKmt&#E(`|)VHiweM~gz>Krlp-Snncu!2ps)!r>e} d2m*##Qg9H=3xcDt9yk');this._def("font_size_classes",'');this._def("font_size_style_values",'xx-small,x-small,small,medium,large,x-large,xx-large',true);this._def("event_elements",'a,img',true);this._def("convert_urls",true);this._def("table_inline_editing",false);this._def("object_resizing",true);this._def("custom_shortcuts",true);this._def("convert_on_click",false);this._def("content_css",'');this._def("fix_list_elements",false);this._def("fix_table_elements",false);this._def("strict_loading_mode",document.contentType=='application/xhtml+xml');this._def("hidden_tab_class",'');this._def("display_tab_class",'');this._def("gecko_spellcheck",false);if(this.isMSIE&&!this.isOpera)this.settings.strict_loading_mode=false;if(this.isMSIE&&this.settings['browsers'].indexOf('msie')==-1)return;if(this.isGecko&&this.settings['browsers'].indexOf('gecko')==-1)return;if(this.isSafari&&this.settings['browsers'].indexOf('safari')==-1)return;if(this.isOpera&&this.settings['browsers'].indexOf('opera')==-1)return;baseHREF=tinyMCE.settings['document_base_url'];var h=document.location.href;var p=h.indexOf('://');if(p>0&&document.location.protocol!="file:"){p=h.indexOf('/',p+3);h=h.substring(0,p);if(baseHREF.indexOf('://')==-1)baseHREF=h+baseHREF;tinyMCE.settings['document_base_url']=baseHREF;tinyMCE.settings['document_base_prefix']=h}if(baseHREF.indexOf('?')!=-1)baseHREF=baseHREF.substring(0,baseHREF.indexOf('?'));this.settings['base_href']=baseHREF.substring(0,baseHREF.lastIndexOf('/'))+"/";theme=this.settings['theme'];this.inlineStrict='A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment';this.inlineTransitional='A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment';this.blockElms='H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';this.blockRegExp=new RegExp("^("+this.blockElms+")$","i");this.posKeyCodes=new Array(13,45,36,35,33,34,37,38,39,40);this.uniqueURL='javascript:TINYMCE_UNIQUEURL();';this.uniqueTag='';this.callbacks=new Array('onInit','getInfo','getEditorTemplate','setupContent','onChange','onPageLoad','handleNodeChange','initInstance','execCommand','getControlHTML','handleEvent','cleanup');this.settings['theme_href']=tinyMCE.baseURL+"/themes/"+theme;if(!tinyMCE.isIE||tinyMCE.isOpera)this.settings['force_br_newlines']=false;if(tinyMCE.getParam("popups_css",false)){var cssPath=tinyMCE.getParam("popups_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['popups_css']=this.documentBasePath+"/"+cssPath;else this.settings['popups_css']=cssPath}else this.settings['popups_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_popup.css";if(tinyMCE.getParam("editor_css",false)){var cssPath=tinyMCE.getParam("editor_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['editor_css']=this.documentBasePath+"/"+cssPath;else this.settings['editor_css']=cssPath}else{if(this.settings.editor_css!='')this.settings['editor_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_ui.css"}if(tinyMCE.settings['debug']){var msg="Debug: \n";msg+="baseURL: "+this.baseURL+"\n";msg+="documentBasePath: "+this.documentBasePath+"\n";msg+="content_css: "+this.settings['content_css']+"\n";msg+="popups_css: "+this.settings['popups_css']+"\n";msg+="editor_css: "+this.settings['editor_css']+"\n";alert(msg)}if(this.configs.length==0){if(typeof(TinyMCECompressed)=="undefined"){tinyMCE.addEvent(window,"DOMContentLoaded",TinyMCE_Engine.prototype.onLoad);if(tinyMCE.isRealIE){if(document.body)tinyMCE.addEvent(document.body,"readystatechange",TinyMCE_Engine.prototype.onLoad);else tinyMCE.addEvent(document,"readystatechange",TinyMCE_Engine.prototype.onLoad)}tinyMCE.addEvent(window,"load",TinyMCE_Engine.prototype.onLoad);tinyMCE._addUnloadEvents()}}this.loadScript(tinyMCE.baseURL+'/themes/'+this.settings['theme']+'/editor_template'+tinyMCE.srcMode+'.js');this.loadScript(tinyMCE.baseURL+'/langs/'+this.settings['language']+'.js');this.loadCSS(this.settings['editor_css']);var p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(var i=0;i');this.loadedFiles[this.loadedFiles.length]=url},loadNextScript:function(){var d=document,se;if(!tinyMCE.settings.strict_loading_mode)return;if(this.loadingIndex0){for(i=0,lflen=this.loadedFiles.length;i');this.loadedFiles[this.loadedFiles.length]=ar[x]}}}},importCSS:function(doc,css){var css_ary=css.replace(/\s+/,'').split(',');var csslen,elm,headArr,x,css_file;for(x=0,csslen=css_ary.length;x0){if(css_file.indexOf('://')==-1&&css_file.charAt(0)!='/')css_file=this.documentBasePath+"/"+css_file;if(typeof(doc.createStyleSheet)=="undefined"){elm=doc.createElement("link");elm.rel="stylesheet";elm.href=css_file;if((headArr=doc.getElementsByTagName("head"))!=null&&headArr.length>0)headArr[0].appendChild(elm)}else doc.createStyleSheet(css_file)}}},confirmAdd:function(e,settings){var elm=tinyMCE.isIE?event.srcElement:e.target;var elementId=elm.name?elm.name:elm.id;tinyMCE.settings=settings;if(tinyMCE.settings['convert_on_click']||(!elm.getAttribute('mce_noask')&&confirm(tinyMCELang['lang_edit_confirm'])))tinyMCE.addMCEControl(elm,elementId);elm.setAttribute('mce_noask','true')},updateContent:function(form_element_name){var formElement=document.getElementById(form_element_name);for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();if(inst.formElement==formElement){var doc=inst.getDoc();tinyMCE._setHTML(doc,inst.formElement.value);if(!tinyMCE.isIE)doc.body.innerHTML=tinyMCE._cleanupHTML(inst,doc,this.settings,doc.body,inst.visualAid)}}},addMCEControl:function(replace_element,form_element_name,target_document){var id="mce_editor_"+tinyMCE.idCounter++;var inst=new TinyMCE_Control(tinyMCE.settings);inst.editorId=id;this.instances[id]=inst;inst._onAdd(replace_element,form_element_name,target_document)},removeInstance:function(ti){var t=[],n,i;for(n in tinyMCE.instances){i=tinyMCE.instances[n];if(tinyMCE.isInstance(i)&&ti!=i)t[n]=i}tinyMCE.instances=t;n=[];t=tinyMCE.undoLevels;for(i=0;i0){tinyMCE.nextUndoRedoAction='Undo';inst=this.undoLevels[--this.undoIndex];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Undo')}}else inst.execCommand('Undo');return true;case"Redo":if(this.getParam('custom_undo_redo_global')){if(this.undoIndex<=this.undoLevels.length-1){tinyMCE.nextUndoRedoAction='Redo';inst=this.undoLevels[this.undoIndex++];inst.select();if(!tinyMCE.nextUndoRedoInstanceId)inst.execCommand('Redo')}}else inst.execCommand('Redo');return true;case'mceFocus':var inst=tinyMCE.getInstanceById(value);if(inst)inst.getWin().focus();return;case"mceAddControl":case"mceAddEditor":tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceAddFrameControl":tinyMCE.addMCEControl(tinyMCE._getElementById(value['element'],value['document']),value['element'],value['document']);return;case"mceRemoveControl":case"mceRemoveEditor":tinyMCE.removeMCEControl(value);return;case"mceResetDesignMode":if(!tinyMCE.isIE){for(var n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;try{tinyMCE.instances[n].getDoc().designMode="on"}catch(e){}}}return}if(inst){inst.execCommand(command,user_interface,value)}else if(tinyMCE.settings['focus_alert'])alert(tinyMCELang['lang_focus_alert'])},_createIFrame:function(replace_element,doc,win){var iframe,id=replace_element.getAttribute("id");var aw,ah;if(typeof(doc)=="undefined")doc=document;if(typeof(win)=="undefined")win=window;iframe=doc.createElement("iframe");aw=""+tinyMCE.settings['area_width'];ah=""+tinyMCE.settings['area_height'];if(aw.indexOf('%')==-1){aw=parseInt(aw);aw=(isNaN(aw)||aw<0)?300:aw;aw=aw+"px"}if(ah.indexOf('%')==-1){ah=parseInt(ah);ah=(isNaN(ah)||ah<0)?240:ah;ah=ah+"px"}iframe.setAttribute("id",id);iframe.setAttribute("name",id);iframe.setAttribute("class","mceEditorIframe");iframe.setAttribute("border","0");iframe.setAttribute("frameBorder","0");iframe.setAttribute("marginWidth","0");iframe.setAttribute("marginHeight","0");iframe.setAttribute("leftMargin","0");iframe.setAttribute("topMargin","0");iframe.setAttribute("width",aw);iframe.setAttribute("height",ah);iframe.setAttribute("allowtransparency","true");iframe.className='mceEditorIframe';if(tinyMCE.settings["auto_resize"])iframe.setAttribute("scrolling","no");if(tinyMCE.isRealIE)iframe.setAttribute("src",this.settings['default_document']);iframe.style.width=aw;iframe.style.height=ah;if(tinyMCE.settings.strict_loading_mode)iframe.style.marginBottom='-5px';if(tinyMCE.isRealIE)replace_element.outerHTML=iframe.outerHTML;else replace_element.parentNode.replaceChild(iframe,replace_element);if(tinyMCE.isRealIE)return win.frames[id];else return iframe},setupContent:function(editor_id){var inst=tinyMCE.instances[editor_id],i;var doc=inst.getDoc();var head=doc.getElementsByTagName('head').item(0);var content=inst.startContent;if(tinyMCE.settings.strict_loading_mode){content=content.replace(/</g,'<');content=content.replace(/>/g,'>');content=content.replace(/"/g,'"');content=content.replace(/&/g,'&')}inst.switchSettings();if(!tinyMCE.isIE&&tinyMCE.getParam("setupcontent_reload",false)&&doc.title!="blank_page"){try{doc.location.href=tinyMCE.baseURL+"/blank.htm"}catch(ex){}window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",1000);return}if(!head){window.setTimeout("tinyMCE.setupContent('"+editor_id+"');",10);return}tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/themes/"+inst.settings['theme']+"/css/editor_content.css");tinyMCE.importCSS(inst.getDoc(),inst.settings['content_css']);tinyMCE.dispatchCallback(inst,'init_instance_callback','initInstance',inst);if(tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')){inst.addShortcut('ctrl','z','lang_undo_desc','Undo');inst.addShortcut('ctrl','y','lang_redo_desc','Redo')}for(i=1;i<=6;i++)inst.addShortcut('ctrl',''+i,'','FormatBlock',false,'');inst.addShortcut('ctrl','7','','FormatBlock',false,'

');inst.addShortcut('ctrl','8','','FormatBlock',false,'

');inst.addShortcut('ctrl','9','','FormatBlock',false,'
');if(tinyMCE.isGecko){inst.addShortcut('ctrl','b','lang_bold_desc','Bold');inst.addShortcut('ctrl','i','lang_italic_desc','Italic');inst.addShortcut('ctrl','u','lang_underline_desc','Underline')}if(tinyMCE.getParam("convert_fonts_to_spans"))inst.getBody().setAttribute('id','mceSpanFonts');if(tinyMCE.settings['nowrap'])doc.body.style.whiteSpace="nowrap";doc.body.dir=this.settings['directionality'];doc.editorId=editor_id;if(!tinyMCE.isIE)doc.documentElement.editorId=editor_id;inst.setBaseHREF(tinyMCE.settings['base_href']);if(tinyMCE.settings['convert_newlines_to_brs']){content=tinyMCE.regexpReplace(content,"\r\n","
","gi");content=tinyMCE.regexpReplace(content,"\r","
","gi");content=tinyMCE.regexpReplace(content,"\n","
","gi")}content=tinyMCE.storeAwayURLs(content);content=tinyMCE._customCleanup(inst,"insert_to_editor",content);if(tinyMCE.isIE){window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["'+editor_id+'"].getDoc(), "'+editor_id+'");}catch(e){}',500);if(tinyMCE.settings["force_br_newlines"])doc.styleSheets[0].addRule("p","margin: 0;");var body=inst.getBody();body.editorId=editor_id}content=tinyMCE.cleanupHTMLCode(content);if(!tinyMCE.isIE){var contentElement=inst.getDoc().createElement("body");var doc=inst.getDoc();contentElement.innerHTML=content;if(tinyMCE.isGecko&&tinyMCE.settings['remove_lt_gt'])content=content.replace(new RegExp('<>','g'),"");if(tinyMCE.settings['cleanup_on_startup'])tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,doc,this.settings,contentElement));else tinyMCE.setInnerHTML(inst.getBody(),content);tinyMCE.convertAllRelativeURLs(inst.getBody())}else{if(tinyMCE.settings['cleanup_on_startup']){tinyMCE._setHTML(inst.getDoc(),content);eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}')}else tinyMCE._setHTML(inst.getDoc(),content)}var parentElm=inst.targetDoc.getElementById(inst.editorId+'_parent');inst.formElement=tinyMCE.isGecko?parentElm.previousSibling:parentElm.nextSibling;tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings['visual'],inst);tinyMCE.dispatchCallback(inst,'setupcontent_callback','setupContent',editor_id,inst.getBody(),inst.getDoc());if(!tinyMCE.isIE)tinyMCE.addEventHandlers(inst);if(tinyMCE.isIE){tinyMCE.addEvent(inst.getBody(),"blur",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(inst.getBody(),"beforedeactivate",TinyMCE_Engine.prototype._eventPatch);if(!tinyMCE.isOpera){tinyMCE.addEvent(doc.body,"mousemove",TinyMCE_Engine.prototype.onMouseMove);tinyMCE.addEvent(doc.body,"beforepaste",TinyMCE_Engine.prototype._eventPatch);tinyMCE.addEvent(doc.body,"drop",TinyMCE_Engine.prototype._eventPatch)}}inst.select();tinyMCE.selectedElement=inst.contentWindow.document.body;tinyMCE._customCleanup(inst,"insert_to_editor_dom",inst.getBody());tinyMCE._customCleanup(inst,"setup_content_dom",inst.getBody());tinyMCE._setEventsEnabled(inst.getBody(),false);tinyMCE.cleanupAnchors(inst.getDoc());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(inst.getDoc());inst.startContent=tinyMCE.trim(inst.getBody().innerHTML);inst.undoRedo.add({content:inst.startContent});if(tinyMCE.isGecko){tinyMCE.selectNodes(inst.getBody(),function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}if(tinyMCE.isGecko)inst.getBody().spellcheck=tinyMCE.getParam("gecko_spellcheck");tinyMCE._removeInternal(inst.getBody());inst.select();tinyMCE.triggerNodeChange(false,true)},storeAwayURLs:function(s){if(!s.match(/(mce_src|mce_href)/gi,s)){s=s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"','gi'),'src="$1" mce_src="$1"');s=s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"','gi'),'href="$1" mce_href="$1"')}return s},_removeInternal:function(n){if(tinyMCE.isGecko){tinyMCE.selectNodes(n,function(n){if(n.nodeType==3||n.nodeType==8)n.nodeValue=n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"','gi'),"");return false})}},handleEvent:function(e){var inst=tinyMCE.selectedInstance;if(typeof(tinyMCE)=="undefined")return true;if(tinyMCE.executeCallback(tinyMCE.selectedInstance,'handle_event_callback','handleEvent',e))return false;switch(e.type){case"beforedeactivate":case"blur":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.execCommand('mceEndTyping');tinyMCE.hideMenus();return;case"drop":case"beforepaste":if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.setBaseHREF(null);if(tinyMCE.isRealIE){var ife=tinyMCE.selectedInstance.iframeElement;if(ife.style.height.indexOf('%')!=-1){ife._oldHeight=ife.style.height;ife.style.height=ife.clientHeight}}window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings['base_href']);tinyMCE._resetIframeHeight();",1);return;case"submit":tinyMCE.triggerSave();tinyMCE.isNotDirty=true;return;case"reset":var formObj=tinyMCE.isIE?window.event.srcElement:e.target;for(var i=0;i");rng.collapse(false);rng.select();tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange(false);return false}}if(e.keyCode==8||e.keyCode==46){tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(e.target,"a");tinyMCE.imgElement=tinyMCE.getParentElement(e.target,"img");tinyMCE.triggerNodeChange(false)}return false;break;case"keyup":case"keydown":tinyMCE.hideMenus();tinyMCE.hasMouseMoved=false;if(inst&&inst.handleShortcut(e))return false;if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();var inst=tinyMCE.selectedInstance;if(tinyMCE.isGecko&&tinyMCE.settings['force_p_newlines']&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");e.preventDefault();return false}}tinyMCE.selectedElement=null;tinyMCE.selectedNode=null;var elm=tinyMCE.selectedInstance.getFocusElement();tinyMCE.linkElement=tinyMCE.getParentElement(elm,"a");tinyMCE.imgElement=tinyMCE.getParentElement(elm,"img");tinyMCE.selectedElement=elm;if(tinyMCE.isGecko&&e.type=="keyup"&&e.keyCode==9)tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(),true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);if(tinyMCE.isIE&&e.type=="keydown"&&e.keyCode==13)tinyMCE.enterKeyElement=tinyMCE.selectedInstance.getFocusElement();if(tinyMCE.isIE&&e.type=="keyup"&&e.keyCode==13){var elm=tinyMCE.enterKeyElement;if(elm){var re=new RegExp('^HR|IMG|BR$','g');var dre=new RegExp('^H[1-6]$','g');if(!elm.hasChildNodes()&&!re.test(elm.nodeName)){if(dre.test(elm.nodeName))elm.innerHTML="  ";else elm.innerHTML=" "}}}var keys=tinyMCE.posKeyCodes;var posKey=false;for(var i=0;i';h+='';h+=''}else{h+='';h+='';h+=''}return h},getMenuButtonHTML:function(id,lang,img,mcmd,cmd,ui,val){var h='',m,x;mcmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+mcmd+'\');';cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+cmd+'\'';if(typeof(ui)!="undefined"&&ui!=null)cmd+=','+ui;if(typeof(val)!="undefined"&&val!=null)cmd+=",'"+val+"'";cmd+=');';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isIE||tinyMCE.isOpera)&&(m=tinyMCE.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);if(tinyMCE.isRealIE)h+='';else h+='';h+='';h+='';h+='';h+=''}else{if(tinyMCE.isRealIE)h+='';else h+='';h+='';h+='';h+='';h+=''}return h},_menuButtonEvent:function(e,o){if(o.className=='mceMenuButtonFocus')return;if(e=='over')o.className=o.className+' mceMenuHover';else o.className=o.className.replace(/\s.*$/,'')},addButtonMap:function(m){var i,a=m.replace(/\s+/,'').split(',');for(i=0;i0);if(tinyMCE.settings['custom_undo_redo']){undoIndex=inst.undoRedo.undoIndex;undoLevels=inst.undoRedo.undoLevels.length}tinyMCE.dispatchCallback(inst,'handle_node_change_callback','handleNodeChange',editorId,elm,undoIndex,undoLevels,inst.visualAid,anySelection,setup_content)}if(this.selectedInstance&&(typeof(focus)=="undefined"||focus))this.selectedInstance.contentWindow.focus()},_customCleanup:function(inst,type,content){var pl,po,i;var customCleanup=tinyMCE.settings['cleanup_callback'];if(customCleanup!=""&&eval("typeof("+customCleanup+")")!="undefined")content=eval(customCleanup+"(type, content, inst);");po=tinyMCE.themes[tinyMCE.settings['theme']];if(po&&po.cleanup)content=po.cleanup(type,content,inst);pl=inst.plugins;for(i=0;i0)className+=" ";className+=classNames[i]}return className},handleVisualAid:function(el,deep,state,inst,skip_dispatch){if(!el)return;if(!skip_dispatch)tinyMCE.dispatchCallback(inst,'handle_visual_aid_callback','handleVisualAid',el,deep,state,inst);var tableElement=null;switch(el.nodeName){case"TABLE":var oldW=el.style.width;var oldH=el.style.height;var bo=tinyMCE.getAttrib(el,"border");bo=bo==""||bo=="0"?true:false;tinyMCE.setAttrib(el,"class",tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el,"class"),state&&bo));el.style.width=oldW;el.style.height=oldH;for(var y=0;y0){for(var x=0;x0)tinyMCE.cssClasses=output;return output},regexpReplace:function(in_str,reg_exp,replace_str,opts){if(in_str==null)return in_str;if(typeof(opts)=="undefined")opts='g';var re=new RegExp(reg_exp,opts);return in_str.replace(re,replace_str)},trim:function(s){return s.replace(/^\s*|\s*$/g,"")},cleanupEventStr:function(s){s=""+s;s=s.replace('function anonymous()\n{\n','');s=s.replace('\n}','');s=s.replace(/^return true;/gi,'');return s},getControlHTML:function(c){var i,l,n,o,v;l=tinyMCE.plugins;for(n in l){o=l[n];if(o.getControlHTML&&(v=o.getControlHTML(c))!='')return tinyMCE.replaceVar(v,"pluginurl",o.baseURL)}o=tinyMCE.themes[tinyMCE.settings['theme']];if(o.getControlHTML&&(v=o.getControlHTML(c))!='')return v;return''},evalFunc:function(f,idx,a,o){var s='(',i;for(i=idx;i0)return true;if(ins!=null){for(i=0,l=ins.plugins;i0)return true}}l=tinyMCE.themes;for(on in l){o=l[on];if(o[n]&&(v=tinyMCE.evalFunc(n,3,a,o))==s&&m>0)return true}return false},xmlEncode:function(s){return s?(''+s).replace(new RegExp('[<>&"\']','g'),function(c,b){switch(c){case'&':return'&';case'"':return'"';case'\'':return''';case'<':return'<';case'>':return'>'}return c}):s},extend:function(p,np){var o={};o.parent=p;for(n in p)o[n]=p[n];for(n in np)o[n]=np[n];return o},hideMenus:function(){var e=tinyMCE.lastSelectedMenuBtn;if(tinyMCE.lastMenu){tinyMCE.lastMenu.hide();tinyMCE.lastMenu=null}if(e){tinyMCE.switchClass(e,tinyMCE.lastMenuBtnClass);tinyMCE.lastSelectedMenuBtn=null}}};var TinyMCE=TinyMCE_Engine;var tinyMCE=new TinyMCE_Engine();var tinyMCELang={};function TinyMCE_Control(settings){var t,i,to,fu,p,x,fn,fu,pn,s=settings;this.undoRedoLevel=true;this.isTinyMCE_Control=true;this.settings=s;this.settings['theme']=tinyMCE.getParam("theme","default");this.settings['width']=tinyMCE.getParam("width",-1);this.settings['height']=tinyMCE.getParam("height",-1);this.selection=new TinyMCE_Selection(this);this.undoRedo=new TinyMCE_UndoRedo(this);this.cleanup=new TinyMCE_Cleanup();this.shortcuts=new Array();this.hasMouseMoved=false;this.foreColor=this.backColor="#999999";this.data={};this.cleanup.init({valid_elements:s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,entities:s.entities,entity_encoding:s.entity_encoding,debug:s.cleanup_debug,url_converter:'TinyMCE_Cleanup.prototype._urlConverter',indent:s.apply_source_formatting,invalid_elements:s.invalid_elements,verify_html:s.verify_html,fix_content_duplication:s.fix_content_duplication});t=this.settings['theme'];if(!tinyMCE.hasTheme(t)){fn=tinyMCE.callbacks;to={};for(i=0;i0){for(i=0;i1&&tinyMCE.currentConfig!=this.settings['index']){tinyMCE.settings=this.settings;tinyMCE.currentConfig=this.settings['index']}},select:function(){var oldInst=tinyMCE.selectedInstance;if(oldInst!=this){if(oldInst)oldInst.execCommand('mceEndTyping');tinyMCE.dispatchCallback(this,'select_instance_callback','selectInstance',this,oldInst);tinyMCE.selectedInstance=this}},getBody:function(){return this.contentBody?this.contentBody:this.getDoc().body},getDoc:function(){return this.contentWindow.document},getWin:function(){return this.contentWindow},getContainerWin:function(){return this.containerWindow?this.containerWindow:window},getViewPort:function(){return tinyMCE.getViewPort(this.getWin())},getParentNode:function(n,f){return tinyMCE.getParentNode(n,f,this.getBody())},getParentElement:function(n,na,f){return tinyMCE.getParentElement(n,na,f,this.getBody())},getParentBlockElement:function(n){return tinyMCE.getParentBlockElement(n,this.getBody())},resizeToContent:function(){var d=this.getDoc(),b=d.body,de=d.documentElement;this.iframeElement.style.height=(tinyMCE.isRealIE)?b.scrollHeight:de.offsetHeight+'px'},addShortcut:function(m,k,d,cmd,ui,va){var n=typeof(k)=="number",ie=tinyMCE.isIE,c,sc,i,scl=this.shortcuts;if(!tinyMCE.getParam('custom_shortcuts'))return false;m=m.toLowerCase();k=ie&&!n?k.toUpperCase():k;c=n?null:k.charCodeAt(0);d=d&&d.indexOf('lang_')==0?tinyMCE.getLang(d):d;sc={alt:m.indexOf('alt')!=-1,ctrl:m.indexOf('ctrl')!=-1,shift:m.indexOf('shift')!=-1,charCode:c,keyCode:n?k:(ie?c:null),desc:d,cmd:cmd,ui:ui,val:va};for(i=0;i0)rng.pasteHTML('
'+rng.htmlText+"
");tinyMCE.triggerNodeChange();return}}}switch(command){case"mceRepaint":this.repaint();return true;case"unlink":if(tinyMCE.isGecko&&this.getSel().isCollapsed){focusElm=tinyMCE.getParentElement(focusElm,'A');if(focusElm)this.selection.selectNode(focusElm,false)}this.getDoc().execCommand(command,user_interface,value);tinyMCE.isGecko&&this.getSel().collapseToEnd();tinyMCE.triggerNodeChange();return true;case"FormatBlock":if(!this.cleanup.isValid(value))return true;this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"InsertUnorderedList":case"InsertOrderedList":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"Strikethrough":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case"mceSelectNode":this.selection.selectNode(value);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=value;break;case"FormatBlock":if(value==null||value==""){var elm=tinyMCE.getParentElement(this.getFocusElement(),"p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");if(elm)this.execCommand("mceRemoveNode",false,elm)}else{if(tinyMCE.isGecko&&new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>','gi').test(value))value=value.replace(/[^a-z]/gi,'');if(tinyMCE.isIE&&new RegExp('blockquote|code|samp','gi').test(value)){var b=this.selection.getBookmark();this.getDoc().execCommand("FormatBlock",false,'

');tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()),value);this.selection.moveToBookmark(b)}else this.getDoc().execCommand("FormatBlock",false,value)}tinyMCE.triggerNodeChange();break;case"mceRemoveNode":if(!value)value=tinyMCE.getParentElement(this.getFocusElement());if(tinyMCE.isIE){value.outerHTML=value.innerHTML}else{var rng=value.ownerDocument.createRange();rng.setStartBefore(value);rng.setEndAfter(value);rng.deleteContents();rng.insertNode(rng.createContextualFragment(value.innerHTML))}tinyMCE.triggerNodeChange();break;case"mceSelectNodeDepth":var parentNode=this.getFocusElement();for(var i=0;parentNode;i++){if(parentNode.nodeName.toLowerCase()=="body")break;if(parentNode.nodeName.toLowerCase()=="#text"){i--;parentNode=parentNode.parentNode;continue}if(i==value){this.selection.selectNode(parentNode,false);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=parentNode;return}parentNode=parentNode.parentNode}break;case"SetStyleInfo":var rng=this.getRng();var sel=this.getSel();var scmd=value['command'];var sname=value['name'];var svalue=value['value']==null?'':value['value'];var wrapper=value['wrapper']?value['wrapper']:"span";var parentElm=null;var invalidRe=new RegExp("^BODY|HTML$","g");var invalidParentsRe=tinyMCE.settings['merge_styles_invalid_parents']!=''?new RegExp(tinyMCE.settings['merge_styles_invalid_parents'],"gi"):null;if(tinyMCE.isIE){if(rng.item)parentElm=rng.item(0);else{var pelm=rng.parentElement();var prng=doc.selection.createRange();prng.moveToElementText(pelm);if(rng.htmlText==prng.htmlText||rng.boundingWidth==0){if(invalidParentsRe==null||!invalidParentsRe.test(pelm.nodeName))parentElm=pelm}}}else{var felm=this.getFocusElement();if(sel.isCollapsed||(new RegExp('td|tr|tbody|table','gi').test(felm.nodeName)&&sel.anchorNode==felm.parentNode))parentElm=felm}if(parentElm&&!invalidRe.test(parentElm.nodeName)){if(scmd=="setstyle")tinyMCE.setStyleAttrib(parentElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(parentElm,sname,svalue);if(scmd=="removeformat"){parentElm.style.cssText='';tinyMCE.setAttrib(parentElm,'class','')}var ch=tinyMCE.getNodeTree(parentElm,new Array(),1);for(var z=0;z=0;i--){var elm=nodes[i];var isNew=tinyMCE.getAttrib(elm,"mce_new")=="true";elm.removeAttribute("mce_new");if(elm.childNodes&&elm.childNodes.length==1&&elm.childNodes[0].nodeType==1){this._mergeElements(scmd,elm,elm.childNodes[0],isNew);continue}if(elm.parentNode.childNodes.length==1&&!invalidRe.test(elm.nodeName)&&!invalidRe.test(elm.parentNode.nodeName)){if(invalidParentsRe==null||!invalidParentsRe.test(elm.parentNode.nodeName))this._mergeElements(scmd,elm.parentNode,elm,false)}}var nodes=doc.getElementsByTagName(wrapper);for(var i=nodes.length-1;i>=0;i--){var elm=nodes[i];var isEmpty=true;var tmp=doc.createElement("body");tmp.appendChild(elm.cloneNode(false));tmp.innerHTML=tmp.innerHTML.replace(new RegExp('style=""|class=""','gi'),'');if(new RegExp('','gi').test(tmp.innerHTML)){for(var x=0;x0){value=tinyMCE.replaceVar(value,"selection",selectedText);tinyMCE.execCommand('mceInsertContent',false,value)}tinyMCE.triggerNodeChange();break;case"mceSetAttribute":if(typeof(value)=='object'){var targetElms=(typeof(value['targets'])=="undefined")?"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address":value['targets'];var targetNode=tinyMCE.getParentElement(this.getFocusElement(),targetElms);if(targetNode){targetNode.setAttribute(value['name'],value['value']);tinyMCE.triggerNodeChange()}}break;case"mceSetCSSClass":this.execCommand("SetStyleInfo",false,{command:"setattrib",name:"class",value:value});break;case"mceInsertRawHTML":var key='tiny_mce_marker';this.execCommand('mceBeginUndoLevel');this.execCommand('mceInsertContent',false,key);var scrollX=this.getBody().scrollLeft+this.getDoc().documentElement.scrollLeft;var scrollY=this.getBody().scrollTop+this.getDoc().documentElement.scrollTop;var html=this.getBody().innerHTML;if((pos=html.indexOf(key))!=-1)tinyMCE.setInnerHTML(this.getBody(),html.substring(0,pos)+value+html.substring(pos+key.length));this.contentWindow.scrollTo(scrollX,scrollY);this.execCommand('mceEndUndoLevel');break;case"mceInsertContent":if(!value)value='';var insertHTMLFailed=false;if(tinyMCE.isGecko||tinyMCE.isOpera){try{if(value.indexOf('<')==-1&&!value.match(/(&| |<|>)/g)){var r=this.getRng();var n=this.getDoc().createTextNode(tinyMCE.entityDecode(value));var s=this.getSel();var r2=r.cloneRange();s.removeAllRanges();r.deleteContents();r.insertNode(n);r2.selectNode(n);r2.collapse(false);s.removeAllRanges();s.addRange(r2)}else{value=tinyMCE.fixGeckoBaseHREFBug(1,this.getDoc(),value);this.getDoc().execCommand('inserthtml',false,value);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}}catch(ex){insertHTMLFailed=true}if(!insertHTMLFailed){tinyMCE.triggerNodeChange();return}}if(!tinyMCE.isIE){var isHTML=value.indexOf('<')!=-1;var sel=this.getSel();var rng=this.getRng();if(isHTML){if(tinyMCE.isSafari){var tmpRng=this.getDoc().createRange();tmpRng.setStart(this.getBody(),0);tmpRng.setEnd(this.getBody(),0);value=tmpRng.createContextualFragment(value)}else value=rng.createContextualFragment(value)}else{var el=document.createElement("div");el.innerHTML=value;value=el.firstChild.nodeValue;value=doc.createTextNode(value)}if(tinyMCE.isSafari&&!isHTML){this.execCommand('InsertText',false,value.nodeValue);tinyMCE.triggerNodeChange();return true}else if(tinyMCE.isSafari&&isHTML){rng.deleteContents();rng.insertNode(value);tinyMCE.triggerNodeChange();return true}rng.deleteContents();if(rng.startContainer.nodeType==3){var node=rng.startContainer.splitText(rng.startOffset);node.parentNode.insertBefore(value,node)}else rng.insertNode(value);if(!isHTML){sel.selectAllChildren(doc.body);sel.removeAllRanges();var rng=doc.createRange();rng.selectNode(value);rng.collapse(false);sel.addRange(rng)}else rng.collapse(false);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value)}else{var rng=doc.selection.createRange(),tmpRng=null;var c=value.indexOf('"}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i';return h},_serializeAttribute:function(n,r,an){var av='',t,os=this.settings.on_save;if(os&&(an.indexOf('mce_')==0||an.indexOf('_moz')==0))return'';if(os&&this.mceAttribs[an])av=this._getAttrib(n,this.mceAttribs[an]);if(av.length==0)av=this._getAttrib(n,an);if(av.length==0&&r.defaultAttribs&&(t=r.defaultAttribs[an])){av=t;if(av=="mce_empty")return" "+an+'=""'}if(r.forceAttribs&&(t=r.forceAttribs[an]))av=t;if(os&&av.length!=0&&this.settings.url_converter.length!=0&&/^(src|href|longdesc)$/.test(an))av=eval(this.settings.url_converter+'(this, n, av)');if(av.length!=0&&r.validAttribValues&&r.validAttribValues[an]&&!r.validAttribValues[an].test(av))return"";if(av.length!=0&&av=="{$uid}")av="uid_"+(this.idCount++);if(av.length!=0){if(an.indexOf('on')!=0)av=this.xmlEncode(av);return" "+an+"="+'"'+av+'"'}return""},formatHTML:function(h){var s=this.settings,p='',i=0,li=0,o='',l;h=h.replace(/]*)>(.*?)<\/pre>/gi,function(a,b,c){c=c.replace(//gi,'\n');return''+c+''});h=h.replace(/\r/g,'');h='\n'+h;h=h.replace(new RegExp('\\n\\s+','gi'),'\n');h=h.replace(this.nlBeforeRe,'\n<$1$2>');h=h.replace(this.nlAfterRe,'<$1$2>\n');h=h.replace(this.nlBeforeAfterRe,'\n<$1$2$3>\n');h+='\n';while((i=h.indexOf('\n',i+1))!=-1){if((l=h.substring(li+1,i)).length!=0){if(this.ouRe.test(l)&&p.length>=s.indent_levels)p=p.substring(s.indent_levels);o+=p+l+'\n';if(this.inRe.test(l))p+=this.inStr}li=i}return o},xmlEncode:function(s){var cl=this;this._setupEntities();switch(this.settings.entity_encoding){case"raw":return tinyMCE.xmlEncode(s);case"named":return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']','g'),function(c,b){b=cl.entities[c.charCodeAt(0)];return b?'&'+b+';':c});case"numeric":return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']','g'),function(c,b){return b?'&#'+c.charCodeAt(0)+';':c})}return s},split:function(re,s){var c=s.split(re);var i,l,o=new Array();for(i=0,l=c.length;i':'>'+h+'';return o};TinyMCE_Engine.prototype.createTag=function(d,tn,a,h){var o=d.createElement(tn);if(a){for(n in a){if(typeof(a[n])!='function'&&a[n]!=null)tinyMCE.setAttrib(o,n,a[n])}}if(h)o.innerHTML=h;return o};TinyMCE_Engine.prototype.getElementByAttributeValue=function(n,e,a,v){return(n=this.getElementsByAttributeValue(n,e,a,v)).length==0?null:n[0]};TinyMCE_Engine.prototype.getElementsByAttributeValue=function(n,e,a,v){var i,nl=n.getElementsByTagName(e),o=new Array();for(i=0;i/gi,'');h=h.replace(/<\/em>/gi,'')}if(tinyMCE.isRealIE){h=h.replace(/\s\/>/g,'>');h=h.replace(/]*)>\u00A0?<\/p>/gi,' 

');h=h.replace(/]*)>\s* \s*<\/p>/gi,' 

');h=h.replace(/]*)>\s+<\/p>/gi,' 

');e.innerHTML=tinyMCE.uniqueTag+h;e.firstChild.removeNode(true);nl=e.getElementsByTagName("p");for(i=nl.length-1;i>=0;i--){n=nl[i];if(n.nodeName=='P'&&!n.hasChildNodes()&&!n.mce_keep)n.parentNode.removeChild(n)}}else{h=this.fixGeckoBaseHREFBug(1,e,h);e.innerHTML=h;this.fixGeckoBaseHREFBug(2,e,h)}};TinyMCE_Engine.prototype.getOuterHTML=function(e){if(tinyMCE.isIE)return e.outerHTML;var d=e.ownerDocument.createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML};TinyMCE_Engine.prototype.setOuterHTML=function(e,h,d){var d=typeof(d)=="undefined"?e.ownerDocument:d,i,nl,t;if(tinyMCE.isIE&&e.nodeType==1)e.outerHTML=h;else{t=d.createElement("body");t.innerHTML=h;for(i=0,nl=t.childNodes;i-1;i--){if(ar[i].specified&&ar[i].nodeValue)ne.setAttribute(ar[i].nodeName.toLowerCase(),ar[i].nodeValue)}ar=e.childNodes;for(i=0;i=strTok2.length){for(var i=0;i=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(strTok1.length=strTok1.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(breakPoint==1)return targetURL.path;for(var i=0;i<(strTok1.length-(breakPoint-1));i++)outPath+="../";for(var i=breakPoint-1;i=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i]}baseURLParts=newBaseURLParts.reverse();var newRelURLParts=new Array();var numBack=0;for(var i=relURLParts.length-1;i>=0;i--){if(relURLParts[i].length==0||relURLParts[i]==".")continue;if(relURLParts[i]=='..'){numBack++;continue}if(numBack>0){numBack--;continue}newRelURLParts[newRelURLParts.length]=relURLParts[i]}relURLParts=newRelURLParts.reverse();var len=baseURLParts.length-numBack;var absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');var start="",end="";relURL.protocol=baseURL.protocol;relURL.host=baseURL.host;relURL.port=baseURL.port;if(relURL.path.charAt(relURL.path.length-1)=="/")absPath+="/";relURL.path=absPath;return this.serializeURL(relURL)};TinyMCE_Engine.prototype.convertURL=function(url,node,on_save){var prot=document.location.protocol;var host=document.location.hostname;var port=document.location.port;if(prot=="file:")return url;url=tinyMCE.regexpReplace(url,'(http|https):///','/');if(url.indexOf('mailto:')!=-1||url.indexOf('javascript:')!=-1||tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0)=="#")return url;if(!tinyMCE.isIE&&!on_save&&url.indexOf("://")==-1&&url.charAt(0)!='/')return tinyMCE.settings['base_href']+url;if(on_save&&tinyMCE.getParam('relative_urls')){var curl=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],url);if(curl.charAt(0)=='/')curl=tinyMCE.settings['document_base_prefix']+curl;var urlParts=tinyMCE.parseURL(curl);var tmpUrlParts=tinyMCE.parseURL(tinyMCE.settings['document_base_url']);if(urlParts['host']==tmpUrlParts['host']&&(urlParts['port']==tmpUrlParts['port']))return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'],curl)}if(!tinyMCE.getParam('relative_urls')){var urlParts=tinyMCE.parseURL(url);var baseUrlParts=tinyMCE.parseURL(tinyMCE.settings['base_href']);url=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],url);if(urlParts['anchor']&&urlParts['path']==baseUrlParts['path'])return"#"+urlParts['anchor']}if(tinyMCE.getParam('remove_script_host')){var start="",portPart="";if(port!="")portPart=":"+port;start=prot+"//"+host+portPart+"/";if(url.indexOf(start)==0)url=url.substring(start.length-1)}return url};TinyMCE_Engine.prototype.convertAllRelativeURLs=function(body){var i,elms,src,href,mhref,msrc;elms=body.getElementsByTagName("img");for(i=0;ibookmark.index){try{rng.addElement(nl[bookmark.index])}catch(ex){}}}else{try{if(bookmark.start<0)return true;rng=inst.getSel().createRange();rng.moveToElementText(inst.getBody());rng.collapse(true);rng.moveStart('character',bookmark.start);rng.moveEnd('character',bookmark.length)}catch(ex){return true}}rng.select();win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}if(tinyMCE.isGecko||tinyMCE.isOpera){if(bookmark.rng){sel.removeAllRanges();sel.addRange(bookmark.rng)}if(bookmark.start!=-1&&bookmark.end!=-1){try{sd=this._getTextPos(b,bookmark.start,bookmark.end);rng=doc.createRange();rng.setStart(sd.startNode,sd.startOffset);rng.setEnd(sd.endNode,sd.endOffset);sel.removeAllRanges();sel.addRange(rng);win.focus()}catch(ex){}}win.scrollTo(bookmark.scrollX,bookmark.scrollY);return true}return false},_getPosText:function(r,sn,en){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){if(n==sn)d.start=p;if(n==en){d.end=p;return d}p+=n.nodeValue?n.nodeValue.length:0}return null},_getTextPos:function(r,sp,ep){var w=document.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={};while((n=w.nextNode())!=null){p+=n.nodeValue?n.nodeValue.length:0;if(p>=sp&&!d.startNode){d.startNode=n;d.startOffset=sp-(p-n.nodeValue.length)}if(p>=ep){d.endNode=n;d.endOffset=ep-(p-n.nodeValue.length);return d}}return null},selectNode:function(node,collapse,select_text_node,to_start){var inst=this.instance,sel,rng,nodes;if(!node)return;if(typeof(collapse)=="undefined")collapse=true;if(typeof(select_text_node)=="undefined")select_text_node=false;if(typeof(to_start)=="undefined")to_start=true;if(inst.settings.auto_resize)inst.resizeToContent();if(tinyMCE.isRealIE){rng=inst.getDoc().body.createTextRange();try{rng.moveToElementText(node);if(collapse)rng.collapse(to_start);rng.select()}catch(e){}}else{sel=this.getSel();if(!sel)return;if(tinyMCE.isSafari){sel.setBaseAndExtent(node,0,node,node.innerText.length);if(collapse){if(to_start)sel.collapseToStart();else sel.collapseToEnd()}this.scrollToNode(node);return}rng=inst.getDoc().createRange();if(select_text_node){nodes=tinyMCE.getNodeTree(node,new Array(),3);if(nodes.length>0)rng.selectNodeContents(nodes[0]);else rng.selectNodeContents(node)}else rng.selectNode(node);if(collapse){if(!to_start&&node.nodeType==3){rng.setStart(node,node.nodeValue.length);rng.setEnd(node,node.nodeValue.length)}else rng.collapse(to_start)}sel.removeAllRanges();sel.addRange(rng)}this.scrollToNode(node);tinyMCE.selectedElement=null;if(node.nodeType==1)tinyMCE.selectedElement=node},scrollToNode:function(node){var inst=this.instance,w=inst.getWin(),vp=inst.getViewPort(),pos=tinyMCE.getAbsPosition(node),cvp,p,cwin;if(pos.absLeftvp.left+vp.width||pos.absTopvp.top+(vp.height-25))w.scrollTo(pos.absLeft,pos.absTop-vp.height+25);if(inst.settings.auto_resize){cwin=inst.getContainerWin();cvp=tinyMCE.getViewPort(cwin);p=this.getAbsPosition(node);if(p.absLeftcvp.left+cvp.width||p.absTopcvp.top+cvp.height)cwin.scrollTo(p.absLeft,p.absTop-cvp.height+25)}},getAbsPosition:function(n){var pos=tinyMCE.getAbsPosition(n),ipos=tinyMCE.getAbsPosition(this.instance.iframeElement);return{absLeft:ipos.absLeft+pos.absLeft,absTop:ipos.absTop+pos.absTop}},getSel:function(){var inst=this.instance;if(tinyMCE.isRealIE)return inst.getDoc().selection;return inst.contentWindow.getSelection()},getRng:function(){var s=this.getSel();if(s==null)return null;if(tinyMCE.isRealIE)return s.createRange();if(tinyMCE.isSafari&&!s.getRangeAt)return''+window.getSelection();return s.getRangeAt(0)},getFocusElement:function(){var inst=this.instance,doc,rng,sel,elm;if(tinyMCE.isRealIE){doc=inst.getDoc();rng=doc.selection.createRange();elm=rng.item?rng.item(0):rng.parentElement()}else{if(!tinyMCE.isSafari&&inst.isHidden())return inst.getBody();sel=this.getSel();rng=this.getRng();if(!sel||!rng)return null;elm=rng.commonAncestorContainer;if(!rng.collapsed){if(rng.startContainer==rng.endContainer){if(rng.startOffset-rng.endOffset<2){if(rng.startContainer.hasChildNodes())elm=rng.startContainer.childNodes[rng.startOffset]}}}elm=tinyMCE.getParentElement(elm);}return elm}};function TinyMCE_UndoRedo(inst){this.instance=inst;this.undoLevels=new Array();this.undoIndex=0;this.typingUndoIndex=-1;this.undoRedo=true};TinyMCE_UndoRedo.prototype={add:function(l){var b,customUndoLevels,newHTML,inst=this.instance,i,ul,ur;if(l){this.undoLevels[this.undoLevels.length]=l;return true}if(this.typingUndoIndex!=-1){this.undoIndex=this.typingUndoIndex;if(tinyMCE.typingUndoIndex!=-1)tinyMCE.undoIndex=tinyMCE.typingUndoIndex}newHTML=tinyMCE.trim(inst.getBody().innerHTML);if(this.undoLevels[this.undoIndex]&&newHTML!=this.undoLevels[this.undoIndex].content){tinyMCE.dispatchCallback(inst,'onchange_callback','onChange',inst);customUndoLevels=tinyMCE.settings['custom_undo_redo_levels'];if(customUndoLevels!=-1&&this.undoLevels.length>customUndoLevels){for(i=0;i0){this.undoIndex--;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}},redo:function(){var inst=this.instance;tinyMCE.execCommand("mceEndTyping");if(this.undoIndex<(this.undoLevels.length-1)){this.undoIndex++;tinyMCE.setInnerHTML(inst.getBody(),this.undoLevels[this.undoIndex].content);inst.repaint();if(inst.settings.custom_undo_redo_restore_selection)inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark)}tinyMCE.triggerNodeChange()}};var TinyMCE_ForceParagraphs={_insertPara:function(inst,e){var doc=inst.getDoc(),sel=inst.getSel(),body=inst.getBody(),win=inst.contentWindow,rng=sel.getRangeAt(0);var rootElm=doc.documentElement,blockName="P",startNode,endNode,startBlock,endBlock;var rngBefore,rngAfter,direct,startNode,startOffset,endNode,endOffset,b=tinyMCE.isOpera?inst.selection.getBookmark():null;var paraBefore,paraAfter,startChop,endChop,contents;function isEmpty(para){function isEmptyHTML(html){return html.replace(new RegExp('[ \t\r\n]+','g'),'').toLowerCase()==""}if(para.getElementsByTagName("img").length>0)return false;if(para.getElementsByTagName("table").length>0)return false;if(para.getElementsByTagName("hr").length>0)return false;var nodes=tinyMCE.getNodeTree(para,new Array(),3);for(var i=0;i <"+blockName+"> ";paraAfter=body.childNodes[1]}inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true}if(startChop.nodeName==blockName)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);rngBefore.setEnd(startNode,startOffset);paraBefore.appendChild(rngBefore.cloneContents());rngAfter.setEndAfter(endChop);rngAfter.setStart(endNode,endOffset);contents=rngAfter.cloneContents();if(contents.firstChild&&contents.firstChild.nodeName==blockName){paraAfter.innerHTML=contents.firstChild.innerHTML}else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML=" ";if(isEmpty(paraAfter))paraAfter.innerHTML=" ";rng=doc.createRange();if(!startChop.previousSibling&&startChop.parentNode.nodeName.toUpperCase()==blockName){rng.setStartBefore(startChop.parentNode)}else{if(rngBefore.startContainer.nodeName.toUpperCase()==blockName&&rngBefore.startOffset==0)rng.setStartBefore(rngBefore.startContainer);else rng.setStart(rngBefore.startContainer,rngBefore.startOffset)}if(!endChop.nextSibling&&endChop.parentNode.nodeName.toUpperCase()==blockName)rng.setEndAfter(endChop.parentNode);else rng.setEnd(rngAfter.endContainer,rngAfter.endOffset);rng.deleteContents();if(tinyMCE.isOpera){rng.insertNode(paraBefore);rng.insertNode(paraAfter)}else{rng.insertNode(paraAfter);rng.insertNode(paraBefore)}paraAfter.normalize();paraBefore.normalize();inst.selection.moveToBookmark(b);inst.selection.selectNode(paraAfter,true,true);return true},_handleBackSpace:function(inst){var r=inst.getRng(),sn=r.startContainer,nv,s=false;if(sn&&sn.nextSibling&&sn.nextSibling.nodeName=="BR"&&sn.parentNode.nodeName!="BODY"){nv=sn.nodeValue;if(nv!=null&&r.startOffset==nv.length)sn.nextSibling.parentNode.removeChild(sn.nextSibling)}if(inst.settings.auto_resize)inst.resizeToContent();return s}};function TinyMCE_Layer(id,bm){this.id=id;this.blockerElement=null;this.events=false;this.element=null;this.blockMode=typeof(bm)!='undefined'?bm:true;this.doc=document};TinyMCE_Layer.prototype={moveRelativeTo:function(re,p){var rep=this.getAbsPosition(re);var w=parseInt(re.offsetWidth);var h=parseInt(re.offsetHeight);var e=this.getElement();var ew=parseInt(e.offsetWidth);var eh=parseInt(e.offsetHeight);var x,y;switch(p){case"tl":x=rep.absLeft;y=rep.absTop;break;case"tr":x=rep.absLeft+w;y=rep.absTop;break;case"bl":x=rep.absLeft;y=rep.absTop+h;break;case"br":x=rep.absLeft+w;y=rep.absTop+h;break;case"cc":x=rep.absLeft+(w/ 2) - (ew /2);y=rep.absTop+(h/ 2) - (eh /2);break}this.moveTo(x,y)},moveBy:function(x,y){var e=this.getElement();this.moveTo(parseInt(e.style.left)+x,parseInt(e.style.top)+y)},moveTo:function(x,y){var e=this.getElement();e.style.left=x+"px";e.style.top=y+"px";this.updateBlocker()},resizeBy:function(w,h){var e=this.getElement();this.resizeTo(parseInt(e.style.width)+w,parseInt(e.style.height)+h)},resizeTo:function(w,h){var e=this.getElement();if(w!=null)e.style.width=w+"px";if(h!=null)e.style.height=h+"px";this.updateBlocker()},show:function(){this.getElement().style.display='block';this.updateBlocker()},hide:function(){this.getElement().style.display='none';this.updateBlocker()},isVisible:function(){return this.getElement().style.display=='block'},getElement:function(){if(!this.element)this.element=this.doc.getElementById(this.id);return this.element},setBlockMode:function(s){this.blockMode=s},updateBlocker:function(){var e,b,x,y,w,h;b=this.getBlocker();if(b){if(this.blockMode){e=this.getElement();x=this.parseInt(e.style.left);y=this.parseInt(e.style.top);w=this.parseInt(e.offsetWidth);h=this.parseInt(e.offsetHeight);b.style.left=x+'px';b.style.top=y+'px';b.style.width=w+'px';b.style.height=h+'px';b.style.display=e.style.display}else b.style.display='none'}},getBlocker:function(){var d,b;if(!this.blockerElement&&this.blockMode){d=this.doc;b=d.getElementById(this.id+"_blocker");if(!b){b=d.createElement("iframe");b.setAttribute('id',this.id+"_blocker");b.style.cssText='display: none; position: absolute; left: 0; top: 0';b.src='javascript:false;';b.frameBorder='0';b.scrolling='no';d.body.appendChild(b)}this.blockerElement=b}return this.blockerElement},getAbsPosition:function(n){var p={absLeft:0,absTop:0};while(n){p.absLeft+=n.offsetLeft;p.absTop+=n.offsetTop;n=n.offsetParent}return p},create:function(n,c,p,h){var d=this.doc,e=d.createElement(n);e.setAttribute('id',this.id);if(c)e.className=c;if(!p)p=d.body;if(h)e.innerHTML=h;p.appendChild(e);return this.element=e},exists:function(){return this.doc.getElementById(this.id)!=null},parseInt:function(s){if(s==null||s=='')return 0;return parseInt(s)}};function TinyMCE_Menu(){var id;if(typeof(tinyMCE.menuCounter)=="undefined")tinyMCE.menuCounter=0;id="mc_menu_"+tinyMCE.menuCounter++;TinyMCE_Layer.call(this,id,true);this.id=id;this.items=new Array();this.needsUpdate=true};TinyMCE_Menu.prototype=tinyMCE.extend(TinyMCE_Layer.prototype,{init:function(s){var n;this.settings={separator_class:'mceMenuSeparator',title_class:'mceMenuTitle',disabled_class:'mceMenuDisabled',menu_class:'mceMenu',drop_menu:true};for(n in s)this.settings[n]=s[n];this.create('div',this.settings.menu_class)},clear:function(){this.items=new Array()},addTitle:function(t){this.add({type:'title',text:t})},addDisabled:function(t){this.add({type:'disabled',text:t})},addSeparator:function(){this.add({type:'separator'})},addItem:function(t,js){this.add({text:t,js:js})},add:function(mi){this.items[this.items.length]=mi;this.needsUpdate=true},update:function(){var e=this.getElement(),h='',i,t,m=this.items,s=this.settings;if(this.settings.drop_menu)h+='';h+='';for(i=0;i'}h+='
';break;case'title':h+='
'+t+'';break;case'disabled':h+='
'+t+'';break;default:h+='
'+t+''}h+='
';e.innerHTML=h;this.needsUpdate=false;this.updateBlocker()},show:function(){var nl,i;if(tinyMCE.lastMenu==this)return;if(this.needsUpdate)this.update();if(tinyMCE.lastMenu&&tinyMCE.lastMenu!=this)tinyMCE.lastMenu.hide();TinyMCE_Layer.prototype.show.call(this);if(!tinyMCE.isOpera){}tinyMCE.lastMenu=this}});if(!Function.prototype.call){Function.prototype.call=function(){var a=arguments,s=a[0],i,as='',r,o;for(i=1;i1?',':'')+'a['+i+']';o=s._fu;s._fu=this;r=eval('s._fu('+as+')');s._fu=o;return r}};TinyMCE_Engine.prototype.debug=function(){var m="",a,i,l=tinyMCE.log.length;for(i=0,a=this.debug.arguments;i'); + + if (tinyMCE.getParam("popups_css_add")) { + c = tinyMCE.getParam("popups_css_add"); + + // Is relative + if (c.indexOf('://') == -1 && c.charAt(0) != '/') + c = tinyMCE.documentBasePath + "/" + c; + + document.write(''); + } + + tinyMCE.addEvent(window, "load", this.onLoad); + }, + + onLoad : function() { + var dir, i, elms, body = document.body; + + if (tinyMCE.getWindowArg('mce_replacevariables', true)) + body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs); + + dir = tinyMCE.selectedInstance.settings['directionality']; + if (dir == "rtl" && document.forms && document.forms.length > 0) { + elms = document.forms[0].elements; + for (i=0; i=0; i--) { + if (wrapper.hasChildNodes()) + wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild); + else + wrapper.appendChild(nodes[i].cloneNode(true)); + + nodes[i].parentNode.removeChild(nodes[i]); + } + + // Add wrapper + doc.body.appendChild(wrapper); + + // Create iframe + iframe = document.createElement("iframe"); + iframe.id = "mcWinIframe"; + iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings['default_document']; + iframe.width = "100%"; + iframe.height = "100%"; + iframe.style.margin = '0'; + + // Add iframe + doc.body.appendChild(iframe); + + // Measure iframe + iframe = document.getElementById('mcWinIframe'); + dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth; + dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight; + + // Resize window + // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy); + window.resizeBy(dx, dy); + + // Hide iframe and show wrapper + body.style.margin = oldMargin; + iframe.style.display = 'none'; + wrapper.style.display = 'block'; + } + }, + + resizeToContent : function() { + var isMSIE = (navigator.appName == "Microsoft Internet Explorer"); + var isOpera = (navigator.userAgent.indexOf("Opera") != -1); + + if (isOpera) + return; + + if (isMSIE) { + try { window.resizeTo(10, 10); } catch (e) {} + + var elm = document.body; + var width = elm.offsetWidth; + var height = elm.offsetHeight; + var dx = (elm.scrollWidth - width) + 4; + var dy = elm.scrollHeight - height; + + try { window.resizeBy(dx, dy); } catch (e) {} + } else { + window.scrollBy(1000, 1000); + if (window.scrollX > 0 || window.scrollY > 0) { + window.resizeBy(window.innerWidth * 2, window.innerHeight * 2); + window.sizeToContent(); + window.scrollTo(0, 0); + var x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0); + var y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0); + window.moveTo(x, y); + } + } + }, + + getWindowArg : function(name, default_value) { + return tinyMCE.getWindowArg(name, default_value); + }, + + restoreSelection : function() { + if (this.storeSelection) { + var inst = tinyMCE.selectedInstance; + + inst.getWin().focus(); + + if (inst.selectionBookmark) + inst.selection.moveToBookmark(inst.selectionBookmark); + } + }, + + execCommand : function(command, user_interface, value) { + var inst = tinyMCE.selectedInstance; + + this.restoreSelection(); + inst.execCommand(command, user_interface, value); + + // Store selection + if (this.storeSelection) + inst.selectionBookmark = inst.selection.getBookmark(true); + }, + + close : function() { + tinyMCE.closeWindow(window); + }, + + pickColor : function(e, element_id) { + tinyMCE.selectedInstance.execCommand('mceColorPicker', true, { + element_id : element_id, + document : document, + window : window, + store_selection : false + }); + }, + + openBrowser : function(element_id, type, option) { + var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback")); + var url = document.getElementById(element_id).value; + + tinyMCE.setWindowArg("window", window); + tinyMCE.setWindowArg("document", document); + + // Call to external callback + if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined") + alert("Callback function: " + cb + " could not be found."); + else + eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);"); + }, + + importClass : function(c) { + window[c] = function() {}; + + for (var n in window.opener[c].prototype) + window[c].prototype[n] = window.opener[c].prototype[n]; + + window[c].constructor = window.opener[c].constructor; + } + + }; + +// Setup global instance +var tinyMCEPopup = new TinyMCE_Popup(); + +tinyMCEPopup.init(); diff --git a/public/javascripts/tiny_mce/tiny_mce_src.js b/public/javascripts/tiny_mce/tiny_mce_src.js new file mode 100755 index 0000000..2a8be73 --- /dev/null +++ b/public/javascripts/tiny_mce/tiny_mce_src.js @@ -0,0 +1,7284 @@ + +/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */ + +function TinyMCE_Engine() { + var ua; + + this.majorVersion = "2"; + this.minorVersion = "0.8"; + this.releaseDate = "2006-10-23"; + + this.instances = new Array(); + this.switchClassCache = new Array(); + this.windowArgs = new Array(); + this.loadedFiles = new Array(); + this.pendingFiles = new Array(); + this.loadingIndex = 0; + this.configs = new Array(); + this.currentConfig = 0; + this.eventHandlers = new Array(); + this.log = new Array(); + this.undoLevels = []; + this.undoIndex = 0; + this.typingUndoIndex = -1; + + // Browser check + ua = navigator.userAgent; + this.isMSIE = (navigator.appName == "Microsoft Internet Explorer"); + this.isMSIE5 = this.isMSIE && (ua.indexOf('MSIE 5') != -1); + this.isMSIE5_0 = this.isMSIE && (ua.indexOf('MSIE 5.0') != -1); + this.isMSIE7 = this.isMSIE && (ua.indexOf('MSIE 7') != -1); + this.isGecko = ua.indexOf('Gecko') != -1; + this.isSafari = ua.indexOf('Safari') != -1; + this.isOpera = ua.indexOf('Opera') != -1; + this.isMac = ua.indexOf('Mac') != -1; + this.isNS7 = ua.indexOf('Netscape/7') != -1; + this.isNS71 = ua.indexOf('Netscape/7.1') != -1; + this.dialogCounter = 0; + this.plugins = new Array(); + this.themes = new Array(); + this.menus = new Array(); + this.loadedPlugins = new Array(); + this.buttonMap = new Array(); + this.isLoaded = false; + + // Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those + if (this.isOpera) { + this.isMSIE = true; + this.isGecko = false; + this.isSafari = false; + } + + this.isIE = this.isMSIE; + this.isRealIE = this.isMSIE && !this.isOpera; + + // TinyMCE editor id instance counter + this.idCounter = 0; +}; + +TinyMCE_Engine.prototype = { + init : function(settings) { + var theme, nl, baseHREF = "", i; + + // IE 5.0x is no longer supported since 5.5, 6.0 and 7.0 now exists. We can't support old browsers forever, sorry. + if (this.isMSIE5_0) + return; + + this.settings = settings; + + // Check if valid browser has execcommand support + if (typeof(document.execCommand) == 'undefined') + return; + + // Get script base path + if (!tinyMCE.baseURL) { + var elements = document.getElementsByTagName('script'); + + // If base element found, add that infront of baseURL + nl = document.getElementsByTagName('base'); + for (i=0; i'); + this._def("font_size_classes", ''); + this._def("font_size_style_values", 'xx-small,x-small,small,medium,large,x-large,xx-large', true); + this._def("event_elements", 'a,img', true); + this._def("convert_urls", true); + this._def("table_inline_editing", false); + this._def("object_resizing", true); + this._def("custom_shortcuts", true); + this._def("convert_on_click", false); + this._def("content_css", ''); + this._def("fix_list_elements", false); + this._def("fix_table_elements", false); + this._def("strict_loading_mode", document.contentType == 'application/xhtml+xml'); + this._def("hidden_tab_class", ''); + this._def("display_tab_class", ''); + this._def("gecko_spellcheck", false); + + // Force strict loading mode to false on non Gecko browsers + if (this.isMSIE && !this.isOpera) + this.settings.strict_loading_mode = false; + + // Browser check IE + if (this.isMSIE && this.settings['browsers'].indexOf('msie') == -1) + return; + + // Browser check Gecko + if (this.isGecko && this.settings['browsers'].indexOf('gecko') == -1) + return; + + // Browser check Safari + if (this.isSafari && this.settings['browsers'].indexOf('safari') == -1) + return; + + // Browser check Opera + if (this.isOpera && this.settings['browsers'].indexOf('opera') == -1) + return; + + // If not super absolute make it so + baseHREF = tinyMCE.settings['document_base_url']; + var h = document.location.href; + var p = h.indexOf('://'); + if (p > 0 && document.location.protocol != "file:") { + p = h.indexOf('/', p + 3); + h = h.substring(0, p); + + if (baseHREF.indexOf('://') == -1) + baseHREF = h + baseHREF; + + tinyMCE.settings['document_base_url'] = baseHREF; + tinyMCE.settings['document_base_prefix'] = h; + } + + // Trim away query part + if (baseHREF.indexOf('?') != -1) + baseHREF = baseHREF.substring(0, baseHREF.indexOf('?')); + + this.settings['base_href'] = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/"; + + theme = this.settings['theme']; + this.inlineStrict = 'A|BR|SPAN|BDO|MAP|OBJECT|IMG|TT|I|B|BIG|SMALL|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|#text|#comment'; + this.inlineTransitional = 'A|BR|SPAN|BDO|OBJECT|APPLET|IMG|MAP|IFRAME|TT|I|B|U|S|STRIKE|BIG|SMALL|FONT|BASEFONT|EM|STRONG|DFN|CODE|Q|SAMP|KBD|VAR|CITE|ABBR|ACRONYM|SUB|SUP|INPUT|SELECT|TEXTAREA|LABEL|BUTTON|#text|#comment'; + this.blockElms = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP'; + this.blockRegExp = new RegExp("^(" + this.blockElms + ")$", "i"); + this.posKeyCodes = new Array(13,45,36,35,33,34,37,38,39,40); + this.uniqueURL = 'javascript:TINYMCE_UNIQUEURL();'; // Make unique URL non real URL + this.uniqueTag = ''; + this.callbacks = new Array('onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup'); + + // Theme url + this.settings['theme_href'] = tinyMCE.baseURL + "/themes/" + theme; + + if (!tinyMCE.isIE || tinyMCE.isOpera) + this.settings['force_br_newlines'] = false; + + if (tinyMCE.getParam("popups_css", false)) { + var cssPath = tinyMCE.getParam("popups_css", ""); + + // Is relative + if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/') + this.settings['popups_css'] = this.documentBasePath + "/" + cssPath; + else + this.settings['popups_css'] = cssPath; + } else + this.settings['popups_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css"; + + if (tinyMCE.getParam("editor_css", false)) { + var cssPath = tinyMCE.getParam("editor_css", ""); + + // Is relative + if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/') + this.settings['editor_css'] = this.documentBasePath + "/" + cssPath; + else + this.settings['editor_css'] = cssPath; + } else { + if (this.settings.editor_css != '') + this.settings['editor_css'] = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css"; + } + + if (tinyMCE.settings['debug']) { + var msg = "Debug: \n"; + + msg += "baseURL: " + this.baseURL + "\n"; + msg += "documentBasePath: " + this.documentBasePath + "\n"; + msg += "content_css: " + this.settings['content_css'] + "\n"; + msg += "popups_css: " + this.settings['popups_css'] + "\n"; + msg += "editor_css: " + this.settings['editor_css'] + "\n"; + + alert(msg); + } + + // Only do this once + if (this.configs.length == 0) { + if (typeof(TinyMCECompressed) == "undefined") { + tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCE_Engine.prototype.onLoad); + + if (tinyMCE.isRealIE) { + if (document.body) + tinyMCE.addEvent(document.body, "readystatechange", TinyMCE_Engine.prototype.onLoad); + else + tinyMCE.addEvent(document, "readystatechange", TinyMCE_Engine.prototype.onLoad); + } + + tinyMCE.addEvent(window, "load", TinyMCE_Engine.prototype.onLoad); + tinyMCE._addUnloadEvents(); + } + } + + this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings['theme'] + '/editor_template' + tinyMCE.srcMode + '.js'); + this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings['language'] + '.js'); + this.loadCSS(this.settings['editor_css']); + + // Add plugins + var p = tinyMCE.getParam('plugins', '', true, ','); + if (p.length > 0) { + for (var i=0; i'); + + this.loadedFiles[this.loadedFiles.length] = url; + }, + + loadNextScript : function() { + var d = document, se; + + if (!tinyMCE.settings.strict_loading_mode) + return; + + if (this.loadingIndex < this.pendingFiles.length) { + se = d.createElementNS('http://www.w3.org/1999/xhtml', 'script'); + se.setAttribute('language', 'javascript'); + se.setAttribute('type', 'text/javascript'); + se.setAttribute('src', this.pendingFiles[this.loadingIndex++]); + + d.getElementsByTagName("head")[0].appendChild(se); + } else + this.loadingIndex = -1; // Done with loading + }, + + loadCSS : function(url) { + var ar = url.replace(/\s+/, '').split(','); + var lflen = 0, csslen = 0; + var skip = false; + var x = 0, i = 0, nl, le; + + for (x = 0,csslen = ar.length; x 0) { + /* Make sure it doesn't exist. */ + for (i=0, lflen=this.loadedFiles.length; i'); + + this.loadedFiles[this.loadedFiles.length] = ar[x]; + } + } + } + }, + + importCSS : function(doc, css) { + var css_ary = css.replace(/\s+/, '').split(','); + var csslen, elm, headArr, x, css_file; + + for (x = 0, csslen = css_ary.length; x 0) { + // Is relative, make absolute + if (css_file.indexOf('://') == -1 && css_file.charAt(0) != '/') + css_file = this.documentBasePath + "/" + css_file; + + if (typeof(doc.createStyleSheet) == "undefined") { + elm = doc.createElement("link"); + + elm.rel = "stylesheet"; + elm.href = css_file; + + if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0) + headArr[0].appendChild(elm); + } else + doc.createStyleSheet(css_file); + } + } + }, + + confirmAdd : function(e, settings) { + var elm = tinyMCE.isIE ? event.srcElement : e.target; + var elementId = elm.name ? elm.name : elm.id; + + tinyMCE.settings = settings; + + if (tinyMCE.settings['convert_on_click'] || (!elm.getAttribute('mce_noask') && confirm(tinyMCELang['lang_edit_confirm']))) + tinyMCE.addMCEControl(elm, elementId); + + elm.setAttribute('mce_noask', 'true'); + }, + + updateContent : function(form_element_name) { + // Find MCE instance linked to given form element and copy it's value + var formElement = document.getElementById(form_element_name); + for (var n in tinyMCE.instances) { + var inst = tinyMCE.instances[n]; + if (!tinyMCE.isInstance(inst)) + continue; + + inst.switchSettings(); + + if (inst.formElement == formElement) { + var doc = inst.getDoc(); + + tinyMCE._setHTML(doc, inst.formElement.value); + + if (!tinyMCE.isIE) + doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, this.settings, doc.body, inst.visualAid); + } + } + }, + + addMCEControl : function(replace_element, form_element_name, target_document) { + var id = "mce_editor_" + tinyMCE.idCounter++; + var inst = new TinyMCE_Control(tinyMCE.settings); + + inst.editorId = id; + this.instances[id] = inst; + + inst._onAdd(replace_element, form_element_name, target_document); + }, + + removeInstance : function(ti) { + var t = [], n, i; + + // Remove from instances + for (n in tinyMCE.instances) { + i = tinyMCE.instances[n]; + + if (tinyMCE.isInstance(i) && ti != i) + t[n] = i; + } + + tinyMCE.instances = t; + + // Remove from global undo/redo + n = []; + t = tinyMCE.undoLevels; + + for (i=0; i 0) { + tinyMCE.nextUndoRedoAction = 'Undo'; + inst = this.undoLevels[--this.undoIndex]; + inst.select(); + + if (!tinyMCE.nextUndoRedoInstanceId) + inst.execCommand('Undo'); + } + } else + inst.execCommand('Undo'); + return true; + + case "Redo": + if (this.getParam('custom_undo_redo_global')) { + if (this.undoIndex <= this.undoLevels.length - 1) { + tinyMCE.nextUndoRedoAction = 'Redo'; + inst = this.undoLevels[this.undoIndex++]; + inst.select(); + + if (!tinyMCE.nextUndoRedoInstanceId) + inst.execCommand('Redo'); + } + } else + inst.execCommand('Redo'); + + return true; + + case 'mceFocus': + var inst = tinyMCE.getInstanceById(value); + if (inst) + inst.getWin().focus(); + return; + + case "mceAddControl": + case "mceAddEditor": + tinyMCE.addMCEControl(tinyMCE._getElementById(value), value); + return; + + case "mceAddFrameControl": + tinyMCE.addMCEControl(tinyMCE._getElementById(value['element'], value['document']), value['element'], value['document']); + return; + + case "mceRemoveControl": + case "mceRemoveEditor": + tinyMCE.removeMCEControl(value); + return; + + case "mceResetDesignMode": + // Resets the designmode state of the editors in Gecko + if (!tinyMCE.isIE) { + for (var n in tinyMCE.instances) { + if (!tinyMCE.isInstance(tinyMCE.instances[n])) + continue; + + try { + tinyMCE.instances[n].getDoc().designMode = "on"; + } catch (e) { + // Ignore any errors + } + } + } + + return; + } + + if (inst) { + inst.execCommand(command, user_interface, value); + } else if (tinyMCE.settings['focus_alert']) + alert(tinyMCELang['lang_focus_alert']); + }, + + _createIFrame : function(replace_element, doc, win) { + var iframe, id = replace_element.getAttribute("id"); + var aw, ah; + + if (typeof(doc) == "undefined") + doc = document; + + if (typeof(win) == "undefined") + win = window; + + iframe = doc.createElement("iframe"); + + aw = "" + tinyMCE.settings['area_width']; + ah = "" + tinyMCE.settings['area_height']; + + if (aw.indexOf('%') == -1) { + aw = parseInt(aw); + aw = (isNaN(aw) || aw < 0) ? 300 : aw; + aw = aw + "px"; + } + + if (ah.indexOf('%') == -1) { + ah = parseInt(ah); + ah = (isNaN(ah) || ah < 0) ? 240 : ah; + ah = ah + "px"; + } + + iframe.setAttribute("id", id); + iframe.setAttribute("name", id); + iframe.setAttribute("class", "mceEditorIframe"); + iframe.setAttribute("border", "0"); + iframe.setAttribute("frameBorder", "0"); + iframe.setAttribute("marginWidth", "0"); + iframe.setAttribute("marginHeight", "0"); + iframe.setAttribute("leftMargin", "0"); + iframe.setAttribute("topMargin", "0"); + iframe.setAttribute("width", aw); + iframe.setAttribute("height", ah); + iframe.setAttribute("allowtransparency", "true"); + iframe.className = 'mceEditorIframe'; + + if (tinyMCE.settings["auto_resize"]) + iframe.setAttribute("scrolling", "no"); + + // Must have a src element in MSIE HTTPs breaks aswell as absoute URLs + if (tinyMCE.isRealIE) + iframe.setAttribute("src", this.settings['default_document']); + + iframe.style.width = aw; + iframe.style.height = ah; + + // Ugly hack for Gecko problem in strict mode + if (tinyMCE.settings.strict_loading_mode) + iframe.style.marginBottom = '-5px'; + + // MSIE 5.0 issue + if (tinyMCE.isRealIE) + replace_element.outerHTML = iframe.outerHTML; + else + replace_element.parentNode.replaceChild(iframe, replace_element); + + if (tinyMCE.isRealIE) + return win.frames[id]; + else + return iframe; + }, + + setupContent : function(editor_id) { + var inst = tinyMCE.instances[editor_id], i; + var doc = inst.getDoc(); + var head = doc.getElementsByTagName('head').item(0); + var content = inst.startContent; + + // HTML values get XML encoded in strict mode + if (tinyMCE.settings.strict_loading_mode) { + content = content.replace(/</g, '<'); + content = content.replace(/>/g, '>'); + content = content.replace(/"/g, '"'); + content = content.replace(/&/g, '&'); + } + + inst.switchSettings(); + + // Not loaded correctly hit it again, Mozilla bug #997860 + if (!tinyMCE.isIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") { + // This part will remove the designMode status + // Failes first time in Firefox 1.5b2 on Mac + try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {} + window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000); + return; + } + + if (!head) { + window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10); + return; + } + + // Import theme specific content CSS the user specific + tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings['theme'] + "/css/editor_content.css"); + tinyMCE.importCSS(inst.getDoc(), inst.settings['content_css']); + tinyMCE.dispatchCallback(inst, 'init_instance_callback', 'initInstance', inst); + + // Setup keyboard shortcuts + if (tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')) { + inst.addShortcut('ctrl', 'z', 'lang_undo_desc', 'Undo'); + inst.addShortcut('ctrl', 'y', 'lang_redo_desc', 'Redo'); + } + + // BlockFormat shortcuts keys + for (i=1; i<=6; i++) + inst.addShortcut('ctrl', '' + i, '', 'FormatBlock', false, ''); + + inst.addShortcut('ctrl', '7', '', 'FormatBlock', false, '

'); + inst.addShortcut('ctrl', '8', '', 'FormatBlock', false, '

'); + inst.addShortcut('ctrl', '9', '', 'FormatBlock', false, '
'); + + // Add default shortcuts for gecko + if (tinyMCE.isGecko) { + inst.addShortcut('ctrl', 'b', 'lang_bold_desc', 'Bold'); + inst.addShortcut('ctrl', 'i', 'lang_italic_desc', 'Italic'); + inst.addShortcut('ctrl', 'u', 'lang_underline_desc', 'Underline'); + } + + // Setup span styles + if (tinyMCE.getParam("convert_fonts_to_spans")) + inst.getBody().setAttribute('id', 'mceSpanFonts'); + + if (tinyMCE.settings['nowrap']) + doc.body.style.whiteSpace = "nowrap"; + + doc.body.dir = this.settings['directionality']; + doc.editorId = editor_id; + + // Add on document element in Mozilla + if (!tinyMCE.isIE) + doc.documentElement.editorId = editor_id; + + inst.setBaseHREF(tinyMCE.settings['base_href']); + + // Replace new line characters to BRs + if (tinyMCE.settings['convert_newlines_to_brs']) { + content = tinyMCE.regexpReplace(content, "\r\n", "
", "gi"); + content = tinyMCE.regexpReplace(content, "\r", "
", "gi"); + content = tinyMCE.regexpReplace(content, "\n", "
", "gi"); + } + + // Open closed anchors + // content = content.replace(new RegExp('', 'gi'), ''); + + // Call custom cleanup code + content = tinyMCE.storeAwayURLs(content); + content = tinyMCE._customCleanup(inst, "insert_to_editor", content); + + if (tinyMCE.isIE) { + // Ugly!!! + window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["' + editor_id + '"].getDoc(), "' + editor_id + '");}catch(e){}', 500); + + if (tinyMCE.settings["force_br_newlines"]) + doc.styleSheets[0].addRule("p", "margin: 0;"); + + var body = inst.getBody(); + body.editorId = editor_id; + } + + content = tinyMCE.cleanupHTMLCode(content); + + // Fix for bug #958637 + if (!tinyMCE.isIE) { + var contentElement = inst.getDoc().createElement("body"); + var doc = inst.getDoc(); + + contentElement.innerHTML = content; + + // Remove weridness! + if (tinyMCE.isGecko && tinyMCE.settings['remove_lt_gt']) + content = content.replace(new RegExp('<>', 'g'), ""); + + if (tinyMCE.settings['cleanup_on_startup']) + tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement)); + else + tinyMCE.setInnerHTML(inst.getBody(), content); + + tinyMCE.convertAllRelativeURLs(inst.getBody()); + } else { + if (tinyMCE.settings['cleanup_on_startup']) { + tinyMCE._setHTML(inst.getDoc(), content); + + // Produces permission denied error in MSIE 5.5 + eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}'); + } else + tinyMCE._setHTML(inst.getDoc(), content); + } + + // Fix for bug #957681 + //inst.getDoc().designMode = inst.getDoc().designMode; + + // Setup element references + var parentElm = inst.targetDoc.getElementById(inst.editorId + '_parent'); + inst.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling; + + tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual'], inst); + tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc()); + + // Re-add design mode on mozilla + if (!tinyMCE.isIE) + tinyMCE.addEventHandlers(inst); + + // Add blur handler + if (tinyMCE.isIE) { + tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE_Engine.prototype._eventPatch); + tinyMCE.addEvent(inst.getBody(), "beforedeactivate", TinyMCE_Engine.prototype._eventPatch); // Bug #1439953 + + // Workaround for drag drop/copy paste base href bug + if (!tinyMCE.isOpera) { + tinyMCE.addEvent(doc.body, "mousemove", TinyMCE_Engine.prototype.onMouseMove); + tinyMCE.addEvent(doc.body, "beforepaste", TinyMCE_Engine.prototype._eventPatch); + tinyMCE.addEvent(doc.body, "drop", TinyMCE_Engine.prototype._eventPatch); + } + } + + // Trigger node change, this call locks buttons for tables and so forth + inst.select(); + tinyMCE.selectedElement = inst.contentWindow.document.body; + + // Call custom DOM cleanup + tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody()); + tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody()); + tinyMCE._setEventsEnabled(inst.getBody(), false); + tinyMCE.cleanupAnchors(inst.getDoc()); + + if (tinyMCE.getParam("convert_fonts_to_spans")) + tinyMCE.convertSpansToFonts(inst.getDoc()); + + inst.startContent = tinyMCE.trim(inst.getBody().innerHTML); + inst.undoRedo.add({ content : inst.startContent }); + + // Cleanup any mess left from storyAwayURLs + if (tinyMCE.isGecko) { + // Remove mce_src from textnodes and comments + tinyMCE.selectNodes(inst.getBody(), function(n) { + if (n.nodeType == 3 || n.nodeType == 8) + n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), ""); + + return false; + }); + } + + // Remove Gecko spellchecking + if (tinyMCE.isGecko) + inst.getBody().spellcheck = tinyMCE.getParam("gecko_spellcheck"); + + // Cleanup any mess left from storyAwayURLs + tinyMCE._removeInternal(inst.getBody()); + + inst.select(); + tinyMCE.triggerNodeChange(false, true); + }, + + storeAwayURLs : function(s) { + // Remove all mce_src, mce_href and replace them with new ones + // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), ''); + // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), ''); + + if (!s.match(/(mce_src|mce_href)/gi, s)) { + s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"'); + s = s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'href="$1" mce_href="$1"'); + } + + return s; + }, + + _removeInternal : function(n) { + if (tinyMCE.isGecko) { + // Remove mce_src from textnodes and comments + tinyMCE.selectNodes(n, function(n) { + if (n.nodeType == 3 || n.nodeType == 8) + n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), ""); + + return false; + }); + } + }, + + handleEvent : function(e) { + var inst = tinyMCE.selectedInstance; + + // Remove odd, error + if (typeof(tinyMCE) == "undefined") + return true; + + //tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : "")); + + if (tinyMCE.executeCallback(tinyMCE.selectedInstance, 'handle_event_callback', 'handleEvent', e)) + return false; + + switch (e.type) { + case "beforedeactivate": // Was added due to bug #1439953 + case "blur": + if (tinyMCE.selectedInstance) + tinyMCE.selectedInstance.execCommand('mceEndTyping'); + + tinyMCE.hideMenus(); + + return; + + // Workaround for drag drop/copy paste base href bug + case "drop": + case "beforepaste": + if (tinyMCE.selectedInstance) + tinyMCE.selectedInstance.setBaseHREF(null); + + // Fixes odd MSIE bug where drag/droping elements in a iframe with height 100% breaks + // This logic forces the width/height to be in pixels while the user is drag/dropping + if (tinyMCE.isRealIE) { + var ife = tinyMCE.selectedInstance.iframeElement; + + /*if (ife.style.width.indexOf('%') != -1) { + ife._oldWidth = ife.width.height; + ife.style.width = ife.clientWidth; + }*/ + + if (ife.style.height.indexOf('%') != -1) { + ife._oldHeight = ife.style.height; + ife.style.height = ife.clientHeight; + } + } + + window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings['base_href']);tinyMCE._resetIframeHeight();", 1); + return; + + case "submit": + tinyMCE.triggerSave(); + tinyMCE.isNotDirty = true; + return; + + case "reset": + var formObj = tinyMCE.isIE ? window.event.srcElement : e.target; + + for (var i=0; i"); + rng.collapse(false); + rng.select(); + + tinyMCE.execCommand("mceAddUndoLevel"); + tinyMCE.triggerNodeChange(false); + return false; + } + } + + // Backspace or delete + if (e.keyCode == 8 || e.keyCode == 46) { + tinyMCE.selectedElement = e.target; + tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a"); + tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img"); + tinyMCE.triggerNodeChange(false); + } + + return false; + break; + + case "keyup": + case "keydown": + tinyMCE.hideMenus(); + tinyMCE.hasMouseMoved = false; + + if (inst && inst.handleShortcut(e)) + return false; + + if (e.target.editorId) + tinyMCE.instances[e.target.editorId].select(); + + if (tinyMCE.selectedInstance) + tinyMCE.selectedInstance.switchSettings(); + + var inst = tinyMCE.selectedInstance; + + // Handle backspace + if (tinyMCE.isGecko && tinyMCE.settings['force_p_newlines'] && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) { + // Insert P element instead of BR + if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) { + // Cancel event + tinyMCE.execCommand("mceAddUndoLevel"); + e.preventDefault(); + return false; + } + } + + tinyMCE.selectedElement = null; + tinyMCE.selectedNode = null; + var elm = tinyMCE.selectedInstance.getFocusElement(); + tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a"); + tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img"); + tinyMCE.selectedElement = elm; + + // Update visualaids on tabs + if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9) + tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings['visual'], tinyMCE.selectedInstance); + + // Fix empty elements on return/enter, check where enter occured + if (tinyMCE.isIE && e.type == "keydown" && e.keyCode == 13) + tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement(); + + // Fix empty elements on return/enter + if (tinyMCE.isIE && e.type == "keyup" && e.keyCode == 13) { + var elm = tinyMCE.enterKeyElement; + if (elm) { + var re = new RegExp('^HR|IMG|BR$','g'); // Skip these + var dre = new RegExp('^H[1-6]$','g'); // Add double on these + + if (!elm.hasChildNodes() && !re.test(elm.nodeName)) { + if (dre.test(elm.nodeName)) + elm.innerHTML = "  "; + else + elm.innerHTML = " "; + } + } + } + + // Check if it's a position key + var keys = tinyMCE.posKeyCodes; + var posKey = false; + for (var i=0; i'; + h += ''; + h += ''; + } else { + // Normal button + h += ''; + h += ''; + h += ''; + } + + return h; + }, + + getMenuButtonHTML : function(id, lang, img, mcmd, cmd, ui, val) { + var h = '', m, x; + + mcmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + mcmd + '\');'; + cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\''; + + if (typeof(ui) != "undefined" && ui != null) + cmd += ',' + ui; + + if (typeof(val) != "undefined" && val != null) + cmd += ",'" + val + "'"; + + cmd += ');'; + + // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled + if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = tinyMCE.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) { + x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20); + + if (tinyMCE.isRealIE) + h += ''; + else + h += ''; + + h += ''; + h += ''; + h += ''; + h += ''; + } else { + if (tinyMCE.isRealIE) + h += ''; + else + h += ''; + + h += ''; + h += ''; + h += ''; + h += ''; + } + + return h; + }, + + _menuButtonEvent : function(e, o) { + if (o.className == 'mceMenuButtonFocus') + return; + + if (e == 'over') + o.className = o.className + ' mceMenuHover'; + else + o.className = o.className.replace(/\s.*$/, ''); + }, + + addButtonMap : function(m) { + var i, a = m.replace(/\s+/, '').split(','); + + for (i=0; i 0); + + if (tinyMCE.settings['custom_undo_redo']) { + undoIndex = inst.undoRedo.undoIndex; + undoLevels = inst.undoRedo.undoLevels.length; + } + + tinyMCE.dispatchCallback(inst, 'handle_node_change_callback', 'handleNodeChange', editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content); + } + + if (this.selectedInstance && (typeof(focus) == "undefined" || focus)) + this.selectedInstance.contentWindow.focus(); + }, + + _customCleanup : function(inst, type, content) { + var pl, po, i; + + // Call custom cleanup + var customCleanup = tinyMCE.settings['cleanup_callback']; + if (customCleanup != "" && eval("typeof(" + customCleanup + ")") != "undefined") + content = eval(customCleanup + "(type, content, inst);"); + + // Trigger theme cleanup + po = tinyMCE.themes[tinyMCE.settings['theme']]; + if (po && po.cleanup) + content = po.cleanup(type, content, inst); + + // Trigger plugin cleanups + pl = inst.plugins; + for (i=0; i 0) + className += " "; + + className += classNames[i]; + } + + return className; + }, + + handleVisualAid : function(el, deep, state, inst, skip_dispatch) { + if (!el) + return; + + if (!skip_dispatch) + tinyMCE.dispatchCallback(inst, 'handle_visual_aid_callback', 'handleVisualAid', el, deep, state, inst); + + var tableElement = null; + + switch (el.nodeName) { + case "TABLE": + var oldW = el.style.width; + var oldH = el.style.height; + var bo = tinyMCE.getAttrib(el, "border"); + + bo = bo == "" || bo == "0" ? true : false; + + tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo)); + + el.style.width = oldW; + el.style.height = oldH; + + for (var y=0; y<\/o:p>", "
"); + html = tinyMCE.regexpReplace(html, " <\/o:p>", ""); + html = tinyMCE.regexpReplace(html, "", ""); + html = tinyMCE.regexpReplace(html, "

<\/p>", ""); + html = tinyMCE.regexpReplace(html, "

<\/p>\r\n

<\/p>", ""); + html = tinyMCE.regexpReplace(html, "

 <\/p>", "
"); + html = tinyMCE.regexpReplace(html, "

\s*(

\s*)?", "

"); + html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "

"); + }*/ + + // Always set the htmlText output + tinyMCE.setInnerHTML(doc.body, html); + } + + tinyMCE.cleanupAnchors(doc); + + if (tinyMCE.getParam("convert_fonts_to_spans")) + tinyMCE.convertSpansToFonts(doc); + }, + + getEditorId : function(form_element) { + var inst = this.getInstanceById(form_element); + if (!inst) + return null; + + return inst.editorId; + }, + + getInstanceById : function(editor_id) { + var inst = this.instances[editor_id]; + if (!inst) { + for (var n in tinyMCE.instances) { + var instance = tinyMCE.instances[n]; + if (!tinyMCE.isInstance(instance)) + continue; + + if (instance.formTargetElementId == editor_id) { + inst = instance; + break; + } + } + } + + return inst; + }, + + queryInstanceCommandValue : function(editor_id, command) { + var inst = tinyMCE.getInstanceById(editor_id); + if (inst) + return inst.queryCommandValue(command); + + return false; + }, + + queryInstanceCommandState : function(editor_id, command) { + var inst = tinyMCE.getInstanceById(editor_id); + if (inst) + return inst.queryCommandState(command); + + return null; + }, + + setWindowArg : function(n, v) { + this.windowArgs[n] = v; + }, + + getWindowArg : function(n, d) { + return (typeof(this.windowArgs[n]) == "undefined") ? d : this.windowArgs[n]; + }, + + getCSSClasses : function(editor_id, doc) { + var output = new Array(); + + // Is cached, use that + if (typeof(tinyMCE.cssClasses) != "undefined") + return tinyMCE.cssClasses; + + if (typeof(editor_id) == "undefined" && typeof(doc) == "undefined") { + var instance; + + for (var instanceName in tinyMCE.instances) { + instance = tinyMCE.instances[instanceName]; + if (!tinyMCE.isInstance(instance)) + continue; + + break; + } + + doc = instance.getDoc(); + } + + if (typeof(doc) == "undefined") { + var instance = tinyMCE.getInstanceById(editor_id); + doc = instance.getDoc(); + } + + if (doc) { + var styles = doc.styleSheets; + + if (styles && styles.length > 0) { + for (var x=0; x 0) + tinyMCE.cssClasses = output; + + return output; + }, + + regexpReplace : function(in_str, reg_exp, replace_str, opts) { + if (in_str == null) + return in_str; + + if (typeof(opts) == "undefined") + opts = 'g'; + + var re = new RegExp(reg_exp, opts); + return in_str.replace(re, replace_str); + }, + + trim : function(s) { + return s.replace(/^\s*|\s*$/g, ""); + }, + + cleanupEventStr : function(s) { + s = "" + s; + s = s.replace('function anonymous()\n{\n', ''); + s = s.replace('\n}', ''); + s = s.replace(/^return true;/gi, ''); // Remove event blocker + + return s; + }, + + getControlHTML : function(c) { + var i, l, n, o, v; + + l = tinyMCE.plugins; + for (n in l) { + o = l[n]; + + if (o.getControlHTML && (v = o.getControlHTML(c)) != '') + return tinyMCE.replaceVar(v, "pluginurl", o.baseURL); + } + + o = tinyMCE.themes[tinyMCE.settings['theme']]; + if (o.getControlHTML && (v = o.getControlHTML(c)) != '') + return v; + + return ''; + }, + + evalFunc : function(f, idx, a, o) { + var s = '(', i; + + for (i=idx; i 0) + return true; + + if (ins != null) { + for (i=0, l = ins.plugins; i 0) + return true; + } + } + + l = tinyMCE.themes; + for (on in l) { + o = l[on]; + + if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0) + return true; + } + + return false; + }, + + xmlEncode : function(s) { + return s ? ('' + s).replace(new RegExp('[<>&"\']', 'g'), function (c, b) { + switch (c) { + case '&': + return '&'; + + case '"': + return '"'; + + case '\'': + return '''; // ' is not working in MSIE + + case '<': + return '<'; + + case '>': + return '>'; + } + + return c; + }) : s; + }, + + extend : function(p, np) { + var o = {}; + + o.parent = p; + + for (n in p) + o[n] = p[n]; + + for (n in np) + o[n] = np[n]; + + return o; + }, + + hideMenus : function() { + var e = tinyMCE.lastSelectedMenuBtn; + + if (tinyMCE.lastMenu) { + tinyMCE.lastMenu.hide(); + tinyMCE.lastMenu = null; + } + + if (e) { + tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass); + tinyMCE.lastSelectedMenuBtn = null; + } + } + + }; + +// Global instances +var TinyMCE = TinyMCE_Engine; // Compatiblity with gzip compressors +var tinyMCE = new TinyMCE_Engine(); +var tinyMCELang = {}; + +/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */ + +function TinyMCE_Control(settings) { + var t, i, to, fu, p, x, fn, fu, pn, s = settings; + + this.undoRedoLevel = true; + this.isTinyMCE_Control = true; + + // Default settings + this.settings = s; + this.settings['theme'] = tinyMCE.getParam("theme", "default"); + this.settings['width'] = tinyMCE.getParam("width", -1); + this.settings['height'] = tinyMCE.getParam("height", -1); + this.selection = new TinyMCE_Selection(this); + this.undoRedo = new TinyMCE_UndoRedo(this); + this.cleanup = new TinyMCE_Cleanup(); + this.shortcuts = new Array(); + this.hasMouseMoved = false; + this.foreColor = this.backColor = "#999999"; + this.data = {}; + + this.cleanup.init({ + valid_elements : s.valid_elements, + extended_valid_elements : s.extended_valid_elements, + valid_child_elements : s.valid_child_elements, + entities : s.entities, + entity_encoding : s.entity_encoding, + debug : s.cleanup_debug, + url_converter : 'TinyMCE_Cleanup.prototype._urlConverter', + indent : s.apply_source_formatting, + invalid_elements : s.invalid_elements, + verify_html : s.verify_html, + fix_content_duplication : s.fix_content_duplication + }); + + // Wrap old theme + t = this.settings['theme']; + if (!tinyMCE.hasTheme(t)) { + fn = tinyMCE.callbacks; + to = {}; + + for (i=0; i 0) { + for (i=0; i 1 && tinyMCE.currentConfig != this.settings['index']) { + tinyMCE.settings = this.settings; + tinyMCE.currentConfig = this.settings['index']; + } + }, + + select : function() { + var oldInst = tinyMCE.selectedInstance; + + if (oldInst != this) { + if (oldInst) + oldInst.execCommand('mceEndTyping'); + + tinyMCE.dispatchCallback(this, 'select_instance_callback', 'selectInstance', this, oldInst); + tinyMCE.selectedInstance = this; + } + }, + + getBody : function() { + return this.contentBody ? this.contentBody : this.getDoc().body; + }, + + getDoc : function() { +// return this.contentDocument ? this.contentDocument : this.contentWindow.document; // Removed due to IE 5.5 ? + return this.contentWindow.document; + }, + + getWin : function() { + return this.contentWindow; + }, + + getContainerWin : function() { + return this.containerWindow ? this.containerWindow : window; + }, + + getViewPort : function() { + return tinyMCE.getViewPort(this.getWin()); + }, + + getParentNode : function(n, f) { + return tinyMCE.getParentNode(n, f, this.getBody()); + }, + + getParentElement : function(n, na, f) { + return tinyMCE.getParentElement(n, na, f, this.getBody()); + }, + + getParentBlockElement : function(n) { + return tinyMCE.getParentBlockElement(n, this.getBody()); + }, + + resizeToContent : function() { + var d = this.getDoc(), b = d.body, de = d.documentElement; + + this.iframeElement.style.height = (tinyMCE.isRealIE) ? b.scrollHeight : de.offsetHeight + 'px'; + }, + + addShortcut : function(m, k, d, cmd, ui, va) { + var n = typeof(k) == "number", ie = tinyMCE.isIE, c, sc, i, scl = this.shortcuts; + + if (!tinyMCE.getParam('custom_shortcuts')) + return false; + + m = m.toLowerCase(); + k = ie && !n ? k.toUpperCase() : k; + c = n ? null : k.charCodeAt(0); + d = d && d.indexOf('lang_') == 0 ? tinyMCE.getLang(d) : d; + + sc = { + alt : m.indexOf('alt') != -1, + ctrl : m.indexOf('ctrl') != -1, + shift : m.indexOf('shift') != -1, + charCode : c, + keyCode : n ? k : (ie ? c : null), + desc : d, + cmd : cmd, + ui : ui, + val : va + }; + + for (i=0; i 0) + rng.pasteHTML('
' + rng.htmlText + "
"); + + tinyMCE.triggerNodeChange(); + return; + } + } + } + + switch (command) { + case "mceRepaint": + this.repaint(); + return true; + + case "unlink": + // Unlink if caret is inside link + if (tinyMCE.isGecko && this.getSel().isCollapsed) { + focusElm = tinyMCE.getParentElement(focusElm, 'A'); + + if (focusElm) + this.selection.selectNode(focusElm, false); + } + + this.getDoc().execCommand(command, user_interface, value); + + tinyMCE.isGecko && this.getSel().collapseToEnd(); + + tinyMCE.triggerNodeChange(); + + return true; + + case "FormatBlock": + if (!this.cleanup.isValid(value)) + return true; + + this.getDoc().execCommand(command, user_interface, value); + tinyMCE.triggerNodeChange(); + break; + + case "InsertUnorderedList": + case "InsertOrderedList": + this.getDoc().execCommand(command, user_interface, value); + tinyMCE.triggerNodeChange(); + break; + + case "Strikethrough": + this.getDoc().execCommand(command, user_interface, value); + tinyMCE.triggerNodeChange(); + break; + + case "mceSelectNode": + this.selection.selectNode(value); + tinyMCE.triggerNodeChange(); + tinyMCE.selectedNode = value; + break; + + case "FormatBlock": + if (value == null || value == "") { + var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp"); + + if (elm) + this.execCommand("mceRemoveNode", false, elm); + } else { + if (tinyMCE.isGecko && new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>', 'gi').test(value)) + value = value.replace(/[^a-z]/gi, ''); + + if (tinyMCE.isIE && new RegExp('blockquote|code|samp', 'gi').test(value)) { + var b = this.selection.getBookmark(); + this.getDoc().execCommand("FormatBlock", false, '

'); + tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()), value); + this.selection.moveToBookmark(b); + } else + this.getDoc().execCommand("FormatBlock", false, value); + } + + tinyMCE.triggerNodeChange(); + + break; + + case "mceRemoveNode": + if (!value) + value = tinyMCE.getParentElement(this.getFocusElement()); + + if (tinyMCE.isIE) { + value.outerHTML = value.innerHTML; + } else { + var rng = value.ownerDocument.createRange(); + rng.setStartBefore(value); + rng.setEndAfter(value); + rng.deleteContents(); + rng.insertNode(rng.createContextualFragment(value.innerHTML)); + } + + tinyMCE.triggerNodeChange(); + + break; + + case "mceSelectNodeDepth": + var parentNode = this.getFocusElement(); + for (var i=0; parentNode; i++) { + if (parentNode.nodeName.toLowerCase() == "body") + break; + + if (parentNode.nodeName.toLowerCase() == "#text") { + i--; + parentNode = parentNode.parentNode; + continue; + } + + if (i == value) { + this.selection.selectNode(parentNode, false); + tinyMCE.triggerNodeChange(); + tinyMCE.selectedNode = parentNode; + return; + } + + parentNode = parentNode.parentNode; + } + + break; + + case "SetStyleInfo": + var rng = this.getRng(); + var sel = this.getSel(); + var scmd = value['command']; + var sname = value['name']; + var svalue = value['value'] == null ? '' : value['value']; + //var svalue = value['value'] == null ? '' : value['value']; + var wrapper = value['wrapper'] ? value['wrapper'] : "span"; + var parentElm = null; + var invalidRe = new RegExp("^BODY|HTML$", "g"); + var invalidParentsRe = tinyMCE.settings['merge_styles_invalid_parents'] != '' ? new RegExp(tinyMCE.settings['merge_styles_invalid_parents'], "gi") : null; + + // Whole element selected check + if (tinyMCE.isIE) { + // Control range + if (rng.item) + parentElm = rng.item(0); + else { + var pelm = rng.parentElement(); + var prng = doc.selection.createRange(); + prng.moveToElementText(pelm); + + if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) { + if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName)) + parentElm = pelm; + } + } + } else { + var felm = this.getFocusElement(); + if (sel.isCollapsed || (new RegExp('td|tr|tbody|table', 'gi').test(felm.nodeName) && sel.anchorNode == felm.parentNode)) + parentElm = felm; + } + + // Whole element selected + if (parentElm && !invalidRe.test(parentElm.nodeName)) { + if (scmd == "setstyle") + tinyMCE.setStyleAttrib(parentElm, sname, svalue); + + if (scmd == "setattrib") + tinyMCE.setAttrib(parentElm, sname, svalue); + + if (scmd == "removeformat") { + parentElm.style.cssText = ''; + tinyMCE.setAttrib(parentElm, 'class', ''); + } + + // Remove style/attribs from all children + var ch = tinyMCE.getNodeTree(parentElm, new Array(), 1); + for (var z=0; z=0; i--) { + var elm = nodes[i]; + var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true"; + + elm.removeAttribute("mce_new"); + + // Is only child a element + if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) { + //tinyMCE.debug("merge1" + isNew); + this._mergeElements(scmd, elm, elm.childNodes[0], isNew); + continue; + } + + // Is I the only child + if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) { + //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName); + if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName)) + this._mergeElements(scmd, elm.parentNode, elm, false); + } + } + + // Remove empty wrappers + var nodes = doc.getElementsByTagName(wrapper); + for (var i=nodes.length-1; i>=0; i--) { + var elm = nodes[i]; + var isEmpty = true; + + // Check if it has any attribs + var tmp = doc.createElement("body"); + tmp.appendChild(elm.cloneNode(false)); + + // Is empty span, remove it + tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), ''); + //tinyMCE.debug(tmp.innerHTML); + if (new RegExp('', 'gi').test(tmp.innerHTML)) { + for (var x=0; x 0) { + value = tinyMCE.replaceVar(value, "selection", selectedText); + tinyMCE.execCommand('mceInsertContent', false, value); + } + + tinyMCE.triggerNodeChange(); + break; + + case "mceSetAttribute": + if (typeof(value) == 'object') { + var targetElms = (typeof(value['targets']) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value['targets']; + var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms); + + if (targetNode) { + targetNode.setAttribute(value['name'], value['value']); + tinyMCE.triggerNodeChange(); + } + } + break; + + case "mceSetCSSClass": + this.execCommand("SetStyleInfo", false, {command : "setattrib", name : "class", value : value}); + break; + + case "mceInsertRawHTML": + var key = 'tiny_mce_marker'; + + this.execCommand('mceBeginUndoLevel'); + + // Insert marker key + this.execCommand('mceInsertContent', false, key); + + // Store away scroll pos + var scrollX = this.getBody().scrollLeft + this.getDoc().documentElement.scrollLeft; + var scrollY = this.getBody().scrollTop + this.getDoc().documentElement.scrollTop; + + // Find marker and replace with RAW HTML + var html = this.getBody().innerHTML; + if ((pos = html.indexOf(key)) != -1) + tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length)); + + // Restore scoll pos + this.contentWindow.scrollTo(scrollX, scrollY); + + this.execCommand('mceEndUndoLevel'); + + break; + + case "mceInsertContent": + // Force empty string + if (!value) + value = ''; + + var insertHTMLFailed = false; + + // Removed since it produced problems in IE + // this.getWin().focus(); + + if (tinyMCE.isGecko || tinyMCE.isOpera) { + try { + // Is plain text or HTML, &,   etc will be encoded wrong in FF + if (value.indexOf('<') == -1 && !value.match(/(&| |<|>)/g)) { + var r = this.getRng(); + var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value)); + var s = this.getSel(); + var r2 = r.cloneRange(); + + // Insert text at cursor position + s.removeAllRanges(); + r.deleteContents(); + r.insertNode(n); + + // Move the cursor to the end of text + r2.selectNode(n); + r2.collapse(false); + s.removeAllRanges(); + s.addRange(r2); + } else { + value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value); + this.getDoc().execCommand('inserthtml', false, value); + tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value); + } + } catch (ex) { + insertHTMLFailed = true; + } + + if (!insertHTMLFailed) { + tinyMCE.triggerNodeChange(); + return; + } + } + + if (!tinyMCE.isIE) { + var isHTML = value.indexOf('<') != -1; + var sel = this.getSel(); + var rng = this.getRng(); + + if (isHTML) { + if (tinyMCE.isSafari) { + var tmpRng = this.getDoc().createRange(); + + tmpRng.setStart(this.getBody(), 0); + tmpRng.setEnd(this.getBody(), 0); + + value = tmpRng.createContextualFragment(value); + } else + value = rng.createContextualFragment(value); + } else { + // Setup text node + var el = document.createElement("div"); + el.innerHTML = value; + value = el.firstChild.nodeValue; + value = doc.createTextNode(value); + } + + // Insert plain text in Safari + if (tinyMCE.isSafari && !isHTML) { + this.execCommand('InsertText', false, value.nodeValue); + tinyMCE.triggerNodeChange(); + return true; + } else if (tinyMCE.isSafari && isHTML) { + rng.deleteContents(); + rng.insertNode(value); + tinyMCE.triggerNodeChange(); + return true; + } + + rng.deleteContents(); + + // If target node is text do special treatment, (Mozilla 1.3 fix) + if (rng.startContainer.nodeType == 3) { + var node = rng.startContainer.splitText(rng.startOffset); + node.parentNode.insertBefore(value, node); + } else + rng.insertNode(value); + + if (!isHTML) { + // Removes weird selection trails + sel.selectAllChildren(doc.body); + sel.removeAllRanges(); + + // Move cursor to end of content + var rng = doc.createRange(); + + rng.selectNode(value); + rng.collapse(false); + + sel.addRange(rng); + } else + rng.collapse(false); + + tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value); + } else { + var rng = doc.selection.createRange(), tmpRng = null; + var c = value.indexOf('"; + } + + if (hc) { + cn = n.childNodes; + + for (i=0, l=cn.length; i'; + + return h; + }, + + _serializeAttribute : function(n, r, an) { + var av = '', t, os = this.settings.on_save; + + if (os && (an.indexOf('mce_') == 0 || an.indexOf('_moz') == 0)) + return ''; + + if (os && this.mceAttribs[an]) + av = this._getAttrib(n, this.mceAttribs[an]); + + if (av.length == 0) + av = this._getAttrib(n, an); + + if (av.length == 0 && r.defaultAttribs && (t = r.defaultAttribs[an])) { + av = t; + + if (av == "mce_empty") + return " " + an + '=""'; + } + + if (r.forceAttribs && (t = r.forceAttribs[an])) + av = t; + + if (os && av.length != 0 && this.settings.url_converter.length != 0 && /^(src|href|longdesc)$/.test(an)) + av = eval(this.settings.url_converter + '(this, n, av)'); + + if (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av)) + return ""; + + if (av.length != 0 && av == "{$uid}") + av = "uid_" + (this.idCount++); + + if (av.length != 0) { + if (an.indexOf('on') != 0) + av = this.xmlEncode(av); + + return " " + an + "=" + '"' + av + '"'; + } + + return ""; + }, + + formatHTML : function(h) { + var s = this.settings, p = '', i = 0, li = 0, o = '', l; + + // Replace BR in pre elements to \n + h = h.replace(/]*)>(.*?)<\/pre>/gi, function (a, b, c) { + c = c.replace(//gi, '\n'); + return '' + c + ''; + }); + + h = h.replace(/\r/g, ''); // Windows sux, isn't carriage return a thing of the past :) + h = '\n' + h; + h = h.replace(new RegExp('\\n\\s+', 'gi'), '\n'); // Remove previous formatting + h = h.replace(this.nlBeforeRe, '\n<$1$2>'); + h = h.replace(this.nlAfterRe, '<$1$2>\n'); + h = h.replace(this.nlBeforeAfterRe, '\n<$1$2$3>\n'); + h += '\n'; + + //tinyMCE.debug(h); + + while ((i = h.indexOf('\n', i + 1)) != -1) { + if ((l = h.substring(li + 1, i)).length != 0) { + if (this.ouRe.test(l) && p.length >= s.indent_levels) + p = p.substring(s.indent_levels); + + o += p + l + '\n'; + + if (this.inRe.test(l)) + p += this.inStr; + } + + li = i; + } + + //tinyMCE.debug(h); + + return o; + }, + + xmlEncode : function(s) { + var cl = this; + + this._setupEntities(); // Will intialize lookup table + + switch (this.settings.entity_encoding) { + case "raw": + return tinyMCE.xmlEncode(s); + + case "named": + return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']', 'g'), function (c, b) { + b = cl.entities[c.charCodeAt(0)]; + + return b ? '&' + b + ';' : c; + }); + + case "numeric": + return s.replace(new RegExp('[\u007F-\uFFFF<>&"\']', 'g'), function (c, b) { + return b ? '&#' + c.charCodeAt(0) + ';' : c; + }); + } + + return s; + }, + + split : function(re, s) { + var c = s.split(re); + var i, l, o = new Array(); + + for (i=0, l=c.length; i' : '>' + h + ''; + + return o; +}; + +TinyMCE_Engine.prototype.createTag = function(d, tn, a, h) { + var o = d.createElement(tn); + + if (a) { + for (n in a) { + if (typeof(a[n]) != 'function' && a[n] != null) + tinyMCE.setAttrib(o, n, a[n]); + } + } + + if (h) + o.innerHTML = h; + + return o; +}; + +TinyMCE_Engine.prototype.getElementByAttributeValue = function(n, e, a, v) { + return (n = this.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0]; +}; + +TinyMCE_Engine.prototype.getElementsByAttributeValue = function(n, e, a, v) { + var i, nl = n.getElementsByTagName(e), o = new Array(); + + for (i=0; i/gi, ''); + h = h.replace(/<\/em>/gi, ''); + } + + if (tinyMCE.isRealIE) { + // Since MSIE handles invalid HTML better that valid XHTML we + // need to make some things invalid.


gets converted to
. + h = h.replace(/\s\/>/g, '>'); + + // Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones + h = h.replace(/]*)>\u00A0?<\/p>/gi, ' 

'); // Keep empty paragraphs + h = h.replace(/]*)>\s* \s*<\/p>/gi, ' 

'); // Keep empty paragraphs + h = h.replace(/]*)>\s+<\/p>/gi, ' 

'); // Keep empty paragraphs + + // Remove first comment + e.innerHTML = tinyMCE.uniqueTag + h; + e.firstChild.removeNode(true); + + // Remove weird auto generated empty paragraphs unless it's supposed to be there + nl = e.getElementsByTagName("p"); + for (i=nl.length-1; i>=0; i--) { + n = nl[i]; + + if (n.nodeName == 'P' && !n.hasChildNodes() && !n.mce_keep) + n.parentNode.removeChild(n); + } + } else { + h = this.fixGeckoBaseHREFBug(1, e, h); + e.innerHTML = h; + this.fixGeckoBaseHREFBug(2, e, h); + } +}; + +TinyMCE_Engine.prototype.getOuterHTML = function(e) { + if (tinyMCE.isIE) + return e.outerHTML; + + var d = e.ownerDocument.createElement("body"); + d.appendChild(e.cloneNode(true)); + return d.innerHTML; +}; + +TinyMCE_Engine.prototype.setOuterHTML = function(e, h, d) { + var d = typeof(d) == "undefined" ? e.ownerDocument : d, i, nl, t; + + if (tinyMCE.isIE && e.nodeType == 1) + e.outerHTML = h; + else { + t = d.createElement("body"); + t.innerHTML = h; + + for (i=0, nl=t.childNodes; i-1; i--) { + if (ar[i].specified && ar[i].nodeValue) + ne.setAttribute(ar[i].nodeName.toLowerCase(), ar[i].nodeValue); + } + + ar = e.childNodes; + for (i=0; i= strTok2.length) { + for (var i=0; i= strTok2.length || strTok1[i] != strTok2[i]) { + breakPoint = i + 1; + break; + } + } + } + + if (strTok1.length < strTok2.length) { + for (var i=0; i= strTok1.length || strTok1[i] != strTok2[i]) { + breakPoint = i + 1; + break; + } + } + } + + if (breakPoint == 1) + return targetURL.path; + + for (var i=0; i<(strTok1.length-(breakPoint-1)); i++) + outPath += "../"; + + for (var i=breakPoint-1; i=0; i--) { + if (baseURLParts[i].length == 0) + continue; + + newBaseURLParts[newBaseURLParts.length] = baseURLParts[i]; + } + baseURLParts = newBaseURLParts.reverse(); + + // Merge relURLParts chunks + var newRelURLParts = new Array(); + var numBack = 0; + for (var i=relURLParts.length-1; i>=0; i--) { + if (relURLParts[i].length == 0 || relURLParts[i] == ".") + continue; + + if (relURLParts[i] == '..') { + numBack++; + continue; + } + + if (numBack > 0) { + numBack--; + continue; + } + + newRelURLParts[newRelURLParts.length] = relURLParts[i]; + } + + relURLParts = newRelURLParts.reverse(); + + // Remove end from absolute path + var len = baseURLParts.length-numBack; + var absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/'); + var start = "", end = ""; + + // Build output URL + relURL.protocol = baseURL.protocol; + relURL.host = baseURL.host; + relURL.port = baseURL.port; + + // Re-add trailing slash if it's removed + if (relURL.path.charAt(relURL.path.length-1) == "/") + absPath += "/"; + + relURL.path = absPath; + + return this.serializeURL(relURL); +}; + +TinyMCE_Engine.prototype.convertURL = function(url, node, on_save) { + var prot = document.location.protocol; + var host = document.location.hostname; + var port = document.location.port; + + // Pass through file protocol + if (prot == "file:") + return url; + + // Something is wrong, remove weirdness + url = tinyMCE.regexpReplace(url, '(http|https):///', '/'); + + // Mailto link or anchor (Pass through) + if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || tinyMCE.regexpReplace(url,'[ \t\r\n\+]|%20','').charAt(0) == "#") + return url; + + // Fix relative/Mozilla + if (!tinyMCE.isIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/') + return tinyMCE.settings['base_href'] + url; + + // Handle relative URLs + if (on_save && tinyMCE.getParam('relative_urls')) { + var curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url); + if (curl.charAt(0) == '/') + curl = tinyMCE.settings['document_base_prefix'] + curl; + + var urlParts = tinyMCE.parseURL(curl); + var tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings['document_base_url']); + + // Force relative + if (urlParts['host'] == tmpUrlParts['host'] && (urlParts['port'] == tmpUrlParts['port'])) + return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings['document_base_url'], curl); + } + + // Handle absolute URLs + if (!tinyMCE.getParam('relative_urls')) { + var urlParts = tinyMCE.parseURL(url); + var baseUrlParts = tinyMCE.parseURL(tinyMCE.settings['base_href']); + + // Force absolute URLs from relative URLs + url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], url); + + // If anchor and path is the same page + if (urlParts['anchor'] && urlParts['path'] == baseUrlParts['path']) + return "#" + urlParts['anchor']; + } + + // Remove current domain + if (tinyMCE.getParam('remove_script_host')) { + var start = "", portPart = ""; + + if (port != "") + portPart = ":" + port; + + start = prot + "//" + host + portPart + "/"; + + if (url.indexOf(start) == 0) + url = url.substring(start.length-1); + } + + return url; +}; + +TinyMCE_Engine.prototype.convertAllRelativeURLs = function(body) { + var i, elms, src, href, mhref, msrc; + + // Convert all image URL:s to absolute URL + elms = body.getElementsByTagName("img"); + for (i=0; i bookmark.index) { + try { + rng.addElement(nl[bookmark.index]); + } catch (ex) { + // Might be thrown if the node no longer exists + } + } + } else { + // Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs + try { + // Incorrect bookmark + if (bookmark.start < 0) + return true; + + rng = inst.getSel().createRange(); + rng.moveToElementText(inst.getBody()); + rng.collapse(true); + rng.moveStart('character', bookmark.start); + rng.moveEnd('character', bookmark.length); + } catch (ex) { + return true; + } + } + + rng.select(); + + win.scrollTo(bookmark.scrollX, bookmark.scrollY); + return true; + } + + if (tinyMCE.isGecko || tinyMCE.isOpera) { + if (bookmark.rng) { + sel.removeAllRanges(); + sel.addRange(bookmark.rng); + } + + if (bookmark.start != -1 && bookmark.end != -1) { + try { + sd = this._getTextPos(b, bookmark.start, bookmark.end); + rng = doc.createRange(); + rng.setStart(sd.startNode, sd.startOffset); + rng.setEnd(sd.endNode, sd.endOffset); + sel.removeAllRanges(); + sel.addRange(rng); + win.focus(); + } catch (ex) { + // Ignore + } + } + + /* + if (typeof(bookmark.index) != 'undefined') { + tinyMCE.selectElements(b, 'IMG', function (n) { + if (bookmark.index-- == 0) { + // Select image in Gecko here + } + + return false; + }); + } + */ + + win.scrollTo(bookmark.scrollX, bookmark.scrollY); + return true; + } + + return false; + }, + + _getPosText : function(r, sn, en) { + var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {}; + + while ((n = w.nextNode()) != null) { + if (n == sn) + d.start = p; + + if (n == en) { + d.end = p; + return d; + } + + p += n.nodeValue ? n.nodeValue.length : 0; + } + + return null; + }, + + _getTextPos : function(r, sp, ep) { + var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {}; + + while ((n = w.nextNode()) != null) { + p += n.nodeValue ? n.nodeValue.length : 0; + + if (p >= sp && !d.startNode) { + d.startNode = n; + d.startOffset = sp - (p - n.nodeValue.length); + } + + if (p >= ep) { + d.endNode = n; + d.endOffset = ep - (p - n.nodeValue.length); + + return d; + } + } + + return null; + }, + + selectNode : function(node, collapse, select_text_node, to_start) { + var inst = this.instance, sel, rng, nodes; + + if (!node) + return; + + if (typeof(collapse) == "undefined") + collapse = true; + + if (typeof(select_text_node) == "undefined") + select_text_node = false; + + if (typeof(to_start) == "undefined") + to_start = true; + + if (inst.settings.auto_resize) + inst.resizeToContent(); + + if (tinyMCE.isRealIE) { + rng = inst.getDoc().body.createTextRange(); + + try { + rng.moveToElementText(node); + + if (collapse) + rng.collapse(to_start); + + rng.select(); + } catch (e) { + // Throws illigal agrument in MSIE some times + } + } else { + sel = this.getSel(); + + if (!sel) + return; + + if (tinyMCE.isSafari) { + sel.setBaseAndExtent(node, 0, node, node.innerText.length); + + if (collapse) { + if (to_start) + sel.collapseToStart(); + else + sel.collapseToEnd(); + } + + this.scrollToNode(node); + + return; + } + + rng = inst.getDoc().createRange(); + + if (select_text_node) { + // Find first textnode in tree + nodes = tinyMCE.getNodeTree(node, new Array(), 3); + if (nodes.length > 0) + rng.selectNodeContents(nodes[0]); + else + rng.selectNodeContents(node); + } else + rng.selectNode(node); + + if (collapse) { + // Special treatment of textnode collapse + if (!to_start && node.nodeType == 3) { + rng.setStart(node, node.nodeValue.length); + rng.setEnd(node, node.nodeValue.length); + } else + rng.collapse(to_start); + } + + sel.removeAllRanges(); + sel.addRange(rng); + } + + this.scrollToNode(node); + + // Set selected element + tinyMCE.selectedElement = null; + if (node.nodeType == 1) + tinyMCE.selectedElement = node; + }, + + scrollToNode : function(node) { + var inst = this.instance, w = inst.getWin(), vp = inst.getViewPort(), pos = tinyMCE.getAbsPosition(node), cvp, p, cwin; + + // Only scroll if out of visible area + if (pos.absLeft < vp.left || pos.absLeft > vp.left + vp.width || pos.absTop < vp.top || pos.absTop > vp.top + (vp.height-25)) + w.scrollTo(pos.absLeft, pos.absTop - vp.height + 25); + + // Scroll container window + if (inst.settings.auto_resize) { + cwin = inst.getContainerWin(); + cvp = tinyMCE.getViewPort(cwin); + p = this.getAbsPosition(node); + + if (p.absLeft < cvp.left || p.absLeft > cvp.left + cvp.width || p.absTop < cvp.top || p.absTop > cvp.top + cvp.height) + cwin.scrollTo(p.absLeft, p.absTop - cvp.height + 25); + } + }, + + getAbsPosition : function(n) { + var pos = tinyMCE.getAbsPosition(n), ipos = tinyMCE.getAbsPosition(this.instance.iframeElement); + + return { + absLeft : ipos.absLeft + pos.absLeft, + absTop : ipos.absTop + pos.absTop + }; + }, + + getSel : function() { + var inst = this.instance; + + if (tinyMCE.isRealIE) + return inst.getDoc().selection; + + return inst.contentWindow.getSelection(); + }, + + getRng : function() { + var s = this.getSel(); + + if (s == null) + return null; + + if (tinyMCE.isRealIE) + return s.createRange(); + + if (tinyMCE.isSafari && !s.getRangeAt) + return '' + window.getSelection(); + + return s.getRangeAt(0); + }, + + getFocusElement : function() { + var inst = this.instance, doc, rng, sel, elm; + + if (tinyMCE.isRealIE) { + doc = inst.getDoc(); + rng = doc.selection.createRange(); + + // if (rng.collapse) + // rng.collapse(true); + + elm = rng.item ? rng.item(0) : rng.parentElement(); + } else { + if (!tinyMCE.isSafari && inst.isHidden()) + return inst.getBody(); + + sel = this.getSel(); + rng = this.getRng(); + + if (!sel || !rng) + return null; + + elm = rng.commonAncestorContainer; + //elm = (sel && sel.anchorNode) ? sel.anchorNode : null; + + // Handle selection a image or other control like element such as anchors + if (!rng.collapsed) { + // Is selection small + if (rng.startContainer == rng.endContainer) { + if (rng.startOffset - rng.endOffset < 2) { + if (rng.startContainer.hasChildNodes()) + elm = rng.startContainer.childNodes[rng.startOffset]; + } + } + } + + // Get the element parent of the node + elm = tinyMCE.getParentElement(elm); + + //if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") + // elm = tinyMCE.selectedElement; + } + + return elm; + } + + }; + +/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */ + +function TinyMCE_UndoRedo(inst) { + this.instance = inst; + this.undoLevels = new Array(); + this.undoIndex = 0; + this.typingUndoIndex = -1; + this.undoRedo = true; +}; + +TinyMCE_UndoRedo.prototype = { + add : function(l) { + var b, customUndoLevels, newHTML, inst = this.instance, i, ul, ur; + + if (l) { + this.undoLevels[this.undoLevels.length] = l; + return true; + } + + if (this.typingUndoIndex != -1) { + this.undoIndex = this.typingUndoIndex; + + if (tinyMCE.typingUndoIndex != -1) + tinyMCE.undoIndex = tinyMCE.typingUndoIndex; + } + + newHTML = tinyMCE.trim(inst.getBody().innerHTML); + if (this.undoLevels[this.undoIndex] && newHTML != this.undoLevels[this.undoIndex].content) { + //tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex].content); + + tinyMCE.dispatchCallback(inst, 'onchange_callback', 'onChange', inst); + + // Time to compress + customUndoLevels = tinyMCE.settings['custom_undo_redo_levels']; + if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) { + for (i=0; i 0) { + this.undoIndex--; + + tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content); + inst.repaint(); + + if (inst.settings.custom_undo_redo_restore_selection) + inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark); + } + }, + + redo : function() { + var inst = this.instance; + + tinyMCE.execCommand("mceEndTyping"); + + if (this.undoIndex < (this.undoLevels.length-1)) { + this.undoIndex++; + + tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content); + inst.repaint(); + + if (inst.settings.custom_undo_redo_restore_selection) + inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark); + } + + tinyMCE.triggerNodeChange(); + } + + }; + +/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */ + +var TinyMCE_ForceParagraphs = { + _insertPara : function(inst, e) { + var doc = inst.getDoc(), sel = inst.getSel(), body = inst.getBody(), win = inst.contentWindow, rng = sel.getRangeAt(0); + var rootElm = doc.documentElement, blockName = "P", startNode, endNode, startBlock, endBlock; + var rngBefore, rngAfter, direct, startNode, startOffset, endNode, endOffset, b = tinyMCE.isOpera ? inst.selection.getBookmark() : null; + var paraBefore, paraAfter, startChop, endChop, contents; + + function isEmpty(para) { + function isEmptyHTML(html) { + return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == ""; + } + + // Check for images + if (para.getElementsByTagName("img").length > 0) + return false; + + // Check for tables + if (para.getElementsByTagName("table").length > 0) + return false; + + // Check for HRs + if (para.getElementsByTagName("hr").length > 0) + return false; + + // Check all textnodes + var nodes = tinyMCE.getNodeTree(para, new Array(), 3); + for (var i=0; i <" + blockName + "> "; + paraAfter = body.childNodes[1]; + } + + inst.selection.moveToBookmark(b); + inst.selection.selectNode(paraAfter, true, true); + + return true; + } + + // Place first part within new paragraph + if (startChop.nodeName == blockName) + rngBefore.setStart(startChop, 0); + else + rngBefore.setStartBefore(startChop); + + rngBefore.setEnd(startNode, startOffset); + paraBefore.appendChild(rngBefore.cloneContents()); + + // Place secound part within new paragraph + rngAfter.setEndAfter(endChop); + rngAfter.setStart(endNode, endOffset); + contents = rngAfter.cloneContents(); + + if (contents.firstChild && contents.firstChild.nodeName == blockName) { + /* var nodes = contents.firstChild.childNodes; + for (var i=0; i= r.startOffset && nv.charAt(r.startOffset - 1) == ' ') + s = true;*/ + + // Only remove BRs if we are at the end of line #bug 1464152 + if (nv != null && r.startOffset == nv.length) + sn.nextSibling.parentNode.removeChild(sn.nextSibling); + } + + if (inst.settings.auto_resize) + inst.resizeToContent(); + + return s; + } + + }; + +/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */ + +function TinyMCE_Layer(id, bm) { + this.id = id; + this.blockerElement = null; + this.events = false; + this.element = null; + this.blockMode = typeof(bm) != 'undefined' ? bm : true; + this.doc = document; +}; + +TinyMCE_Layer.prototype = { + moveRelativeTo : function(re, p) { + var rep = this.getAbsPosition(re); + var w = parseInt(re.offsetWidth); + var h = parseInt(re.offsetHeight); + var e = this.getElement(); + var ew = parseInt(e.offsetWidth); + var eh = parseInt(e.offsetHeight); + var x, y; + + switch (p) { + case "tl": + x = rep.absLeft; + y = rep.absTop; + break; + + case "tr": + x = rep.absLeft + w; + y = rep.absTop; + break; + + case "bl": + x = rep.absLeft; + y = rep.absTop + h; + break; + + case "br": + x = rep.absLeft + w; + y = rep.absTop + h; + break; + + case "cc": + x = rep.absLeft + (w / 2) - (ew / 2); + y = rep.absTop + (h / 2) - (eh / 2); + break; + } + + this.moveTo(x, y); + }, + + moveBy : function(x, y) { + var e = this.getElement(); + this.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y); + }, + + moveTo : function(x, y) { + var e = this.getElement(); + + e.style.left = x + "px"; + e.style.top = y + "px"; + + this.updateBlocker(); + }, + + resizeBy : function(w, h) { + var e = this.getElement(); + this.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h); + }, + + resizeTo : function(w, h) { + var e = this.getElement(); + + if (w != null) + e.style.width = w + "px"; + + if (h != null) + e.style.height = h + "px"; + + this.updateBlocker(); + }, + + show : function() { + this.getElement().style.display = 'block'; + this.updateBlocker(); + }, + + hide : function() { + this.getElement().style.display = 'none'; + this.updateBlocker(); + }, + + isVisible : function() { + return this.getElement().style.display == 'block'; + }, + + getElement : function() { + if (!this.element) + this.element = this.doc.getElementById(this.id); + + return this.element; + }, + + setBlockMode : function(s) { + this.blockMode = s; + }, + + updateBlocker : function() { + var e, b, x, y, w, h; + + b = this.getBlocker(); + if (b) { + if (this.blockMode) { + e = this.getElement(); + x = this.parseInt(e.style.left); + y = this.parseInt(e.style.top); + w = this.parseInt(e.offsetWidth); + h = this.parseInt(e.offsetHeight); + + b.style.left = x + 'px'; + b.style.top = y + 'px'; + b.style.width = w + 'px'; + b.style.height = h + 'px'; + b.style.display = e.style.display; + } else + b.style.display = 'none'; + } + }, + + getBlocker : function() { + var d, b; + + if (!this.blockerElement && this.blockMode) { + d = this.doc; + b = d.getElementById(this.id + "_blocker"); + + if (!b) { + b = d.createElement("iframe"); + + b.setAttribute('id', this.id + "_blocker"); + b.style.cssText = 'display: none; position: absolute; left: 0; top: 0'; + b.src = 'javascript:false;'; + b.frameBorder = '0'; + b.scrolling = 'no'; + + d.body.appendChild(b); + } + + this.blockerElement = b; + } + + return this.blockerElement; + }, + + getAbsPosition : function(n) { + var p = {absLeft : 0, absTop : 0}; + + while (n) { + p.absLeft += n.offsetLeft; + p.absTop += n.offsetTop; + n = n.offsetParent; + } + + return p; + }, + + create : function(n, c, p, h) { + var d = this.doc, e = d.createElement(n); + + e.setAttribute('id', this.id); + + if (c) + e.className = c; + + if (!p) + p = d.body; + + if (h) + e.innerHTML = h; + + p.appendChild(e); + + return this.element = e; + }, + + exists : function() { + return this.doc.getElementById(this.id) != null; + }, + + parseInt : function(s) { + if (s == null || s == '') + return 0; + + return parseInt(s); + } + + }; + +/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */ + +function TinyMCE_Menu() { + var id; + + if (typeof(tinyMCE.menuCounter) == "undefined") + tinyMCE.menuCounter = 0; + + id = "mc_menu_" + tinyMCE.menuCounter++; + + TinyMCE_Layer.call(this, id, true); + + this.id = id; + this.items = new Array(); + this.needsUpdate = true; +}; + +TinyMCE_Menu.prototype = tinyMCE.extend(TinyMCE_Layer.prototype, { + init : function(s) { + var n; + + // Default params + this.settings = { + separator_class : 'mceMenuSeparator', + title_class : 'mceMenuTitle', + disabled_class : 'mceMenuDisabled', + menu_class : 'mceMenu', + drop_menu : true + }; + + for (n in s) + this.settings[n] = s[n]; + + this.create('div', this.settings.menu_class); + }, + + clear : function() { + this.items = new Array(); + }, + + addTitle : function(t) { + this.add({type : 'title', text : t}); + }, + + addDisabled : function(t) { + this.add({type : 'disabled', text : t}); + }, + + addSeparator : function() { + this.add({type : 'separator'}); + }, + + addItem : function(t, js) { + this.add({text : t, js : js}); + }, + + add : function(mi) { + this.items[this.items.length] = mi; + this.needsUpdate = true; + }, + + update : function() { + var e = this.getElement(), h = '', i, t, m = this.items, s = this.settings; + + if (this.settings.drop_menu) + h += ''; + + h += ''; + + for (i=0; i'; + } + + h += '
'; + break; + + case 'title': + h += '
' + t + ''; + break; + + case 'disabled': + h += '
' + t + ''; + break; + + default: + h += '
' + t + ''; + } + + h += '
'; + + e.innerHTML = h; + + this.needsUpdate = false; + this.updateBlocker(); + }, + + show : function() { + var nl, i; + + if (tinyMCE.lastMenu == this) + return; + + if (this.needsUpdate) + this.update(); + + if (tinyMCE.lastMenu && tinyMCE.lastMenu != this) + tinyMCE.lastMenu.hide(); + + TinyMCE_Layer.prototype.show.call(this); + + if (!tinyMCE.isOpera) { + // Accessibility stuff +/* nl = this.getElement().getElementsByTagName("a"); + if (nl.length > 0) + nl[0].focus();*/ + } + + tinyMCE.lastMenu = this; + } + + }); + +/* file:jscripts/tiny_mce/classes/TinyMCE_Compatibility.class.js */ + +if (!Function.prototype.call) { + Function.prototype.call = function() { + var a = arguments, s = a[0], i, as = '', r, o; + + for (i=1; i 1 ? ',' : '') + 'a[' + i + ']'; + + o = s._fu; + s._fu = this; + r = eval('s._fu(' + as + ')'); + s._fu = o; + + return r; + }; +}; + +/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */ + +TinyMCE_Engine.prototype.debug = function() { + var m = "", a, i, l = tinyMCE.log.length; + + for (i=0, a = this.debug.arguments; i'; + h += ''; + + return h; +} + +function pickColor(e, target_form_element) { + if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown") + tinyMCEPopup.pickColor(e, target_form_element); +} + +function updateColor(img_id, form_element_id) { + document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; +} + +function setBrowserDisabled(id, state) { + var img = document.getElementById(id); + var lnk = document.getElementById(id + "_link"); + + if (lnk) { + if (state) { + lnk.setAttribute("realhref", lnk.getAttribute("href")); + lnk.removeAttribute("href"); + tinyMCE.switchClass(img, 'mceButtonDisabled', true); + } else { + lnk.setAttribute("href", lnk.getAttribute("realhref")); + tinyMCE.switchClass(img, 'mceButtonNormal', false); + } + } +} + +function getBrowserHTML(id, target_form_element, type, prefix) { + var option = prefix + "_" + type + "_browser_callback"; + var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback")); + if (cb == null) + return ""; + + var html = ""; + + html += ''; + html += ''; + + return html; +} + +function openBrower(img_id, target_form_element, type, option) { + var img = document.getElementById(img_id); + + if (img.className != "mceButtonDisabled") + tinyMCEPopup.openBrowser(target_form_element, type, option); +} + +function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { + if (!form_obj || !form_obj.elements[field_name]) + return; + + var sel = form_obj.elements[field_name]; + + var found = false; + for (var i=0; i x && mx < x + w && my > y && my < y + h)) { + MCLayer.visibleLayer = null; + + if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my)) + return true; + + l.hide(); + } + } + }, + + addCSSClass : function(e, c) { + this.removeCSSClass(e, c); + var a = this.explode(' ', e.className); + a[a.length] = c; + e.className = a.join(' '); + }, + + removeCSSClass : function(e, c) { + var a = this.explode(' ', e.className), i; + + for (i=0; i parseInt(v)) + st = this.mark(f, n); + } + } + + return st; + }, + + hasClass : function(n, c, d) { + return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); + }, + + getNum : function(n, c) { + c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; + c = c.replace(/[^0-9]/g, ''); + + return c; + }, + + addClass : function(n, c, b) { + var o = this.removeClass(n, c); + n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c; + }, + + removeClass : function(n, c) { + c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); + return n.className = c != ' ' ? c : ''; + }, + + tags : function(f, s) { + return f.getElementsByTagName(s); + }, + + mark : function(f, n) { + var s = this.settings; + + this.addClass(n, s.invalid_cls); + this.markLabels(f, n, s.invalid_cls); + + return false; + }, + + markLabels : function(f, n, ic) { + var nl, i; + + nl = this.tags(f, "label"); + for (i=0; i +- theme_advanced_container__class +- theme_advanced_container__align +- theme_advanced_custom_layout +- theme_advanced_link_targets +- theme_advanced_resizing +- theme_advanced_resizing_use_cookie +- theme_advanced_resize_horizontal +- theme_advanced_path +- theme_advanced_fonts diff --git a/vendor/plugins/exception_notification/README b/vendor/plugins/exception_notification/README new file mode 100644 index 0000000..9a47c41 --- /dev/null +++ b/vendor/plugins/exception_notification/README @@ -0,0 +1,111 @@ += Exception Notifier Plugin for Rails + +The Exception Notifier plugin provides a mailer object and a default set of +templates for sending email notifications when errors occur in a Rails +application. The plugin is configurable, allowing programmers to specify: + +* the sender address of the email +* the recipient addresses +* the text used to prefix the subject line + +The email includes information about the current request, session, and +environment, and also gives a backtrace of the exception. + +== Usage + +First, include the ExceptionNotifiable mixin in whichever controller you want +to generate error emails (typically ApplicationController): + + class ApplicationController < ActionController::Base + include ExceptionNotifiable + ... + end + +Then, specify the email recipients in your environment: + + ExceptionNotifier.exception_recipients = %w(joe@schmoe.com bill@schmoe.com) + +And that's it! The defaults take care of the rest. + +== Configuration + +You can tweak other values to your liking, as well. In your environment file, +just set any or all of the following values: + + # defaults to exception.notifier@default.com + ExceptionNotifier.sender_address = + %("Application Error" ) + + # defaults to "[ERROR] " + ExceptionNotifier.email_prefix = "[APP] " + +Email notifications will only occur when the IP address is determined not to +be local. You can specify certain addresses to always be local so that you'll +get a detailed error instead of the generic error page. You do this in your +controller (or even per-controller): + + consider_local "64.72.18.143", "14.17.21.25" + +You can specify subnet masks as well, so that all matching addresses are +considered local: + + consider_local "64.72.18.143/24" + +The address "127.0.0.1" is always considered local. If you want to completely +reset the list of all addresses (for instance, if you wanted "127.0.0.1" to +NOT be considered local), you can simply do, somewhere in your controller: + + local_addresses.clear + +== Customization + +By default, the notification email includes four parts: request, session, +environment, and backtrace (in that order). You can customize how each of those +sections are rendered by placing a partial named for that part in your +app/views/exception_notifier directory (e.g., _session.rhtml). Each partial has +access to the following variables: + +* @controller: the controller that caused the error +* @request: the current request object +* @exception: the exception that was raised +* @host: the name of the host that made the request +* @backtrace: a sanitized version of the exception's backtrace +* @rails_root: a sanitized version of RAILS_ROOT +* @data: a hash of optional data values that were passed to the notifier +* @sections: the array of sections to include in the email + +You can reorder the sections, or exclude sections completely, by altering the +ExceptionNotifier.sections variable. You can even add new sections that +describe application-specific data--just add the section's name to the list +(whereever you'd like), and define the corresponding partial. Then, if your +new section requires information that isn't available by default, make sure +it is made available to the email using the exception_data macro: + + class ApplicationController < ActionController::Base + ... + protected + exception_data :additional_data + + def additional_data + { :document => @document, + :person => @person } + end + ... + end + +In the above case, @document and @person would be made available to the email +renderer, allowing your new section(s) to access and display them. See the +existing sections defined by the plugin for examples of how to write your own. + +== Advanced Customization + +By default, the email notifier will only notify on critical errors. For +ActiveRecord::RecordNotFound and ActionController::UnknownAction, it will +simply render the contents of your public/404.html file. Other exceptions +will render public/500.html and will send the email notification. If you want +to use different rules for the notification, you will need to implement your +own rescue_action_in_public method. You can look at the default implementation +in ExceptionNotifiable for an example of how to go about that. + + +Copyright (c) 2005 Jamis Buck, released under the MIT license \ No newline at end of file diff --git a/vendor/plugins/exception_notification/init.rb b/vendor/plugins/exception_notification/init.rb new file mode 100644 index 0000000..b39bd95 --- /dev/null +++ b/vendor/plugins/exception_notification/init.rb @@ -0,0 +1 @@ +require "action_mailer" diff --git a/vendor/plugins/exception_notification/lib/exception_notifiable.rb b/vendor/plugins/exception_notification/lib/exception_notifiable.rb new file mode 100644 index 0000000..08c4277 --- /dev/null +++ b/vendor/plugins/exception_notification/lib/exception_notifiable.rb @@ -0,0 +1,99 @@ +require 'ipaddr' + +# Copyright (c) 2005 Jamis Buck +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +module ExceptionNotifiable + def self.included(target) + target.extend(ClassMethods) + end + + module ClassMethods + def consider_local(*args) + local_addresses.concat(args.flatten.map { |a| IPAddr.new(a) }) + end + + def local_addresses + addresses = read_inheritable_attribute(:local_addresses) + unless addresses + addresses = [IPAddr.new("127.0.0.1")] + write_inheritable_attribute(:local_addresses, addresses) + end + addresses + end + + def exception_data(deliverer=self) + if deliverer == self + read_inheritable_attribute(:exception_data) + else + write_inheritable_attribute(:exception_data, deliverer) + end + end + end + + private + + def local_request? + remote = IPAddr.new(request.remote_ip) + !self.class.local_addresses.detect { |addr| addr.include?(remote) }.nil? + end + + def render_404 + respond_to do |type| + type.html { render :file => "#{RAILS_ROOT}/public/404.html", :status => "404 Not Found" } + type.all { render :nothing => true, :status => "404 Not Found" } + end + end + + def render_500 + respond_to do |type| + type.html { render :file => "#{RAILS_ROOT}/public/500.html", :status => "500 Error" } + type.all { render :nothing => true, :status => "500 Error" } + end + end + + def rescue_action_in_public(exception) + case exception + when *exceptions_to_treat_as_404 + render_404 + + else + render_500 + + deliverer = self.class.exception_data + data = case deliverer + when nil then {} + when Symbol then send(deliverer) + when Proc then deliverer.call(self) + end + + ExceptionNotifier.deliver_exception_notification(exception, self, + request, data) + end + end + + def exceptions_to_treat_as_404 + exceptions = [ActiveRecord::RecordNotFound, + ActionController::UnknownController, + ActionController::UnknownAction] + exceptions << ActionController::RoutingError if ActionController.const_defined?(:RoutingError) + exceptions + end +end diff --git a/vendor/plugins/exception_notification/lib/exception_notifier.rb b/vendor/plugins/exception_notification/lib/exception_notifier.rb new file mode 100644 index 0000000..0518c3d --- /dev/null +++ b/vendor/plugins/exception_notification/lib/exception_notifier.rb @@ -0,0 +1,67 @@ +require 'pathname' + +# Copyright (c) 2005 Jamis Buck +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +class ExceptionNotifier < ActionMailer::Base + @@sender_address = %("Exception Notifier" ) + cattr_accessor :sender_address + + @@exception_recipients = [] + cattr_accessor :exception_recipients + + @@email_prefix = "[ERROR] " + cattr_accessor :email_prefix + + @@sections = %w(request session environment backtrace) + cattr_accessor :sections + + def self.reloadable?; false; end + + def exception_notification(exception, controller, request, data={}) + subject "#{email_prefix}#{controller.controller_name}##{controller.action_name} (#{exception.class}) #{exception.message.inspect}" + + recipients exception_recipients + from sender_address + + body data.merge({ :controller => controller, :request => request, + :exception => exception, :host => request.env["HTTP_HOST"], + :backtrace => sanitize_backtrace(exception.backtrace), + :rails_root => rails_root, :data => data, + :sections => sections }) + end + + def template_root + "#{File.dirname(__FILE__)}/../views" + end + + private + + def sanitize_backtrace(trace) + re = Regexp.new(/^#{Regexp.escape(rails_root)}/) + trace.map { |line| Pathname.new(line.gsub(re, "[RAILS_ROOT]")).cleanpath.to_s } + end + + def rails_root + return @rails_root if @rails_root + @rails_root = Pathname.new(RAILS_ROOT).cleanpath.to_s + end + +end diff --git a/vendor/plugins/exception_notification/lib/exception_notifier_helper.rb b/vendor/plugins/exception_notification/lib/exception_notifier_helper.rb new file mode 100644 index 0000000..4e4c48b --- /dev/null +++ b/vendor/plugins/exception_notification/lib/exception_notifier_helper.rb @@ -0,0 +1,63 @@ +require 'pp' + +# Copyright (c) 2005 Jamis Buck +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +module ExceptionNotifierHelper + VIEW_PATH = "views/exception_notifier" + APP_PATH = "#{RAILS_ROOT}/app/#{VIEW_PATH}" + + def render_section(section) + RAILS_DEFAULT_LOGGER.info("rendering section #{section.inspect}") + summary = render_overridable(section).strip + unless summary.blank? + title = render_overridable(:title, :locals => { :title => section }).strip + "#{title}\n\n#{summary.gsub(/^/, " ")}\n\n" + end + end + + def render_overridable(partial, options={}) + if File.exist?(path = "#{APP_PATH}/_#{partial}.rhtml") + render(options.merge(:file => path, :use_full_path => false)) + elsif File.exist?(path = "#{File.dirname(__FILE__)}/../#{VIEW_PATH}/_#{partial}.rhtml") + render(options.merge(:file => path, :use_full_path => false)) + else + "" + end + end + + def inspect_model_object(model, locals={}) + render_overridable(:inspect_model, + :locals => { :inspect_model => model, + :show_instance_variables => true, + :show_attributes => true }.merge(locals)) + end + + def inspect_value(value) + len = 512 + result = object_to_yaml(value).gsub(/\n/, "\n ").strip + result = result[0,len] + "... (#{result.length-len} bytes more)" if result.length > len+20 + result + end + + def object_to_yaml(object) + object.to_yaml.sub(/^---\s*/m, "") + end +end diff --git a/vendor/plugins/exception_notification/views/exception_notifier/_backtrace.rhtml b/vendor/plugins/exception_notification/views/exception_notifier/_backtrace.rhtml new file mode 100644 index 0000000..7d13ba0 --- /dev/null +++ b/vendor/plugins/exception_notification/views/exception_notifier/_backtrace.rhtml @@ -0,0 +1 @@ +<%= @backtrace.join "\n" %> diff --git a/vendor/plugins/exception_notification/views/exception_notifier/_environment.rhtml b/vendor/plugins/exception_notification/views/exception_notifier/_environment.rhtml new file mode 100644 index 0000000..f426b54 --- /dev/null +++ b/vendor/plugins/exception_notification/views/exception_notifier/_environment.rhtml @@ -0,0 +1,7 @@ +<% max = @request.env.keys.max { |a,b| a.length <=> b.length } -%> +<% @request.env.keys.sort.each do |key| -%> +* <%= "%*-s: %s" % [max.length, key, @request.env[key].to_s.strip] %> +<% end -%> + +* Process: <%= $$ %> +* Server : <%= `hostname -s`.chomp %> diff --git a/vendor/plugins/exception_notification/views/exception_notifier/_inspect_model.rhtml b/vendor/plugins/exception_notification/views/exception_notifier/_inspect_model.rhtml new file mode 100644 index 0000000..e817847 --- /dev/null +++ b/vendor/plugins/exception_notification/views/exception_notifier/_inspect_model.rhtml @@ -0,0 +1,16 @@ +<% if show_attributes -%> +[attributes] +<% attrs = inspect_model.attributes -%> +<% max = attrs.keys.max { |a,b| a.length <=> b.length } -%> +<% attrs.keys.sort.each do |attr| -%> +* <%= "%*-s: %s" % [max.length, attr, object_to_yaml(attrs[attr]).gsub(/\n/, "\n ").strip] %> +<% end -%> +<% end -%> + +<% if show_instance_variables -%> +[instance variables] +<% inspect_model.instance_variables.sort.each do |variable| -%> +<%- next if variable == "@attributes" -%> +* <%= variable %>: <%= inspect_value(inspect_model.instance_variable_get(variable)) %> +<% end -%> +<% end -%> diff --git a/vendor/plugins/exception_notification/views/exception_notifier/_request.rhtml b/vendor/plugins/exception_notification/views/exception_notifier/_request.rhtml new file mode 100644 index 0000000..6df4520 --- /dev/null +++ b/vendor/plugins/exception_notification/views/exception_notifier/_request.rhtml @@ -0,0 +1,3 @@ +* URL: <%= @request.protocol %><%= @host %><%= @request.request_uri %> +* Parameters: <%= @request.parameters.inspect %> +* Rails root: <%= @rails_root %> diff --git a/vendor/plugins/exception_notification/views/exception_notifier/_session.rhtml b/vendor/plugins/exception_notification/views/exception_notifier/_session.rhtml new file mode 100644 index 0000000..283c862 --- /dev/null +++ b/vendor/plugins/exception_notification/views/exception_notifier/_session.rhtml @@ -0,0 +1,2 @@ +* session id: <%= @request.session.instance_variable_get(:@session_id).inspect %> +* data: <%= PP.pp(@request.session.instance_variable_get(:@data),"").gsub(/\n/, "\n ").strip %> diff --git a/vendor/plugins/exception_notification/views/exception_notifier/_title.rhtml b/vendor/plugins/exception_notification/views/exception_notifier/_title.rhtml new file mode 100644 index 0000000..1ed5a3f --- /dev/null +++ b/vendor/plugins/exception_notification/views/exception_notifier/_title.rhtml @@ -0,0 +1,3 @@ +------------------------------- +<%= title.to_s.humanize %>: +------------------------------- diff --git a/vendor/plugins/exception_notification/views/exception_notifier/exception_notification.rhtml b/vendor/plugins/exception_notification/views/exception_notifier/exception_notification.rhtml new file mode 100644 index 0000000..ec30c4a --- /dev/null +++ b/vendor/plugins/exception_notification/views/exception_notifier/exception_notification.rhtml @@ -0,0 +1,6 @@ +A <%= @exception.class %> occurred in <%= @controller.controller_name %>#<%= @controller.action_name %>: + + <%= @exception.message %> + <%= @backtrace.first %> + +<%= @sections.map { |section| render_section(section) }.join %> diff --git a/vendor/plugins/tiny_mce/init.rb b/vendor/plugins/tiny_mce/init.rb new file mode 100644 index 0000000..634d1e8 --- /dev/null +++ b/vendor/plugins/tiny_mce/init.rb @@ -0,0 +1,4 @@ +require 'tiny_mce' +TinyMCE::OptionValidator.load +ActionController::Base.send(:include, TinyMCE) + diff --git a/vendor/plugins/tiny_mce/lib/tiny_mce.rb b/vendor/plugins/tiny_mce/lib/tiny_mce.rb new file mode 100644 index 0000000..b129399 --- /dev/null +++ b/vendor/plugins/tiny_mce/lib/tiny_mce.rb @@ -0,0 +1,36 @@ +module TinyMCE + module ClassMethods + def uses_tiny_mce(options = {}) + tiny_mce_options = options.delete(:options) || nil + proc = Proc.new do |c| + c.instance_variable_set(:@tiny_mce_options, tiny_mce_options) + c.instance_variable_set(:@uses_tiny_mce, true) + end + before_filter(proc, options) + end + alias uses_text_editor uses_tiny_mce + end + + module OptionValidator + class << self + cattr_accessor :plugins + + def load + @@valid_options = File.open(File.dirname(__FILE__) + "/../tiny_mce_options.yml") { |f| YAML.load(f.read) } + end + + def valid?(option) + @@valid_options.include?(option.to_s) || (plugins && plugins.include?(option.to_s.split('_')[0])) || option.to_s =~ /theme_advanced_container_/ + end + + def options + @@valid_options + end + end + end + + def self.included(base) + base.extend(ClassMethods) + base.helper TinyMCEHelper + end +end diff --git a/vendor/plugins/tiny_mce/lib/tiny_mce_helper.rb b/vendor/plugins/tiny_mce/lib/tiny_mce_helper.rb new file mode 100644 index 0000000..472fe6a --- /dev/null +++ b/vendor/plugins/tiny_mce/lib/tiny_mce_helper.rb @@ -0,0 +1,48 @@ +module TinyMCEHelper + class InvalidOption < Exception + end + + def using_tiny_mce? + !@uses_tiny_mce.nil? + end + + def tiny_mce_init(options = @tiny_mce_options) + options ||= {} + default_options = {:mode => 'textareas', + :theme => 'simple'} + options = default_options.merge(options) + TinyMCE::OptionValidator.plugins = options[:plugins] + tinymce_js = "tinyMCE.init({\n" + i = 0 + options.stringify_keys.sort.each do |pair| + key, value = pair[0], pair[1] + raise InvalidOption.new("Invalid option #{key} passed to tinymce") unless TinyMCE::OptionValidator.valid?(key) + tinymce_js += "#{key} : " + case value + when String, Symbol, Fixnum + tinymce_js += "'#{value}'" + when Array + tinymce_js += '"' + value.join(',') + '"' + when TrueClass + tinymce_js += 'true' + when FalseClass + tinymce_js += 'false' + else + raise InvalidOption.new("Invalid value of type #{value.class} passed for TinyMCE option #{key}") + end + (i < options.size - 1) ? tinymce_js += ",\n" : "\n" + i += 1 + end + tinymce_js += "\n});" + javascript_tag tinymce_js + end + alias tiny_mce tiny_mce_init + + def javascript_include_tiny_mce + javascript_include_tag RAILS_ENV == 'development' ? "tiny_mce/tiny_mce_src" : "tiny_mce/tiny_mce" + end + + def javascript_include_tiny_mce_if_used + javascript_include_tiny_mce if @uses_tiny_mce + end +end \ No newline at end of file diff --git a/vendor/plugins/tiny_mce/tiny_mce_options.yml b/vendor/plugins/tiny_mce/tiny_mce_options.yml new file mode 100644 index 0000000..831b7a3 --- /dev/null +++ b/vendor/plugins/tiny_mce/tiny_mce_options.yml @@ -0,0 +1,121 @@ +- mode +- theme +- plugins +- language +- ask +- textarea_trigger +- editor_selector +- editor_deselector +- elements +- docs_language +- debug +- focus_alert +- directionality +- auto_reset_designmode +- auto_focus +- nowrap +- button_tile_map +- auto_resize +- browsers +- dialog_type +- accessibility_warnings +- accessibility_focus +- event_elements +- table_inline_editing +- object_resizing +- custom_shortcuts +- strict_loading_mode +- cleanup +- valid_elements +- extended_valid_elements +- invalid_elements +- verify_css_classes +- verify_html +- preformatted +- encoding +- cleanup_on_startup +- fix_content_duplication +- inline_styles +- convert_newlines_to_brs +- force_br_newlines +- force_p_newlines +- entities +- entity_encoding +- remove_linebreaks +- convert_fonts_to_spans +- font_size_classes +- font_size_style_values +- merge_styles_invalid_parents +- force_hex_style_colors +- apply_source_formatting +- trim_span_elements +- doctype +- fix_list_elements +- fix_table_elements +- convert_urls +- relative_urls +- remove_script_host +- document_base_url +- urlconverter_callback +- insertlink_callback +- insertimage_callback +- setupcontent_callback +- save_callback +- onchange_callback +- init_instance_callback +- file_browser_callback +- cleanup_callback +- handle_event_callback +- execcommand_callback +- oninit +- onpageload +- content_css +- popups_css +- editor_css +- width +- height +- visual +- visual_table_class +- custom_undo_redo +- custom_undo_redo_levels +- custom_undo_redo_keyboard_shortcuts +- custom_undo_redo_restore_selection +- external_link_list_url +- external_image_list_url +- display_tab_class +- hidden_tab_class +- add_form_submit_trigger +- add_unload_trigger +- submit_patch +- theme_advanced_layout_manager +- theme_advanced_blockformats +- theme_advanced_styles +- theme_advanced_source_editor_width +- theme_advanced_source_editor_height +- theme_advanced_source_editor_wrap +- theme_advanced_toolbar_location +- theme_advanced_toolbar_align +- theme_advanced_statusbar_location +- theme_advanced_buttons1 +- theme_advanced_buttons1_add +- theme_advanced_buttons1_add_before +- theme_advanced_buttons2 +- theme_advanced_buttons2_add +- theme_advanced_buttons2_add_before +- theme_advanced_buttons3 +- theme_advanced_buttons3_add +- theme_advanced_buttons3_add_before +- theme_advanced_disable +- theme_advanced_containers +- theme_advanced_containers_default_class +- theme_advanced_containers_default_align +- theme_advanced_container_ +- theme_advanced_container__class +- theme_advanced_container__align +- theme_advanced_custom_layout +- theme_advanced_link_targets +- theme_advanced_resizing +- theme_advanced_resizing_use_cookie +- theme_advanced_resize_horizontal +- theme_advanced_path +- theme_advanced_fonts diff --git a/vendor/plugins/tiny_mce_gzip/README b/vendor/plugins/tiny_mce_gzip/README new file mode 100644 index 0000000..339aeb5 --- /dev/null +++ b/vendor/plugins/tiny_mce_gzip/README @@ -0,0 +1,37 @@ +TineMceGzip +=========== + +By: Ben Kittrell - http://garbageburrito.com + DoodleBit LLC - http://doodlebit.com + +For: DoodleKit Website Builer - http://doodlekit.com + +Assumptions +=========== + +This plugin assumes that you have TinyMCE 2.0.6.1 or higher installed in /public/javascripts/tiny_mce. + +Installation +============ + +Extract the plugin to vendor/plugins. This README should be in RAILS_ROOT/vendor/plugins/tiny_mce_gzip + +Add the following line to routes.rb + + TinyMceGzip::Routes.add_routes + +Change your tiny_mce javascript include to the following. + + <%= javascript_include_tag("tiny_mce/tiny_mce_gzip") %> + +That's it! + + +Additional Configuration +======================== + +To utilize the caching mechanism, ensure that the following property is set to true in production.rb. + +config.action_controller.perform_caching = true + + diff --git a/vendor/plugins/tiny_mce_gzip/init.rb b/vendor/plugins/tiny_mce_gzip/init.rb new file mode 100644 index 0000000..d458ec3 --- /dev/null +++ b/vendor/plugins/tiny_mce_gzip/init.rb @@ -0,0 +1,2 @@ +# Include hook code here +require 'tiny_mce_gzip_routes' diff --git a/vendor/plugins/tiny_mce_gzip/lib/gzip_action_cache.rb b/vendor/plugins/tiny_mce_gzip/lib/gzip_action_cache.rb new file mode 100644 index 0000000..f8a5fc6 --- /dev/null +++ b/vendor/plugins/tiny_mce_gzip/lib/gzip_action_cache.rb @@ -0,0 +1,79 @@ +module ActionController + module Caching + module Actions +# + module ClassMethods #:nodoc: + def caches_gzip_action(*actions) + around_filter(GzipActionCacheFilter.new(perform_caching, *actions)) + end + end + + class GzipActionCacheFilter #:nodoc: + begin + require 'zlib' + require 'stringio' + GZIP_SUPPORTED = true + rescue + GZIP_SUPPORTED = false + end + + def initialize(perform_caching, *actions, &block) + @actions = actions + @perform_caching = perform_caching + end + + def before(controller) + return unless @actions.include?(controller.action_name.intern) + + if @perform_caching + if cache = controller.read_fragment(controller.url_for.split("://").last) + controller.rendered_action_cache = true + + if accepts_gzip?(controller) + cache = compress_output(cache) + controller.response.headers['Content-encoding'] = @compression_encoding + end + + controller.send(:render_text, cache) + return false + end + elsif accepts_gzip?(controller) + controller.response.body = compress_output(controller.response.body) + end + end + + def after(controller) + return if !@perform_caching || !@actions.include?(controller.action_name.intern) || controller.rendered_action_cache + controller.write_fragment(controller.url_for.split("://").last, controller.response.body) + end + + private + + def accepts_gzip?(controller) + return false unless GZIP_SUPPORTED + accepts = controller.request.env['HTTP_ACCEPT_ENCODING'] + return false unless accepts && accepts =~ /(x-gzip|gzip)/ + @compression_encoding = $1 + true + end + + def compress_output(body) + output = StringIO.new + def output.close + # Zlib does a close. Bad Zlib... + rewind + end + gz = Zlib::GzipWriter.new(output) + gz.write(body) + gz.close + if output.length < body.length + @old_response_body = body + output.string + end + end + + end + end + end +end + \ No newline at end of file diff --git a/vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip.js b/vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip.js new file mode 100644 index 0000000..c6a904c --- /dev/null +++ b/vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip.js @@ -0,0 +1,120 @@ +var tinyMCE_GZ = { + settings : { + plugins : 'style,layer,table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras', + themes : 'simple,advanced', + languages : 'en', + page_name : 'tiny_mce_gzip', + check : true + }, + + init : function(s) { + var n, d = document, nl, i, b = '', sr, db; + + this.isIE = (navigator.appName == "Microsoft Internet Explorer"); + this.isOpera = navigator.userAgent.indexOf('Opera') != -1; + + for (n in s) + this.settings[n] = s[n]; + + for (i=0, nl = d.getElementsByTagName('base'); i'); + else + d.write(""); + } + }, + + loadFile : function(u) { + document.write(''); + }, + + start : function() { + var s = this.settings, p = TinyMCE_Engine.prototype; + + p.__loadScript = p.loadScript; + p.__importThemeLanguagePack = p.importThemeLanguagePack; + p.__importPluginLanguagePack = p.importPluginLanguagePack; + p.__loadNextScript = p.loadNextScript; + p.loadScript = p.importThemeLanguagePack = p.importPluginLanguagePack = p.loadNextScript = function() {}; + tinyMCE.baseURL = this.baseURL.substring(0, this.baseURL.length - 1); + tinyMCE.settings = {}; + tinyMCE.srcMode = ''; + }, + + end : function() { + var s = this.settings, l = tinyMCE.loadedFiles, la, i, p = TinyMCE_Engine.prototype; + + this.addFiles(s.plugins, 'plugins', 'editor_plugin.js'); + this.addFiles(s.themes, 'themes', 'editor_template.js'); + + la = s.languages.replace(/\s+/, '').split(',') + for (i=0; i out, :layout => false + end + + def check + render :text => "tinyMCE_GZ.check();", :layout => false + end + + def js + suffix = '' + + custom = [] #custom js files + + languages = params[:languages].split(/,/) + plugins = params[:plugins].split(/,/) + themes = params[:themes].split(/,/) + + tinymce_dir = File.join(RAILS_ROOT, "public", "javascripts", "tiny_mce") + + content = File.read(File.join(tinymce_dir, "tiny_mce#{suffix}.js")) + content += "tinyMCE_GZ.start();" + + for language in languages + content += File.read(File.join(tinymce_dir, "langs", "#{language}.js")) + end + + for theme in themes + content += File.read(File.join(tinymce_dir, "themes", theme, "editor_template#{suffix}.js")) + + for lang in languages + language_file = File.join(tinymce_dir, "themes", theme, "langs", "#{lang}.js") + content += File.read(language_file) if File.exists?(language_file) + end + end + + for file in custom + content += File.read(File.join(RAILS_ROOT, "public", "javascripts", file)) + end + + for plugin in plugins + plugin_file = File.join(tinymce_dir, "plugins", plugin, "editor_plugin#{suffix}.js") + content += File.read(plugin_file) if File.exists?(plugin_file) + + for lang in languages + language_file = File.join(tinymce_dir, "plugins", plugin, "langs", "#{lang}.js") + content += File.read(language_file) if File.exists?(language_file) + end + end + + content += "tinyMCE_GZ.end();" + + render :text => content, :layout => false + end + +end \ No newline at end of file diff --git a/vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip_routes.rb b/vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip_routes.rb new file mode 100644 index 0000000..718d9d8 --- /dev/null +++ b/vendor/plugins/tiny_mce_gzip/lib/tiny_mce_gzip_routes.rb @@ -0,0 +1,9 @@ +module TinyMceGzip + class Routes + def self.add_routes + ActionController::Routing::Routes.add_route '/javascripts/tiny_mce/tiny_mce_gzip.js', :controller => "tiny_mce_gzip" + ActionController::Routing::Routes.add_route '/javascripts/tiny_mce/tiny_mce_gzip_js.js', :controller => "tiny_mce_gzip", :action => 'js' + ActionController::Routing::Routes.add_route '/javascripts/tiny_mce/tiny_mce_gzip_check.js', :controller => "tiny_mce_gzip", :action => 'check' + end + end +end \ No newline at end of file -- 2.11.4.GIT