adicionando arquivos de media (incluindo o editor tiny mce (LGPL)
authorLincoln de Sousa <pythonwarrior@pidinti.localdomain>
Fri, 27 Jul 2007 14:54:21 +0000 (11:54 -0300)
committerLincoln de Sousa <pythonwarrior@pidinti.localdomain>
Fri, 27 Jul 2007 14:54:21 +0000 (11:54 -0300)
423 files changed:
media/js/textarea.js [new file with mode: 0644]
media/tiny_mce/blank.htm [new file with mode: 0755]
media/tiny_mce/langs/en.js [new file with mode: 0755]
media/tiny_mce/langs/readme.txt [new file with mode: 0755]
media/tiny_mce/license.txt [new file with mode: 0755]
media/tiny_mce/plugins/advhr/css/advhr.css [new file with mode: 0755]
media/tiny_mce/plugins/advhr/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/advhr/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/advhr/images/advhr.gif [new file with mode: 0755]
media/tiny_mce/plugins/advhr/jscripts/rule.js [new file with mode: 0755]
media/tiny_mce/plugins/advhr/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/advhr/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/advhr/rule.htm [new file with mode: 0755]
media/tiny_mce/plugins/advimage/css/advimage.css [new file with mode: 0755]
media/tiny_mce/plugins/advimage/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/advimage/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/advimage/image.htm [new file with mode: 0755]
media/tiny_mce/plugins/advimage/images/sample.gif [new file with mode: 0755]
media/tiny_mce/plugins/advimage/jscripts/functions.js [new file with mode: 0755]
media/tiny_mce/plugins/advimage/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/advimage/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/advlink/css/advlink.css [new file with mode: 0755]
media/tiny_mce/plugins/advlink/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/advlink/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/advlink/jscripts/functions.js [new file with mode: 0755]
media/tiny_mce/plugins/advlink/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/advlink/link.htm [new file with mode: 0755]
media/tiny_mce/plugins/advlink/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/autosave/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/autosave/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/autosave/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/autosave/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/bbcode/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/bbcode/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/cleanup/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/cleanup/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/cleanup/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/contextmenu/css/contextmenu.css [new file with mode: 0755]
media/tiny_mce/plugins/contextmenu/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/contextmenu/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/contextmenu/images/spacer.gif [new file with mode: 0755]
media/tiny_mce/plugins/contextmenu/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/devkit/css/devkit.css [new file with mode: 0755]
media/tiny_mce/plugins/devkit/css/devkit_ui.css [new file with mode: 0755]
media/tiny_mce/plugins/devkit/devkit.htm [new file with mode: 0755]
media/tiny_mce/plugins/devkit/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/devkit/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/devkit/images/flip_down.gif [new file with mode: 0755]
media/tiny_mce/plugins/devkit/images/flip_up.gif [new file with mode: 0755]
media/tiny_mce/plugins/devkit/jscripts/devkit.js [new file with mode: 0755]
media/tiny_mce/plugins/devkit/jscripts/diff.js [new file with mode: 0755]
media/tiny_mce/plugins/devkit/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/directionality/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/directionality/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/directionality/images/ltr.gif [new file with mode: 0755]
media/tiny_mce/plugins/directionality/images/rtl.gif [new file with mode: 0755]
media/tiny_mce/plugins/directionality/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/directionality/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/emotions/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/emotions/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/emotions/emotions.htm [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/emotions.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-cool.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-cry.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-embarassed.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-frown.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-innocent.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-kiss.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-laughing.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-sealed.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-smile.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-surprised.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-undecided.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-wink.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/images/smiley-yell.gif [new file with mode: 0755]
media/tiny_mce/plugins/emotions/jscripts/functions.js [new file with mode: 0755]
media/tiny_mce/plugins/emotions/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/emotions/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/flash/css/content.css [new file with mode: 0755]
media/tiny_mce/plugins/flash/css/flash.css [new file with mode: 0755]
media/tiny_mce/plugins/flash/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/flash/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/flash/flash.htm [new file with mode: 0755]
media/tiny_mce/plugins/flash/images/flash.gif [new file with mode: 0755]
media/tiny_mce/plugins/flash/jscripts/flash.js [new file with mode: 0755]
media/tiny_mce/plugins/flash/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/flash/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/blank.htm [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/css/fullpage.css [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/fullpage.htm [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/images/add.gif [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/images/fullpage.gif [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/images/move_down.gif [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/images/move_up.gif [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/images/remove.gif [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/jscripts/fullpage.js [new file with mode: 0755]
media/tiny_mce/plugins/fullpage/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/fullscreen/css/page.css [new file with mode: 0755]
media/tiny_mce/plugins/fullscreen/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/fullscreen/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/fullscreen/fullscreen.htm [new file with mode: 0755]
media/tiny_mce/plugins/fullscreen/images/fullscreen.gif [new file with mode: 0755]
media/tiny_mce/plugins/fullscreen/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/fullscreen/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/iespell/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/iespell/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/iespell/images/iespell.gif [new file with mode: 0755]
media/tiny_mce/plugins/iespell/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/iespell/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/css/inlinepopup.css [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/images/spacer.gif [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/images/window_close.gif [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/images/window_maximize.gif [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/images/window_minimize.gif [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/images/window_resize.gif [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/jscripts/mcwindows.js [new file with mode: 0755]
media/tiny_mce/plugins/inlinepopups/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/insertdatetime/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/insertdatetime/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/insertdatetime/images/insertdate.gif [new file with mode: 0755]
media/tiny_mce/plugins/insertdatetime/images/inserttime.gif [new file with mode: 0755]
media/tiny_mce/plugins/insertdatetime/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/insertdatetime/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/layer/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/layer/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/layer/images/absolute.gif [new file with mode: 0755]
media/tiny_mce/plugins/layer/images/backward.gif [new file with mode: 0755]
media/tiny_mce/plugins/layer/images/forward.gif [new file with mode: 0755]
media/tiny_mce/plugins/layer/images/insert_layer.gif [new file with mode: 0755]
media/tiny_mce/plugins/layer/images/insertlayer.gif [new file with mode: 0755]
media/tiny_mce/plugins/layer/images/movebackward.gif [new file with mode: 0755]
media/tiny_mce/plugins/layer/images/moveforward.gif [new file with mode: 0755]
media/tiny_mce/plugins/layer/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/layer/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/media/css/content.css [new file with mode: 0755]
media/tiny_mce/plugins/media/css/media.css [new file with mode: 0755]
media/tiny_mce/plugins/media/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/media/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/media/images/flash.gif [new file with mode: 0755]
media/tiny_mce/plugins/media/images/media.gif [new file with mode: 0755]
media/tiny_mce/plugins/media/images/quicktime.gif [new file with mode: 0755]
media/tiny_mce/plugins/media/images/realmedia.gif [new file with mode: 0755]
media/tiny_mce/plugins/media/images/shockwave.gif [new file with mode: 0755]
media/tiny_mce/plugins/media/images/windowsmedia.gif [new file with mode: 0755]
media/tiny_mce/plugins/media/jscripts/embed.js [new file with mode: 0755]
media/tiny_mce/plugins/media/jscripts/media.js [new file with mode: 0755]
media/tiny_mce/plugins/media/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/media/media.htm [new file with mode: 0755]
media/tiny_mce/plugins/nonbreaking/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/nonbreaking/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif [new file with mode: 0755]
media/tiny_mce/plugins/nonbreaking/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/noneditable/css/noneditable.css [new file with mode: 0755]
media/tiny_mce/plugins/noneditable/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/noneditable/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/noneditable/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/paste/blank.htm [new file with mode: 0755]
media/tiny_mce/plugins/paste/css/blank.css [new file with mode: 0755]
media/tiny_mce/plugins/paste/css/pasteword.css [new file with mode: 0755]
media/tiny_mce/plugins/paste/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/paste/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/paste/images/pastetext.gif [new file with mode: 0755]
media/tiny_mce/plugins/paste/images/pasteword.gif [new file with mode: 0755]
media/tiny_mce/plugins/paste/images/selectall.gif [new file with mode: 0755]
media/tiny_mce/plugins/paste/jscripts/pastetext.js [new file with mode: 0755]
media/tiny_mce/plugins/paste/jscripts/pasteword.js [new file with mode: 0755]
media/tiny_mce/plugins/paste/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/paste/pastetext.htm [new file with mode: 0755]
media/tiny_mce/plugins/paste/pasteword.htm [new file with mode: 0755]
media/tiny_mce/plugins/paste/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/preview/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/preview/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/preview/example.html [new file with mode: 0755]
media/tiny_mce/plugins/preview/images/preview.gif [new file with mode: 0755]
media/tiny_mce/plugins/preview/jscripts/embed.js [new file with mode: 0755]
media/tiny_mce/plugins/preview/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/preview/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/print/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/print/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/print/images/print.gif [new file with mode: 0755]
media/tiny_mce/plugins/print/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/print/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/save/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/save/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/save/images/cancel.gif [new file with mode: 0755]
media/tiny_mce/plugins/save/images/save.gif [new file with mode: 0755]
media/tiny_mce/plugins/save/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/save/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/css/searchreplace.css [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/images/replace.gif [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/images/search.gif [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/searchreplace/searchreplace.htm [new file with mode: 0755]
media/tiny_mce/plugins/style/css/props.css [new file with mode: 0755]
media/tiny_mce/plugins/style/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/style/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/style/images/apply_button_bg.gif [new file with mode: 0755]
media/tiny_mce/plugins/style/images/style_info.gif [new file with mode: 0755]
media/tiny_mce/plugins/style/images/styleprops.gif [new file with mode: 0755]
media/tiny_mce/plugins/style/jscripts/props.js [new file with mode: 0755]
media/tiny_mce/plugins/style/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/style/props.htm [new file with mode: 0755]
media/tiny_mce/plugins/style/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/table/cell.htm [new file with mode: 0755]
media/tiny_mce/plugins/table/css/cell.css [new file with mode: 0755]
media/tiny_mce/plugins/table/css/row.css [new file with mode: 0755]
media/tiny_mce/plugins/table/css/table.css [new file with mode: 0755]
media/tiny_mce/plugins/table/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/table/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/table/images/buttons.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_cell_props.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_delete.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_delete_col.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_delete_row.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_insert_col_after.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_insert_col_before.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_insert_row_after.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_insert_row_before.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_merge_cells.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_row_props.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/images/table_split_cells.gif [new file with mode: 0755]
media/tiny_mce/plugins/table/jscripts/cell.js [new file with mode: 0755]
media/tiny_mce/plugins/table/jscripts/merge_cells.js [new file with mode: 0755]
media/tiny_mce/plugins/table/jscripts/row.js [new file with mode: 0755]
media/tiny_mce/plugins/table/jscripts/table.js [new file with mode: 0755]
media/tiny_mce/plugins/table/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/table/merge_cells.htm [new file with mode: 0755]
media/tiny_mce/plugins/table/readme.txt [new file with mode: 0755]
media/tiny_mce/plugins/table/row.htm [new file with mode: 0755]
media/tiny_mce/plugins/table/table.htm [new file with mode: 0755]
media/tiny_mce/plugins/template/blank.htm [new file with mode: 0755]
media/tiny_mce/plugins/template/css/template.css [new file with mode: 0755]
media/tiny_mce/plugins/template/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/template/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/template/images/template.gif [new file with mode: 0755]
media/tiny_mce/plugins/template/jscripts/template.js [new file with mode: 0755]
media/tiny_mce/plugins/template/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/template/template.htm [new file with mode: 0755]
media/tiny_mce/plugins/visualchars/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/visualchars/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/visualchars/images/visualchars.gif [new file with mode: 0755]
media/tiny_mce/plugins/visualchars/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/abbr.htm [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/acronym.htm [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/attributes.htm [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/cite.htm [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/css/attributes.css [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/css/popup.css [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/del.htm [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/images/abbr.gif [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/images/acronym.gif [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/images/attribs.gif [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/images/cite.gif [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/images/date_time.gif [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/images/del.gif [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/images/ins.gif [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/images/remove_button_bg.gif [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/ins.htm [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/jscripts/abbr.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/jscripts/acronym.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/jscripts/attributes.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/jscripts/cite.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/jscripts/del.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/jscripts/element_common.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/jscripts/ins.js [new file with mode: 0755]
media/tiny_mce/plugins/xhtmlxtras/langs/en.js [new file with mode: 0755]
media/tiny_mce/plugins/zoom/editor_plugin.js [new file with mode: 0755]
media/tiny_mce/plugins/zoom/editor_plugin_src.js [new file with mode: 0755]
media/tiny_mce/plugins/zoom/readme.txt [new file with mode: 0755]
media/tiny_mce/themes/advanced/about.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/anchor.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/charmap.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/color_picker.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/css/colorpicker.css [new file with mode: 0755]
media/tiny_mce/themes/advanced/css/editor_content.css [new file with mode: 0755]
media/tiny_mce/themes/advanced/css/editor_popup.css [new file with mode: 0755]
media/tiny_mce/themes/advanced/css/editor_ui.css [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/about.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/common_buttons.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/index.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/insert_image_button.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/insert_link_button.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/insert_table_button.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/docs/en/style.css [new file with mode: 0755]
media/tiny_mce/themes/advanced/editor_template.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/editor_template_src.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/image.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/anchor.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/anchor_symbol.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/backcolor.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/bold.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/bold_de_se.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/bold_es.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/bold_fr.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/bold_ru.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/bold_tw.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/browse.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/bullist.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/button_menu.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/buttons.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/cancel_button_bg.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/charmap.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/cleanup.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/close.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/code.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/color.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/colors.jpg [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/copy.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/custom_1.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/cut.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/forecolor.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/help.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/hr.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/image.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/indent.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/insert_button_bg.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/italic.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/italic_de_se.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/italic_es.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/italic_ru.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/italic_tw.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/justifycenter.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/justifyfull.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/justifyleft.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/justifyright.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/link.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/menu_check.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/newdocument.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/numlist.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/opacity.png [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/outdent.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/paste.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/redo.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/removeformat.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/separator.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/spacer.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/statusbar_resize.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/strikethrough.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/sub.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/sup.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/underline.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/underline_es.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/underline_fr.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/underline_ru.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/underline_tw.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/undo.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/unlink.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/visualaid.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/xp/tab_bg.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/xp/tab_end.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/images/xp/tabs_bg.gif [new file with mode: 0755]
media/tiny_mce/themes/advanced/jscripts/about.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/jscripts/anchor.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/jscripts/charmap.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/jscripts/color_picker.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/jscripts/image.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/jscripts/link.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/jscripts/source_editor.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/langs/en.js [new file with mode: 0755]
media/tiny_mce/themes/advanced/link.htm [new file with mode: 0755]
media/tiny_mce/themes/advanced/source_editor.htm [new file with mode: 0755]
media/tiny_mce/themes/simple/css/editor_content.css [new file with mode: 0755]
media/tiny_mce/themes/simple/css/editor_popup.css [new file with mode: 0755]
media/tiny_mce/themes/simple/css/editor_ui.css [new file with mode: 0755]
media/tiny_mce/themes/simple/editor_template.js [new file with mode: 0755]
media/tiny_mce/themes/simple/editor_template_src.js [new file with mode: 0755]
media/tiny_mce/themes/simple/images/bold.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/bold_de_se.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/bold_fr.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/bold_ru.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/bold_tw.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/bullist.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/buttons.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/cleanup.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/italic.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/italic_de_se.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/italic_ru.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/italic_tw.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/numlist.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/redo.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/separator.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/spacer.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/strikethrough.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/underline.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/underline_fr.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/underline_ru.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/underline_tw.gif [new file with mode: 0755]
media/tiny_mce/themes/simple/images/undo.gif [new file with mode: 0755]
media/tiny_mce/tiny_mce.js [new file with mode: 0755]
media/tiny_mce/tiny_mce_popup.js [new file with mode: 0755]
media/tiny_mce/tiny_mce_src.js [new file with mode: 0755]
media/tiny_mce/utils/editable_selects.js [new file with mode: 0755]
media/tiny_mce/utils/form_utils.js [new file with mode: 0755]
media/tiny_mce/utils/mclayer.js [new file with mode: 0755]
media/tiny_mce/utils/mctabs.js [new file with mode: 0755]
media/tiny_mce/utils/validate.js [new file with mode: 0755]

diff --git a/media/js/textarea.js b/media/js/textarea.js
new file mode 100644 (file)
index 0000000..ccc9408
--- /dev/null
@@ -0,0 +1,20 @@
+tinyMCE.init({
+       mode : "textareas",
+       theme : "advanced",
+       theme_advanced_toolbar_location : "top",
+       theme_advanced_toolbar_align : "left",
+       theme_advanced_buttons1 : "fullscreen,separator,preview,separator,bold,italic,underline,strikethrough,separator,bullist,numlist,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,separator,image,cleanup,help,separator,code",
+       theme_advanced_buttons2 : "",
+       theme_advanced_buttons3 : "",
+       auto_cleanup_word : true,
+       plugins : "table,save,advhr,advimage,advlink,emotions,iespell,insertdatetime,preview,zoom,flash,searchreplace,print,contextmenu,fullscreen",
+       plugin_insertdate_dateFormat : "%m/%d/%Y",
+       plugin_insertdate_timeFormat : "%H:%M:%S",
+       extended_valid_elements : "a[name|href|target=_blank|title|onclick],img[class|src|border=0|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name],hr[class|width|size|noshade],font[face|size|color|style],span[class|align|style]",
+       fullscreen_settings : {
+               theme_advanced_path_location : "top",
+               theme_advanced_buttons1 : "fullscreen,separator,preview,separator,cut,copy,paste,separator,undo,redo,separator,search,replace,separator,code,separator,cleanup,separator,bold,italic,underline,strikethrough,separator,forecolor,backcolor,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,help",
+               theme_advanced_buttons2 : "removeformat,styleselect,formatselect,fontselect,fontsizeselect,separator,bullist,numlist,outdent,indent,separator,link,unlink,anchor",
+               theme_advanced_buttons3 : "sub,sup,separator,image,insertdate,inserttime,separator,tablecontrols,separator,hr,advhr,visualaid,separator,charmap,emotions,iespell,flash,separator,print"
+       }
+});
diff --git a/media/tiny_mce/blank.htm b/media/tiny_mce/blank.htm
new file mode 100755 (executable)
index 0000000..5a4a5a5
--- /dev/null
@@ -0,0 +1,9 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>blank_page</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+</head>\r
+<body class="mceContentBody">\r
+\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/langs/en.js b/media/tiny_mce/langs/en.js
new file mode 100755 (executable)
index 0000000..c093eaf
--- /dev/null
@@ -0,0 +1,41 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+bold_desc : 'Bold (Ctrl+B)',\r
+italic_desc : 'Italic (Ctrl+I)',\r
+underline_desc : 'Underline (Ctrl+U)',\r
+striketrough_desc : 'Strikethrough',\r
+justifyleft_desc : 'Align left',\r
+justifycenter_desc : 'Align center',\r
+justifyright_desc : 'Align right',\r
+justifyfull_desc : 'Align full',\r
+bullist_desc : 'Unordered list',\r
+numlist_desc : 'Ordered list',\r
+outdent_desc : 'Outdent',\r
+indent_desc : 'Indent',\r
+undo_desc : 'Undo (Ctrl+Z)',\r
+redo_desc : 'Redo (Ctrl+Y)',\r
+link_desc : 'Insert/edit link',\r
+unlink_desc : 'Unlink',\r
+image_desc : 'Insert/edit image',\r
+cleanup_desc : 'Cleanup messy code',\r
+focus_alert : 'A editor instance must be focused before using this command.',\r
+edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?',\r
+insert_link_title : 'Insert/edit link',\r
+insert : 'Insert',\r
+update : 'Update',\r
+cancel : 'Cancel',\r
+insert_link_url : 'Link URL',\r
+insert_link_target : 'Target',\r
+insert_link_target_same : 'Open link in the same window',\r
+insert_link_target_blank : 'Open link in a new window',\r
+insert_image_title : 'Insert/edit image',\r
+insert_image_src : 'Image URL',\r
+insert_image_alt : 'Image description',\r
+help_desc : 'Help',\r
+bold_img : "bold.gif",\r
+italic_img : "italic.gif",\r
+underline_img : "underline.gif",\r
+clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+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.'\r
+});\r
diff --git a/media/tiny_mce/langs/readme.txt b/media/tiny_mce/langs/readme.txt
new file mode 100755 (executable)
index 0000000..9c3a9d9
--- /dev/null
@@ -0,0 +1,9 @@
+Beginning with version 2.0.5 the language packs are no\r
+longer included with the core distribution.\r
+Language packs can be downloaded from the TinyMCE website:\r
+http://tinymce.moxiecode.com/download.php\r
+\r
+The language pack codes are based on ISO-639-1:\r
+http://www.loc.gov/standards/iso639-2/englangn.html\r
+\r
+Plrease try using entities if possible. Like &aring; etc for non a-z characters.\r
diff --git a/media/tiny_mce/license.txt b/media/tiny_mce/license.txt
new file mode 100755 (executable)
index 0000000..60d6d4c
--- /dev/null
@@ -0,0 +1,504 @@
+                 GNU LESSER GENERAL PUBLIC LICENSE\r
+                      Version 2.1, February 1999\r
+\r
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.\r
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
+ Everyone is permitted to copy and distribute verbatim copies\r
+ of this license document, but changing it is not allowed.\r
+\r
+[This is the first released version of the Lesser GPL.  It also counts\r
+ as the successor of the GNU Library Public License, version 2, hence\r
+ the version number 2.1.]\r
+\r
+                           Preamble\r
+\r
+  The licenses for most software are designed to take away your\r
+freedom to share and change it.  By contrast, the GNU General Public\r
+Licenses are intended to guarantee your freedom to share and change\r
+free software--to make sure the software is free for all its users.\r
+\r
+  This license, the Lesser General Public License, applies to some\r
+specially designated software packages--typically libraries--of the\r
+Free Software Foundation and other authors who decide to use it.  You\r
+can use it too, but we suggest you first think carefully about whether\r
+this license or the ordinary General Public License is the better\r
+strategy to use in any particular case, based on the explanations below.\r
+\r
+  When we speak of free software, we are referring to freedom of use,\r
+not price.  Our General Public Licenses are designed to make sure that\r
+you have the freedom to distribute copies of free software (and charge\r
+for this service if you wish); that you receive source code or can get\r
+it if you want it; that you can change the software and use pieces of\r
+it in new free programs; and that you are informed that you can do\r
+these things.\r
+\r
+  To protect your rights, we need to make restrictions that forbid\r
+distributors to deny you these rights or to ask you to surrender these\r
+rights.  These restrictions translate to certain responsibilities for\r
+you if you distribute copies of the library or if you modify it.\r
+\r
+  For example, if you distribute copies of the library, whether gratis\r
+or for a fee, you must give the recipients all the rights that we gave\r
+you.  You must make sure that they, too, receive or can get the source\r
+code.  If you link other code with the library, you must provide\r
+complete object files to the recipients, so that they can relink them\r
+with the library after making changes to the library and recompiling\r
+it.  And you must show them these terms so they know their rights.\r
+\r
+  We protect your rights with a two-step method: (1) we copyright the\r
+library, and (2) we offer you this license, which gives you legal\r
+permission to copy, distribute and/or modify the library.\r
+\r
+  To protect each distributor, we want to make it very clear that\r
+there is no warranty for the free library.  Also, if the library is\r
+modified by someone else and passed on, the recipients should know\r
+that what they have is not the original version, so that the original\r
+author's reputation will not be affected by problems that might be\r
+introduced by others.\r
+\r
+  Finally, software patents pose a constant threat to the existence of\r
+any free program.  We wish to make sure that a company cannot\r
+effectively restrict the users of a free program by obtaining a\r
+restrictive license from a patent holder.  Therefore, we insist that\r
+any patent license obtained for a version of the library must be\r
+consistent with the full freedom of use specified in this license.\r
+\r
+  Most GNU software, including some libraries, is covered by the\r
+ordinary GNU General Public License.  This license, the GNU Lesser\r
+General Public License, applies to certain designated libraries, and\r
+is quite different from the ordinary General Public License.  We use\r
+this license for certain libraries in order to permit linking those\r
+libraries into non-free programs.\r
+\r
+  When a program is linked with a library, whether statically or using\r
+a shared library, the combination of the two is legally speaking a\r
+combined work, a derivative of the original library.  The ordinary\r
+General Public License therefore permits such linking only if the\r
+entire combination fits its criteria of freedom.  The Lesser General\r
+Public License permits more lax criteria for linking other code with\r
+the library.\r
+\r
+  We call this license the "Lesser" General Public License because it\r
+does Less to protect the user's freedom than the ordinary General\r
+Public License.  It also provides other free software developers Less\r
+of an advantage over competing non-free programs.  These disadvantages\r
+are the reason we use the ordinary General Public License for many\r
+libraries.  However, the Lesser license provides advantages in certain\r
+special circumstances.\r
+\r
+  For example, on rare occasions, there may be a special need to\r
+encourage the widest possible use of a certain library, so that it becomes\r
+a de-facto standard.  To achieve this, non-free programs must be\r
+allowed to use the library.  A more frequent case is that a free\r
+library does the same job as widely used non-free libraries.  In this\r
+case, there is little to gain by limiting the free library to free\r
+software only, so we use the Lesser General Public License.\r
+\r
+  In other cases, permission to use a particular library in non-free\r
+programs enables a greater number of people to use a large body of\r
+free software.  For example, permission to use the GNU C Library in\r
+non-free programs enables many more people to use the whole GNU\r
+operating system, as well as its variant, the GNU/Linux operating\r
+system.\r
+\r
+  Although the Lesser General Public License is Less protective of the\r
+users' freedom, it does ensure that the user of a program that is\r
+linked with the Library has the freedom and the wherewithal to run\r
+that program using a modified version of the Library.\r
+\r
+  The precise terms and conditions for copying, distribution and\r
+modification follow.  Pay close attention to the difference between a\r
+"work based on the library" and a "work that uses the library".  The\r
+former contains code derived from the library, whereas the latter must\r
+be combined with the library in order to run.\r
+\r
+                 GNU LESSER GENERAL PUBLIC LICENSE\r
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\r
+\r
+  0. This License Agreement applies to any software library or other\r
+program which contains a notice placed by the copyright holder or\r
+other authorized party saying it may be distributed under the terms of\r
+this Lesser General Public License (also called "this License").\r
+Each licensee is addressed as "you".\r
+\r
+  A "library" means a collection of software functions and/or data\r
+prepared so as to be conveniently linked with application programs\r
+(which use some of those functions and data) to form executables.\r
+\r
+  The "Library", below, refers to any such software library or work\r
+which has been distributed under these terms.  A "work based on the\r
+Library" means either the Library or any derivative work under\r
+copyright law: that is to say, a work containing the Library or a\r
+portion of it, either verbatim or with modifications and/or translated\r
+straightforwardly into another language.  (Hereinafter, translation is\r
+included without limitation in the term "modification".)\r
+\r
+  "Source code" for a work means the preferred form of the work for\r
+making modifications to it.  For a library, complete source code means\r
+all the source code for all modules it contains, plus any associated\r
+interface definition files, plus the scripts used to control compilation\r
+and installation of the library.\r
+\r
+  Activities other than copying, distribution and modification are not\r
+covered by this License; they are outside its scope.  The act of\r
+running a program using the Library is not restricted, and output from\r
+such a program is covered only if its contents constitute a work based\r
+on the Library (independent of the use of the Library in a tool for\r
+writing it).  Whether that is true depends on what the Library does\r
+and what the program that uses the Library does.\r
+  \r
+  1. You may copy and distribute verbatim copies of the Library's\r
+complete source code as you receive it, in any medium, provided that\r
+you conspicuously and appropriately publish on each copy an\r
+appropriate copyright notice and disclaimer of warranty; keep intact\r
+all the notices that refer to this License and to the absence of any\r
+warranty; and distribute a copy of this License along with the\r
+Library.\r
+\r
+  You may charge a fee for the physical act of transferring a copy,\r
+and you may at your option offer warranty protection in exchange for a\r
+fee.\r
+\r
+  2. You may modify your copy or copies of the Library or any portion\r
+of it, thus forming a work based on the Library, and copy and\r
+distribute such modifications or work under the terms of Section 1\r
+above, provided that you also meet all of these conditions:\r
+\r
+    a) The modified work must itself be a software library.\r
+\r
+    b) You must cause the files modified to carry prominent notices\r
+    stating that you changed the files and the date of any change.\r
+\r
+    c) You must cause the whole of the work to be licensed at no\r
+    charge to all third parties under the terms of this License.\r
+\r
+    d) If a facility in the modified Library refers to a function or a\r
+    table of data to be supplied by an application program that uses\r
+    the facility, other than as an argument passed when the facility\r
+    is invoked, then you must make a good faith effort to ensure that,\r
+    in the event an application does not supply such function or\r
+    table, the facility still operates, and performs whatever part of\r
+    its purpose remains meaningful.\r
+\r
+    (For example, a function in a library to compute square roots has\r
+    a purpose that is entirely well-defined independent of the\r
+    application.  Therefore, Subsection 2d requires that any\r
+    application-supplied function or table used by this function must\r
+    be optional: if the application does not supply it, the square\r
+    root function must still compute square roots.)\r
+\r
+These requirements apply to the modified work as a whole.  If\r
+identifiable sections of that work are not derived from the Library,\r
+and can be reasonably considered independent and separate works in\r
+themselves, then this License, and its terms, do not apply to those\r
+sections when you distribute them as separate works.  But when you\r
+distribute the same sections as part of a whole which is a work based\r
+on the Library, the distribution of the whole must be on the terms of\r
+this License, whose permissions for other licensees extend to the\r
+entire whole, and thus to each and every part regardless of who wrote\r
+it.\r
+\r
+Thus, it is not the intent of this section to claim rights or contest\r
+your rights to work written entirely by you; rather, the intent is to\r
+exercise the right to control the distribution of derivative or\r
+collective works based on the Library.\r
+\r
+In addition, mere aggregation of another work not based on the Library\r
+with the Library (or with a work based on the Library) on a volume of\r
+a storage or distribution medium does not bring the other work under\r
+the scope of this License.\r
+\r
+  3. You may opt to apply the terms of the ordinary GNU General Public\r
+License instead of this License to a given copy of the Library.  To do\r
+this, you must alter all the notices that refer to this License, so\r
+that they refer to the ordinary GNU General Public License, version 2,\r
+instead of to this License.  (If a newer version than version 2 of the\r
+ordinary GNU General Public License has appeared, then you can specify\r
+that version instead if you wish.)  Do not make any other change in\r
+these notices.\r
+\r
+  Once this change is made in a given copy, it is irreversible for\r
+that copy, so the ordinary GNU General Public License applies to all\r
+subsequent copies and derivative works made from that copy.\r
+\r
+  This option is useful when you wish to copy part of the code of\r
+the Library into a program that is not a library.\r
+\r
+  4. You may copy and distribute the Library (or a portion or\r
+derivative of it, under Section 2) in object code or executable form\r
+under the terms of Sections 1 and 2 above provided that you accompany\r
+it with the complete corresponding machine-readable source code, which\r
+must be distributed under the terms of Sections 1 and 2 above on a\r
+medium customarily used for software interchange.\r
+\r
+  If distribution of object code is made by offering access to copy\r
+from a designated place, then offering equivalent access to copy the\r
+source code from the same place satisfies the requirement to\r
+distribute the source code, even though third parties are not\r
+compelled to copy the source along with the object code.\r
+\r
+  5. A program that contains no derivative of any portion of the\r
+Library, but is designed to work with the Library by being compiled or\r
+linked with it, is called a "work that uses the Library".  Such a\r
+work, in isolation, is not a derivative work of the Library, and\r
+therefore falls outside the scope of this License.\r
+\r
+  However, linking a "work that uses the Library" with the Library\r
+creates an executable that is a derivative of the Library (because it\r
+contains portions of the Library), rather than a "work that uses the\r
+library".  The executable is therefore covered by this License.\r
+Section 6 states terms for distribution of such executables.\r
+\r
+  When a "work that uses the Library" uses material from a header file\r
+that is part of the Library, the object code for the work may be a\r
+derivative work of the Library even though the source code is not.\r
+Whether this is true is especially significant if the work can be\r
+linked without the Library, or if the work is itself a library.  The\r
+threshold for this to be true is not precisely defined by law.\r
+\r
+  If such an object file uses only numerical parameters, data\r
+structure layouts and accessors, and small macros and small inline\r
+functions (ten lines or less in length), then the use of the object\r
+file is unrestricted, regardless of whether it is legally a derivative\r
+work.  (Executables containing this object code plus portions of the\r
+Library will still fall under Section 6.)\r
+\r
+  Otherwise, if the work is a derivative of the Library, you may\r
+distribute the object code for the work under the terms of Section 6.\r
+Any executables containing that work also fall under Section 6,\r
+whether or not they are linked directly with the Library itself.\r
+\r
+  6. As an exception to the Sections above, you may also combine or\r
+link a "work that uses the Library" with the Library to produce a\r
+work containing portions of the Library, and distribute that work\r
+under terms of your choice, provided that the terms permit\r
+modification of the work for the customer's own use and reverse\r
+engineering for debugging such modifications.\r
+\r
+  You must give prominent notice with each copy of the work that the\r
+Library is used in it and that the Library and its use are covered by\r
+this License.  You must supply a copy of this License.  If the work\r
+during execution displays copyright notices, you must include the\r
+copyright notice for the Library among them, as well as a reference\r
+directing the user to the copy of this License.  Also, you must do one\r
+of these things:\r
+\r
+    a) Accompany the work with the complete corresponding\r
+    machine-readable source code for the Library including whatever\r
+    changes were used in the work (which must be distributed under\r
+    Sections 1 and 2 above); and, if the work is an executable linked\r
+    with the Library, with the complete machine-readable "work that\r
+    uses the Library", as object code and/or source code, so that the\r
+    user can modify the Library and then relink to produce a modified\r
+    executable containing the modified Library.  (It is understood\r
+    that the user who changes the contents of definitions files in the\r
+    Library will not necessarily be able to recompile the application\r
+    to use the modified definitions.)\r
+\r
+    b) Use a suitable shared library mechanism for linking with the\r
+    Library.  A suitable mechanism is one that (1) uses at run time a\r
+    copy of the library already present on the user's computer system,\r
+    rather than copying library functions into the executable, and (2)\r
+    will operate properly with a modified version of the library, if\r
+    the user installs one, as long as the modified version is\r
+    interface-compatible with the version that the work was made with.\r
+\r
+    c) Accompany the work with a written offer, valid for at\r
+    least three years, to give the same user the materials\r
+    specified in Subsection 6a, above, for a charge no more\r
+    than the cost of performing this distribution.\r
+\r
+    d) If distribution of the work is made by offering access to copy\r
+    from a designated place, offer equivalent access to copy the above\r
+    specified materials from the same place.\r
+\r
+    e) Verify that the user has already received a copy of these\r
+    materials or that you have already sent this user a copy.\r
+\r
+  For an executable, the required form of the "work that uses the\r
+Library" must include any data and utility programs needed for\r
+reproducing the executable from it.  However, as a special exception,\r
+the materials to be distributed need not include anything that is\r
+normally distributed (in either source or binary form) with the major\r
+components (compiler, kernel, and so on) of the operating system on\r
+which the executable runs, unless that component itself accompanies\r
+the executable.\r
+\r
+  It may happen that this requirement contradicts the license\r
+restrictions of other proprietary libraries that do not normally\r
+accompany the operating system.  Such a contradiction means you cannot\r
+use both them and the Library together in an executable that you\r
+distribute.\r
+\r
+  7. You may place library facilities that are a work based on the\r
+Library side-by-side in a single library together with other library\r
+facilities not covered by this License, and distribute such a combined\r
+library, provided that the separate distribution of the work based on\r
+the Library and of the other library facilities is otherwise\r
+permitted, and provided that you do these two things:\r
+\r
+    a) Accompany the combined library with a copy of the same work\r
+    based on the Library, uncombined with any other library\r
+    facilities.  This must be distributed under the terms of the\r
+    Sections above.\r
+\r
+    b) Give prominent notice with the combined library of the fact\r
+    that part of it is a work based on the Library, and explaining\r
+    where to find the accompanying uncombined form of the same work.\r
+\r
+  8. You may not copy, modify, sublicense, link with, or distribute\r
+the Library except as expressly provided under this License.  Any\r
+attempt otherwise to copy, modify, sublicense, link with, or\r
+distribute the Library is void, and will automatically terminate your\r
+rights under this License.  However, parties who have received copies,\r
+or rights, from you under this License will not have their licenses\r
+terminated so long as such parties remain in full compliance.\r
+\r
+  9. You are not required to accept this License, since you have not\r
+signed it.  However, nothing else grants you permission to modify or\r
+distribute the Library or its derivative works.  These actions are\r
+prohibited by law if you do not accept this License.  Therefore, by\r
+modifying or distributing the Library (or any work based on the\r
+Library), you indicate your acceptance of this License to do so, and\r
+all its terms and conditions for copying, distributing or modifying\r
+the Library or works based on it.\r
+\r
+  10. Each time you redistribute the Library (or any work based on the\r
+Library), the recipient automatically receives a license from the\r
+original licensor to copy, distribute, link with or modify the Library\r
+subject to these terms and conditions.  You may not impose any further\r
+restrictions on the recipients' exercise of the rights granted herein.\r
+You are not responsible for enforcing compliance by third parties with\r
+this License.\r
+\r
+  11. If, as a consequence of a court judgment or allegation of patent\r
+infringement or for any other reason (not limited to patent issues),\r
+conditions are imposed on you (whether by court order, agreement or\r
+otherwise) that contradict the conditions of this License, they do not\r
+excuse you from the conditions of this License.  If you cannot\r
+distribute so as to satisfy simultaneously your obligations under this\r
+License and any other pertinent obligations, then as a consequence you\r
+may not distribute the Library at all.  For example, if a patent\r
+license would not permit royalty-free redistribution of the Library by\r
+all those who receive copies directly or indirectly through you, then\r
+the only way you could satisfy both it and this License would be to\r
+refrain entirely from distribution of the Library.\r
+\r
+If any portion of this section is held invalid or unenforceable under any\r
+particular circumstance, the balance of the section is intended to apply,\r
+and the section as a whole is intended to apply in other circumstances.\r
+\r
+It is not the purpose of this section to induce you to infringe any\r
+patents or other property right claims or to contest validity of any\r
+such claims; this section has the sole purpose of protecting the\r
+integrity of the free software distribution system which is\r
+implemented by public license practices.  Many people have made\r
+generous contributions to the wide range of software distributed\r
+through that system in reliance on consistent application of that\r
+system; it is up to the author/donor to decide if he or she is willing\r
+to distribute software through any other system and a licensee cannot\r
+impose that choice.\r
+\r
+This section is intended to make thoroughly clear what is believed to\r
+be a consequence of the rest of this License.\r
+\r
+  12. If the distribution and/or use of the Library is restricted in\r
+certain countries either by patents or by copyrighted interfaces, the\r
+original copyright holder who places the Library under this License may add\r
+an explicit geographical distribution limitation excluding those countries,\r
+so that distribution is permitted only in or among countries not thus\r
+excluded.  In such case, this License incorporates the limitation as if\r
+written in the body of this License.\r
+\r
+  13. The Free Software Foundation may publish revised and/or new\r
+versions of the Lesser General Public License from time to time.\r
+Such new versions will be similar in spirit to the present version,\r
+but may differ in detail to address new problems or concerns.\r
+\r
+Each version is given a distinguishing version number.  If the Library\r
+specifies a version number of this License which applies to it and\r
+"any later version", you have the option of following the terms and\r
+conditions either of that version or of any later version published by\r
+the Free Software Foundation.  If the Library does not specify a\r
+license version number, you may choose any version ever published by\r
+the Free Software Foundation.\r
+\r
+  14. If you wish to incorporate parts of the Library into other free\r
+programs whose distribution conditions are incompatible with these,\r
+write to the author to ask for permission.  For software which is\r
+copyrighted by the Free Software Foundation, write to the Free\r
+Software Foundation; we sometimes make exceptions for this.  Our\r
+decision will be guided by the two goals of preserving the free status\r
+of all derivatives of our free software and of promoting the sharing\r
+and reuse of software generally.\r
+\r
+                           NO WARRANTY\r
+\r
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\r
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\r
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\r
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY\r
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\r
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\r
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\r
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\r
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\r
+\r
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\r
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\r
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\r
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\r
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\r
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\r
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\r
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\r
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\r
+DAMAGES.\r
+\r
+                    END OF TERMS AND CONDITIONS\r
+\r
+           How to Apply These Terms to Your New Libraries\r
+\r
+  If you develop a new library, and you want it to be of the greatest\r
+possible use to the public, we recommend making it free software that\r
+everyone can redistribute and change.  You can do so by permitting\r
+redistribution under these terms (or, alternatively, under the terms of the\r
+ordinary General Public License).\r
+\r
+  To apply these terms, attach the following notices to the library.  It is\r
+safest to attach them to the start of each source file to most effectively\r
+convey the exclusion of warranty; and each file should have at least the\r
+"copyright" line and a pointer to where the full notice is found.\r
+\r
+    <one line to give the library's name and a brief idea of what it does.>\r
+    Copyright (C) <year>  <name of author>\r
+\r
+    This library is free software; you can redistribute it and/or\r
+    modify it under the terms of the GNU Lesser General Public\r
+    License as published by the Free Software Foundation; either\r
+    version 2.1 of the License, or (at your option) any later version.\r
+\r
+    This library is distributed in the hope that it will be useful,\r
+    but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+    Lesser General Public License for more details.\r
+\r
+    You should have received a copy of the GNU Lesser General Public\r
+    License along with this library; if not, write to the Free Software\r
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\r
+\r
+Also add information on how to contact you by electronic and paper mail.\r
+\r
+You should also get your employer (if you work as a programmer) or your\r
+school, if any, to sign a "copyright disclaimer" for the library, if\r
+necessary.  Here is a sample; alter the names:\r
+\r
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the\r
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\r
+\r
+  <signature of Ty Coon>, 1 April 1990\r
+  Ty Coon, President of Vice\r
+\r
+That's all there is to it!\r
+\r
+\r
diff --git a/media/tiny_mce/plugins/advhr/css/advhr.css b/media/tiny_mce/plugins/advhr/css/advhr.css
new file mode 100755 (executable)
index 0000000..7ff36bd
--- /dev/null
@@ -0,0 +1,23 @@
+input.radio {\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+       vertical-align: middle;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 80px;\r
+}\r
+\r
+#width {\r
+       width: 50px;\r
+       vertical-align: middle;\r
+}\r
+\r
+#width2 {\r
+       width: 50px;\r
+       vertical-align: middle;\r
+}\r
+\r
+#size {\r
+       width: 100px;\r
+}\r
diff --git a/media/tiny_mce/plugins/advhr/editor_plugin.js b/media/tiny_mce/plugins/advhr/editor_plugin.js
new file mode 100755 (executable)
index 0000000..ffff3a1
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr',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,'<hr />')}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/media/tiny_mce/plugins/advhr/editor_plugin_src.js b/media/tiny_mce/plugins/advhr/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..1005e05
--- /dev/null
@@ -0,0 +1,90 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('advhr');\r
+\r
+var TinyMCE_AdvancedHRPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Advanced HR',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               }\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "advhr":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_insert_advhr_desc', '{$pluginurl}/images/advhr.gif', 'mceAdvancedHr');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes the mceAdvanceHr command.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceAdvancedHr":\r
+                               var template = new Array();\r
+\r
+                               template['file']   = '../../plugins/advhr/rule.htm'; // Relative to theme\r
+                               template['width']  = 250;\r
+                               template['height'] = 160;\r
+\r
+                               template['width']  += tinyMCE.getLang('lang_advhr_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_advhr_delta_height', 0);\r
+\r
+                               var size = "", width = "", noshade = "";\r
+                               if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "hr") {\r
+                                       tinyMCE.hrElement = tinyMCE.selectedElement;\r
+\r
+                                       if (tinyMCE.hrElement) {\r
+                                               size    = tinyMCE.hrElement.getAttribute('size') ? tinyMCE.hrElement.getAttribute('size') : "";\r
+                                               width   = tinyMCE.hrElement.getAttribute('width') ? tinyMCE.hrElement.getAttribute('width') : "";\r
+                                               noshade = tinyMCE.hrElement.getAttribute('noshade') ? tinyMCE.hrElement.getAttribute('noshade') : "";\r
+                                       }\r
+\r
+                                       tinyMCE.openWindow(template, {editor_id : editor_id, size : size, width : width, noshade : noshade, mceDo : 'update'});\r
+                               } else {\r
+                                       if (tinyMCE.isMSIE) {\r
+                                               tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false,'<hr />');\r
+                                       } else {\r
+                                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", size : size, width : width, noshade : noshade, mceDo : 'insert'});\r
+                                       }\r
+                               }\r
+\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               if (node == null)\r
+                       return;\r
+\r
+               do {\r
+                       if (node.nodeName == "HR") {\r
+                               tinyMCE.switchClass(editor_id + '_advhr', 'mceButtonSelected');\r
+                               return true;\r
+                       }\r
+               } while ((node = node.parentNode));\r
+\r
+               tinyMCE.switchClass(editor_id + '_advhr', 'mceButtonNormal');\r
+\r
+               return true;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("advhr", TinyMCE_AdvancedHRPlugin);\r
diff --git a/media/tiny_mce/plugins/advhr/images/advhr.gif b/media/tiny_mce/plugins/advhr/images/advhr.gif
new file mode 100755 (executable)
index 0000000..e2f8658
Binary files /dev/null and b/media/tiny_mce/plugins/advhr/images/advhr.gif differ
diff --git a/media/tiny_mce/plugins/advhr/jscripts/rule.js b/media/tiny_mce/plugins/advhr/jscripts/rule.js
new file mode 100755 (executable)
index 0000000..ddaacd7
--- /dev/null
@@ -0,0 +1,43 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+       formObj.width.value  = tinyMCE.getWindowArg('width');\r
+       formObj.size.value   = tinyMCE.getWindowArg('size');\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('mceDo'),'Insert',true);\r
+       if (tinyMCE.getWindowArg('noshade')) {\r
+               formObj.noshade.checked = true;\r
+       }\r
+       if (tinyMCE.getWindowArg('width').lastIndexOf('%')!=-1) {\r
+               formObj.width2.value = "%";\r
+               formObj.width.value  = formObj.width.value.substring(0,formObj.width.value.length-1);\r
+       }\r
+}\r
+\r
+function insertHR() {\r
+       var formObj = document.forms[0];\r
+       var width   = formObj.width.value;\r
+       var size    = formObj.size.value;\r
+       var html = '<hr';\r
+       if (size!='' && size!=0) {\r
+               html += ' size="' + size + '"';\r
+       }\r
+       if (width!='' && width!=0) {\r
+               html += ' width="' + width;\r
+               if (formObj.width2.value=='%') {\r
+                       html += '%';\r
+               }\r
+               html += '"';\r
+       }\r
+       if (formObj.noshade.checked==true) {\r
+               html += ' noshade="noshade"';\r
+       }\r
+       html += ' />';\r
+\r
+       tinyMCEPopup.execCommand("mceInsertContent", true, html);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function cancelAction() {\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/media/tiny_mce/plugins/advhr/langs/en.js b/media/tiny_mce/plugins/advhr/langs/en.js
new file mode 100755 (executable)
index 0000000..8194764
--- /dev/null
@@ -0,0 +1,8 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insert_advhr_desc : 'Horizontale rule',\r
+insert_advhr_width : 'Width',\r
+insert_advhr_size : 'Height',\r
+insert_advhr_noshade : 'No shadow'\r
+});\r
diff --git a/media/tiny_mce/plugins/advhr/readme.txt b/media/tiny_mce/plugins/advhr/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/advhr/rule.htm b/media/tiny_mce/plugins/advhr/rule.htm
new file mode 100755 (executable)
index 0000000..6f6034d
--- /dev/null
@@ -0,0 +1,61 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_advhr_desc}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/rule.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <link href="css/advhr.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');">\r
+<form onsubmit="insertHR();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_insert_advhr_desc}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <table border="0" cellpadding="4" cellspacing="0">\r
+                    <tr>\r
+                        <td><label for="width">{$lang_insert_advhr_width}</label></td>\r
+                        <td nowrap="nowrap">\r
+                            <input id="width" name="width" type="text" value="" />\r
+                            <select name="width2" id="width2">\r
+                                <option value="">px</option>\r
+                                <option value="%">%</option>\r
+                            </select>\r
+                        </td>\r
+                    </tr>\r
+                    <tr>\r
+                        <td><label for="size">{$lang_insert_advhr_size}</label></td>\r
+                        <td><select id="size" name="size">\r
+                            <option value="">Normal</option>\r
+                            <option value="1">1</option>\r
+                            <option value="2">2</option>\r
+                            <option value="3">3</option>\r
+                            <option value="4">4</option>\r
+                            <option value="5">5</option>\r
+                        </select></td>\r
+                    </tr>\r
+                    <tr>\r
+                        <td><label for="noshade">{$lang_insert_advhr_noshade}</label></td>\r
+                        <td><input type="checkbox" name="noshade" id="noshade" class="radio" /></td>\r
+                    </tr>\r
+            </table>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertHR();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/advimage/css/advimage.css b/media/tiny_mce/plugins/advimage/css/advimage.css
new file mode 100755 (executable)
index 0000000..abf4405
--- /dev/null
@@ -0,0 +1,66 @@
+/* CSS file for advimage plugin popup */\r
+\r
+.mceImageList {\r
+       width: 280px;\r
+}\r
+\r
+.mceActionPanel {\r
+       margin-top: 7px;\r
+}\r
+\r
+.alignPreview {\r
+       border: 1px solid black;\r
+       width: 140px;\r
+       height: 140px;\r
+       overflow: hidden;\r
+       padding: 5px;\r
+}\r
+\r
+.checkbox {\r
+       border: 0;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 305px;\r
+}\r
+\r
+#prev {\r
+       margin: 0;\r
+       border: 1px\r
+       solid black;\r
+       width: 99%;\r
+       height: 150px;\r
+       overflow: auto;\r
+}\r
+\r
+#align, #classlist {\r
+       width: 150px;\r
+}\r
+\r
+#width, #height {\r
+       vertical-align: middle;\r
+       width: 50px;\r
+       text-align: center;\r
+}\r
+\r
+#vspace, #hspace, #border {\r
+       vertical-align: middle;\r
+       width: 30px;\r
+       text-align: center;\r
+}\r
+\r
+#classlist {\r
+       width: 180px;\r
+}\r
+\r
+input {\r
+       width: 280px;\r
+}\r
+\r
+#constrain, #onmousemovecheck {\r
+       width: auto;\r
+}\r
+\r
+#id, #dir, #lang, #usemap, #longdesc {\r
+       width: 200px;\r
+}\r
diff --git a/media/tiny_mce/plugins/advimage/editor_plugin.js b/media/tiny_mce/plugins/advimage/editor_plugin.js
new file mode 100755 (executable)
index 0000000..79b1452
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage',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<imgs.length;i++){var onmouseover=tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i],'onmouseover'));var onmouseout=tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i],'onmouseout'));if((src=this._getImageSrc(onmouseover))!=""){if(tinyMCE.getParam('convert_urls'))src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],src);imgs[i].setAttribute('onmouseover',"this.src='"+src+"';")}if((src=this._getImageSrc(onmouseout))!=""){if(tinyMCE.getParam('convert_urls'))src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],src);imgs[i].setAttribute('onmouseout',"this.src='"+src+"';")}}break;case"get_from_editor_dom":var imgs=content.getElementsByTagName("img");for(var i=0;i<imgs.length;i++){var onmouseover=tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i],'onmouseover'));var onmouseout=tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i],'onmouseout'));if((src=this._getImageSrc(onmouseover))!=""){if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('onmouseover',"this.src='"+src+"';")}if((src=this._getImageSrc(onmouseout))!=""){if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('onmouseout',"this.src='"+src+"';")}}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('mceItem')==-1){tinyMCE.switchClass(editor_id+'_advimage','mceButtonSelected');return true}}while((node=node.parentNode));tinyMCE.switchClass(editor_id+'_advimage','mceButtonNormal');return true},_getImageSrc:function(s){var sr,p=-1;if(!s)return"";if((p=s.indexOf('this.src='))!=-1){sr=s.substring(p+10);sr=sr.substring(0,sr.indexOf('\''));return sr}return""}};tinyMCE.addPlugin("advimage",TinyMCE_AdvancedImagePlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/advimage/editor_plugin_src.js b/media/tiny_mce/plugins/advimage/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..fbfd654
--- /dev/null
@@ -0,0 +1,148 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('advimage');\r
+\r
+var TinyMCE_AdvancedImagePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Advanced image',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "image":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_image_desc', '{$themeurl}/images/image.gif', 'mceAdvImage');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               switch (command) {\r
+                       case "mceAdvImage":\r
+                               var template = new Array();\r
+\r
+                               template['file']   = '../../plugins/advimage/image.htm';\r
+                               template['width']  = 480;\r
+                               template['height'] = 380;\r
+\r
+                               // Language specific width and height addons\r
+                               template['width']  += tinyMCE.getLang('lang_advimage_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_advimage_delta_height', 0);\r
+\r
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+                               var elm = inst.getFocusElement();\r
+\r
+                               if (elm != null && tinyMCE.getAttrib(elm, 'class').indexOf('mceItem') != -1)\r
+                                       return true;\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       cleanup : function(type, content) {\r
+               switch (type) {\r
+                       case "insert_to_editor_dom":\r
+                               var imgs = content.getElementsByTagName("img"), src, i;\r
+                               for (i=0; i<imgs.length; i++) {\r
+                                       var onmouseover = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i], 'onmouseover'));\r
+                                       var onmouseout = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i], 'onmouseout'));\r
+\r
+                                       if ((src = this._getImageSrc(onmouseover)) != "") {\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);\r
+\r
+                                               imgs[i].setAttribute('onmouseover', "this.src='" + src + "';");\r
+                                       }\r
+\r
+                                       if ((src = this._getImageSrc(onmouseout)) != "") {\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);\r
+\r
+                                               imgs[i].setAttribute('onmouseout', "this.src='" + src + "';");\r
+                                       }\r
+                               }\r
+                               break;\r
+\r
+                       case "get_from_editor_dom":\r
+                               var imgs = content.getElementsByTagName("img");\r
+                               for (var i=0; i<imgs.length; i++) {\r
+                                       var onmouseover = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i], 'onmouseover'));\r
+                                       var onmouseout = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(imgs[i], 'onmouseout'));\r
+\r
+                                       if ((src = this._getImageSrc(onmouseover)) != "") {\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");\r
+\r
+                                               imgs[i].setAttribute('onmouseover', "this.src='" + src + "';");\r
+                                       }\r
+\r
+                                       if ((src = this._getImageSrc(onmouseout)) != "") {\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");\r
+\r
+                                               imgs[i].setAttribute('onmouseout', "this.src='" + src + "';");\r
+                                       }\r
+                               }\r
+                               break;\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               if (node == null)\r
+                       return;\r
+\r
+               do {\r
+                       if (node.nodeName == "IMG" && tinyMCE.getAttrib(node, 'class').indexOf('mceItem') == -1) {\r
+                               tinyMCE.switchClass(editor_id + '_advimage', 'mceButtonSelected');\r
+                               return true;\r
+                       }\r
+               } while ((node = node.parentNode));\r
+\r
+               tinyMCE.switchClass(editor_id + '_advimage', 'mceButtonNormal');\r
+\r
+               return true;\r
+       },\r
+\r
+       /**\r
+        * Returns the image src from a scripted mouse over image str.\r
+        *\r
+        * @param {string} s String to get real src from.\r
+        * @return Image src from a scripted mouse over image str.\r
+        * @type string\r
+        */\r
+       _getImageSrc : function(s) {\r
+               var sr, p = -1;\r
+\r
+               if (!s)\r
+                       return "";\r
+\r
+               if ((p = s.indexOf('this.src=')) != -1) {\r
+                       sr = s.substring(p + 10);\r
+                       sr = sr.substring(0, sr.indexOf('\''));\r
+\r
+                       return sr;\r
+               }\r
+\r
+               return "";\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("advimage", TinyMCE_AdvancedImagePlugin);\r
diff --git a/media/tiny_mce/plugins/advimage/image.htm b/media/tiny_mce/plugins/advimage/image.htm
new file mode 100755 (executable)
index 0000000..d07c65f
--- /dev/null
@@ -0,0 +1,241 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_image_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/functions.js"></script>\r
+       <link href="css/advimage.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="advimage" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form onsubmit="insertAction();return false;" action="#"> \r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_advimage_tab_general}</a></span></li>\r
+                               <li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{$lang_advimage_tab_appearance}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_advimage_tab_advanced}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                               <legend>{$lang_advimage_general}</legend>\r
+\r
+                                               <table class="properties">\r
+                                                       <tr>\r
+                                                               <td class="column1"><label id="srclabel" for="src">{$lang_insert_image_src}</label></td>\r
+                                                               <td colspan="2"><table border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr> \r
+                                                                         <td><input name="src" type="text" id="src" value="" onchange="showPreviewImage(this.value);" /></td> \r
+                                                                         <td id="srcbrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                                 </table></td>\r
+                                                       </tr>\r
+                                                       <tr id="imagelistsrcrow">\r
+                                                               <td class="column1"><label for="imagelistsrc">{$lang_image_list}</label></td>\r
+                                                               <td colspan="2" id="imagelistsrccontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                                       <tr> \r
+                                                               <td class="column1"><label id="altlabel" for="alt">{$lang_insert_image_alt}</label></td> \r
+                                                               <td colspan="2"><input id="alt" name="alt" type="text" value="" /></td> \r
+                                                       </tr> \r
+                                                       <tr> \r
+                                                               <td class="column1"><label id="titlelabel" for="title">{$lang_advimage_title}</label></td> \r
+                                                               <td colspan="2"><input id="title" name="title" type="text" value="" /></td> \r
+                                                       </tr>\r
+                                               </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_advimage_preview}</legend>\r
+                                       <div id="prev"></div>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="appearance_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_advimage_tab_appearance}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr> \r
+                                                       <td class="column1"><label id="alignlabel" for="align">{$lang_insert_image_align}</label></td> \r
+                                                       <td><select id="align" name="align" onchange="changeAppearance();"> \r
+                                                                       <option value="">{$lang_insert_image_align_default}</option> \r
+                                                                       <option value="baseline">{$lang_insert_image_align_baseline}</option> \r
+                                                                       <option value="top">{$lang_insert_image_align_top}</option> \r
+                                                                       <option value="middle">{$lang_insert_image_align_middle}</option> \r
+                                                                       <option value="bottom">{$lang_insert_image_align_bottom}</option> \r
+                                                                       <option value="texttop">{$lang_insert_image_align_texttop}</option> \r
+                                                                       <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option> \r
+                                                                       <option value="absbottom">{$lang_insert_image_align_absbottom}</option> \r
+                                                                       <option value="left">{$lang_insert_image_align_left}</option> \r
+                                                                       <option value="right">{$lang_insert_image_align_right}</option> \r
+                                                               </select> \r
+                                                       </td>\r
+                                                       <td rowspan="6" valign="top">\r
+                                                               <div class="alignPreview">\r
+                                                                       <img id="alignSampleImg" src="images/sample.gif" alt="{$lang_advimage_example_img}" />\r
+                                                                       Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam\r
+                                                                       nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum\r
+                                                                       edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam\r
+                                                                       erat volutpat.\r
+                                                               </div>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="widthlabel" for="width">{$lang_insert_image_dimensions}</label></td>\r
+                                                       <td nowrap="nowrap">\r
+                                                               <input name="width" type="text" id="width" value="" size="5" maxlength="5" class="size" onchange="changeHeight();" /> x \r
+                                                               <input name="height" type="text" id="height" value="" size="5" maxlength="5" class="size" onchange="changeWidth();" /> px\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td>&nbsp;</td>\r
+                                                       <td><table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td>\r
+                                                                               <td><label id="constrainlabel" for="constrain">{$lang_advimage_constrain_proportions}</label></td>\r
+                                                                       </tr>\r
+                                                               </table></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="vspacelabel" for="vspace">{$lang_insert_image_vspace}</label></td> \r
+                                                       <td><input name="vspace" type="text" id="vspace" value="" size="3" maxlength="3" class="number" onchange="changeAppearance();updateStyle();" />\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr> \r
+                                                       <td class="column1"><label id="hspacelabel" for="hspace">{$lang_insert_image_hspace}</label></td> \r
+                                                       <td><input name="hspace" type="text" id="hspace" value="" size="3" maxlength="3" class="number" onchange="changeAppearance();updateStyle();" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="borderlabel" for="border">{$lang_insert_image_border}</label></td> \r
+                                                       <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" class="number" onchange="changeAppearance();updateStyle();" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="classlabel" for="classlist">{$lang_class_name}</label></td>\r
+                                                       <td colspan="2">\r
+                                                                <select id="classlist" name="classlist">\r
+                                                                       <option value="" selected>{$lang_not_set}</option>\r
+                                                                </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="stylelabel" for="style">{$lang_advimage_style}</label></td> \r
+                                                       <td colspan="2"><input id="style" name="style" type="text" value="" onchange="styleUpdated();" /></td> \r
+                                               </tr>\r
+\r
+                                               <!-- <tr>\r
+                                                       <td class="column1"><label id="classeslabel" for="classes">{$lang_advimage_classes}</label></td> \r
+                                                       <td colspan="2"><input id="classes" name="classes" type="text" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td> \r
+                                               </tr> -->\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_advimage_swap_image}</legend>\r
+\r
+                                       <input type="checkbox" id="onmousemovecheck" name="onmousemovecheck" class="checkbox" onclick="changeMouseMove();" />\r
+                                       <label id="onmousemovechecklabel" for="onmousemovecheck">{$lang_advimage_alt_image}</label>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                                       <tr>\r
+                                                               <td class="column1"><label id="onmouseoversrclabel" for="onmouseoversrc">{$lang_advimage_mouseover}</label></td> \r
+                                                               <td><table border="0" cellspacing="0" cellpadding="0"> \r
+                                                                       <tr> \r
+                                                                         <td><input id="onmouseoversrc" name="onmouseoversrc" type="text" value="" /></td> \r
+                                                                         <td id="onmouseoversrccontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                                 </table></td>\r
+                                                       </tr>\r
+                                                       <tr id="imagelistoverrow">\r
+                                                               <td class="column1"><label for="imagelistover">{$lang_image_list}</label></td>\r
+                                                               <td id="imagelistovercontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                                       <tr> \r
+                                                               <td class="column1"><label id="onmouseoutsrclabel" for="onmouseoutsrc">{$lang_advimage_mouseout}</label></td> \r
+                                                               <td class="column2"><table border="0" cellspacing="0" cellpadding="0"> \r
+                                                                       <tr> \r
+                                                                         <td><input id="onmouseoutsrc" name="onmouseoutsrc" type="text" value="" /></td> \r
+                                                                         <td id="onmouseoutsrccontainer">&nbsp;</td>\r
+                                                                       </tr> \r
+                                                                 </table></td> \r
+                                                       </tr>\r
+                                                       <tr id="imagelistoutrow">\r
+                                                               <td class="column1"><label for="imagelistout">{$lang_image_list}</label></td>\r
+                                                               <td id="imagelistoutcontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_advimage_misc}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="idlabel" for="id">{$lang_advimage_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="dirlabel" for="dir">{$lang_advimage_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" onchange="changeAppearance();"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_advimage_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_advimage_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="langlabel" for="lang">{$lang_advimage_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="usemaplabel" for="usemap">{$lang_advimage_image_map}</label></td> \r
+                                                       <td>\r
+                                                               <input id="usemap" name="usemap" type="text" value="" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="longdesclabel" for="longdesc">{$lang_advimage_long_desc}</label></td>\r
+                                                       <td><table border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                         <td><input id="longdesc" name="longdesc" type="text" value="" /></td>\r
+                                                                         <td id="longdesccontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table></td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertAction();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="cancelAction();" />\r
+                       </div>\r
+               </div>\r
+    </form>\r
+</body> \r
+</html> \r
diff --git a/media/tiny_mce/plugins/advimage/images/sample.gif b/media/tiny_mce/plugins/advimage/images/sample.gif
new file mode 100755 (executable)
index 0000000..53bf689
Binary files /dev/null and b/media/tiny_mce/plugins/advimage/images/sample.gif differ
diff --git a/media/tiny_mce/plugins/advimage/jscripts/functions.js b/media/tiny_mce/plugins/advimage/jscripts/functions.js
new file mode 100755 (executable)
index 0000000..fc6b707
--- /dev/null
@@ -0,0 +1,538 @@
+/* Functions for the advimage plugin popup */\r
+\r
+var preloadImg = null;\r
+var orgImageWidth, orgImageHeight;\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+\r
+       // Import external list url javascript\r
+       var url = tinyMCE.getParam("external_image_list_url");\r
+       if (url != null) {\r
+               // Fix relative\r
+               if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+                       url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+               document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+       }\r
+}\r
+\r
+function convertURL(url, node, on_save) {\r
+       return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);");\r
+}\r
+\r
+function getImageSrc(str) {\r
+       var pos = -1;\r
+\r
+       if (!str)\r
+               return "";\r
+\r
+       if ((pos = str.indexOf('this.src=')) != -1) {\r
+               var src = str.substring(pos + 10);\r
+\r
+               src = src.substring(0, src.indexOf('\''));\r
+\r
+               if (tinyMCE.getParam('convert_urls'))\r
+                       src = convertURL(src, null, true);\r
+\r
+               return src;\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\r
+       var action = "insert";\r
+       var html = "";\r
+\r
+       // Image list src\r
+       html = getImageListHTML('imagelistsrc','src','onSelectMainImage');\r
+       if (html == "")\r
+               document.getElementById("imagelistsrcrow").style.display = 'none';\r
+       else\r
+               document.getElementById("imagelistsrccontainer").innerHTML = html;\r
+\r
+       // Image list oversrc\r
+       html = getImageListHTML('imagelistover','onmouseoversrc');\r
+       if (html == "")\r
+               document.getElementById("imagelistoverrow").style.display = 'none';\r
+       else\r
+               document.getElementById("imagelistovercontainer").innerHTML = html;\r
+\r
+       // Image list outsrc\r
+       html = getImageListHTML('imagelistout','onmouseoutsrc');\r
+       if (html == "")\r
+               document.getElementById("imagelistoutrow").style.display = 'none';\r
+       else\r
+               document.getElementById("imagelistoutcontainer").innerHTML = html;\r
+\r
+       // Src browser\r
+       html = getBrowserHTML('srcbrowser','src','image','advimage');\r
+       document.getElementById("srcbrowsercontainer").innerHTML = html;\r
+\r
+       // Over browser\r
+       html = getBrowserHTML('oversrcbrowser','onmouseoversrc','image','advimage');\r
+       document.getElementById("onmouseoversrccontainer").innerHTML = html;\r
+\r
+       // Out browser\r
+       html = getBrowserHTML('outsrcbrowser','onmouseoutsrc','image','advimage');\r
+       document.getElementById("onmouseoutsrccontainer").innerHTML = html;\r
+\r
+       // Longdesc browser\r
+       html = getBrowserHTML('longdescbrowser','longdesc','file','advimage');\r
+       document.getElementById("longdesccontainer").innerHTML = html;\r
+\r
+       // Resize some elements\r
+       if (isVisible('srcbrowser'))\r
+               document.getElementById('src').style.width = '260px';\r
+\r
+       if (isVisible('oversrcbrowser'))\r
+               document.getElementById('onmouseoversrc').style.width = '260px';\r
+\r
+       if (isVisible('outsrcbrowser'))\r
+               document.getElementById('onmouseoutsrc').style.width = '260px';\r
+\r
+       if (isVisible('longdescbrowser'))\r
+               document.getElementById('longdesc').style.width = '180px';\r
+\r
+       // Check action\r
+       if (elm != null && elm.nodeName == "IMG")\r
+               action = "update";\r
+\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); \r
+\r
+       if (action == "update") {\r
+               var src = tinyMCE.getAttrib(elm, 'src');\r
+               var onmouseoversrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover')));\r
+               var onmouseoutsrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout')));\r
+\r
+               src = convertURL(src, elm, true);\r
+\r
+               // Use mce_src if found\r
+               var mceRealSrc = tinyMCE.getAttrib(elm, 'mce_src');\r
+               if (mceRealSrc != "") {\r
+                       src = mceRealSrc;\r
+\r
+                       if (tinyMCE.getParam('convert_urls'))\r
+                               src = convertURL(src, elm, true);\r
+               }\r
+\r
+               if (onmouseoversrc != "" && tinyMCE.getParam('convert_urls'))\r
+                       onmouseoversrc = convertURL(onmouseoversrc, elm, true);\r
+\r
+               if (onmouseoutsrc != "" && tinyMCE.getParam('convert_urls'))\r
+                       onmouseoutsrc = convertURL(onmouseoutsrc, elm, true);\r
+\r
+               // Setup form data\r
+               var style = tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style"));\r
+\r
+               // Store away old size\r
+               orgImageWidth = trimSize(getStyle(elm, 'width'))\r
+               orgImageHeight = trimSize(getStyle(elm, 'height'));\r
+\r
+               formObj.src.value    = src;\r
+               formObj.alt.value    = tinyMCE.getAttrib(elm, 'alt');\r
+               formObj.title.value  = tinyMCE.getAttrib(elm, 'title');\r
+               formObj.border.value = trimSize(getStyle(elm, 'border', 'borderWidth'));\r
+               formObj.vspace.value = tinyMCE.getAttrib(elm, 'vspace');\r
+               formObj.hspace.value = tinyMCE.getAttrib(elm, 'hspace');\r
+               formObj.width.value  = orgImageWidth;\r
+               formObj.height.value = orgImageHeight;\r
+               formObj.onmouseoversrc.value = onmouseoversrc;\r
+               formObj.onmouseoutsrc.value  = onmouseoutsrc;\r
+               formObj.id.value  = tinyMCE.getAttrib(elm, 'id');\r
+               formObj.dir.value  = tinyMCE.getAttrib(elm, 'dir');\r
+               formObj.lang.value  = tinyMCE.getAttrib(elm, 'lang');\r
+               formObj.longdesc.value  = tinyMCE.getAttrib(elm, 'longdesc');\r
+               formObj.usemap.value  = tinyMCE.getAttrib(elm, 'usemap');\r
+               formObj.style.value  = tinyMCE.serializeStyle(style);\r
+\r
+               // Select by the values\r
+               if (tinyMCE.isMSIE)\r
+                       selectByValue(formObj, 'align', getStyle(elm, 'align', 'styleFloat'));\r
+               else\r
+                       selectByValue(formObj, 'align', getStyle(elm, 'align', 'cssFloat'));\r
+\r
+               addClassesToList('classlist', 'advimage_styles');\r
+\r
+               selectByValue(formObj, 'classlist', tinyMCE.getAttrib(elm, 'class'));\r
+               selectByValue(formObj, 'imagelistsrc', src);\r
+               selectByValue(formObj, 'imagelistover', onmouseoversrc);\r
+               selectByValue(formObj, 'imagelistout', onmouseoutsrc);\r
+\r
+               updateStyle();\r
+               showPreviewImage(src, true);\r
+               changeAppearance();\r
+\r
+               window.focus();\r
+       } else\r
+               addClassesToList('classlist', 'advimage_styles');\r
+\r
+       // If option enabled default contrain proportions to checked\r
+       if (tinyMCE.getParam("advimage_constrain_proportions", true))\r
+               formObj.constrain.checked = true;\r
+\r
+       // Check swap image if valid data\r
+       if (formObj.onmouseoversrc.value != "" || formObj.onmouseoutsrc.value != "")\r
+               setSwapImageDisabled(false);\r
+       else\r
+               setSwapImageDisabled(true);\r
+}\r
+\r
+function setSwapImageDisabled(state) {\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.onmousemovecheck.checked = !state;\r
+\r
+       setBrowserDisabled('overbrowser', state);\r
+       setBrowserDisabled('outbrowser', state);\r
+\r
+       if (formObj.imagelistover)\r
+               formObj.imagelistover.disabled = state;\r
+\r
+       if (formObj.imagelistout)\r
+               formObj.imagelistout.disabled = state;\r
+\r
+       formObj.onmouseoversrc.disabled = state;\r
+       formObj.onmouseoutsrc.disabled  = state;\r
+}\r
+\r
+function setAttrib(elm, attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib];\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value != "") {\r
+               elm.setAttribute(attrib, value);\r
+\r
+               if (attrib == "style")\r
+                       attrib = "style.cssText";\r
+\r
+               if (attrib == "longdesc")\r
+                       attrib = "longDesc";\r
+\r
+               if (attrib == "width") {\r
+                       attrib = "style.width";\r
+                       value = value + "px";\r
+                       value = value.replace(/%px/g, 'px');\r
+               }\r
+\r
+               if (attrib == "height") {\r
+                       attrib = "style.height";\r
+                       value = value + "px";\r
+                       value = value.replace(/%px/g, 'px');\r
+               }\r
+\r
+               if (attrib == "class")\r
+                       attrib = "className";\r
+\r
+               eval('elm.' + attrib + "=value;");\r
+       } else {\r
+               if (attrib == 'class')\r
+                       elm.className = '';\r
+\r
+               elm.removeAttribute(attrib);\r
+       }\r
+}\r
+\r
+function makeAttrib(attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib];\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value == "")\r
+               return "";\r
+\r
+       // XML encode it\r
+       value = value.replace(/&/g, '&amp;');\r
+       value = value.replace(/\"/g, '&quot;');\r
+       value = value.replace(/</g, '&lt;');\r
+       value = value.replace(/>/g, '&gt;');\r
+\r
+       return ' ' + attrib + '="' + value + '"';\r
+}\r
+\r
+function insertAction() {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\r
+       var formObj = document.forms[0];\r
+       var src = formObj.src.value;\r
+       var onmouseoversrc = formObj.onmouseoversrc.value;\r
+       var onmouseoutsrc = formObj.onmouseoutsrc.value;\r
+\r
+       if (!AutoValidator.validate(formObj)) {\r
+               alert(tinyMCE.getLang('lang_invalid_data'));\r
+               return false;\r
+       }\r
+\r
+       if (tinyMCE.getParam("accessibility_warnings")) {\r
+               if (formObj.alt.value == "" && !confirm(tinyMCE.getLang('lang_advimage_missing_alt', '', true)))\r
+                       return;\r
+       }\r
+\r
+       if (onmouseoversrc && onmouseoversrc != "")\r
+               onmouseoversrc = "this.src='" + convertURL(onmouseoversrc, tinyMCE.imgElement) + "';";\r
+\r
+       if (onmouseoutsrc && onmouseoutsrc != "")\r
+               onmouseoutsrc = "this.src='" + convertURL(onmouseoutsrc, tinyMCE.imgElement) + "';";\r
+\r
+       if (elm != null && elm.nodeName == "IMG") {\r
+               setAttrib(elm, 'src', convertURL(src, tinyMCE.imgElement));\r
+               setAttrib(elm, 'mce_src', src);\r
+               setAttrib(elm, 'alt');\r
+               setAttrib(elm, 'title');\r
+               setAttrib(elm, 'border');\r
+               setAttrib(elm, 'vspace');\r
+               setAttrib(elm, 'hspace');\r
+               setAttrib(elm, 'width');\r
+               setAttrib(elm, 'height');\r
+               setAttrib(elm, 'onmouseover', onmouseoversrc);\r
+               setAttrib(elm, 'onmouseout', onmouseoutsrc);\r
+               setAttrib(elm, 'id');\r
+               setAttrib(elm, 'dir');\r
+               setAttrib(elm, 'lang');\r
+               setAttrib(elm, 'longdesc');\r
+               setAttrib(elm, 'usemap');\r
+               setAttrib(elm, 'style');\r
+               setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));\r
+               setAttrib(elm, 'align', getSelectValue(formObj, 'align'));\r
+\r
+               //tinyMCEPopup.execCommand("mceRepaint");\r
+\r
+               // Repaint if dimensions changed\r
+               if (formObj.width.value != orgImageWidth || formObj.height.value != orgImageHeight)\r
+                       inst.repaint();\r
+\r
+               // Refresh in old MSIE\r
+               if (tinyMCE.isMSIE5)\r
+                       elm.outerHTML = elm.outerHTML;\r
+       } else {\r
+               var html = "<img";\r
+\r
+               html += makeAttrib('src', convertURL(src, tinyMCE.imgElement));\r
+               html += makeAttrib('mce_src', src);\r
+               html += makeAttrib('alt');\r
+               html += makeAttrib('title');\r
+               html += makeAttrib('border');\r
+               html += makeAttrib('vspace');\r
+               html += makeAttrib('hspace');\r
+               html += makeAttrib('width');\r
+               html += makeAttrib('height');\r
+               html += makeAttrib('onmouseover', onmouseoversrc);\r
+               html += makeAttrib('onmouseout', onmouseoutsrc);\r
+               html += makeAttrib('id');\r
+               html += makeAttrib('dir');\r
+               html += makeAttrib('lang');\r
+               html += makeAttrib('longdesc');\r
+               html += makeAttrib('usemap');\r
+               html += makeAttrib('style');\r
+               html += makeAttrib('class', getSelectValue(formObj, 'classlist'));\r
+               html += makeAttrib('align', getSelectValue(formObj, 'align'));\r
+               html += " />";\r
+\r
+               tinyMCEPopup.execCommand("mceInsertContent", false, html);\r
+       }\r
+\r
+       tinyMCE._setEventsEnabled(inst.getBody(), false);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function cancelAction() {\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function changeAppearance() {\r
+       var formObj = document.forms[0];\r
+       var img = document.getElementById('alignSampleImg');\r
+\r
+       if (img) {\r
+               img.align = formObj.align.value;\r
+               img.border = formObj.border.value;\r
+               img.hspace = formObj.hspace.value;\r
+               img.vspace = formObj.vspace.value;\r
+       }\r
+}\r
+\r
+function changeMouseMove() {\r
+       var formObj = document.forms[0];\r
+\r
+       setSwapImageDisabled(!formObj.onmousemovecheck.checked);\r
+}\r
+\r
+function updateStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (tinyMCE.getParam('inline_styles', false)) {\r
+               st['width'] = formObj.width.value == '' ? '' : formObj.width.value + "px";\r
+               st['height'] = formObj.height.value == '' ? '' : formObj.height.value + "px";\r
+               st['border-width'] = formObj.border.value == '' ? '' : formObj.border.value + "px";\r
+               st['margin-top'] = formObj.vspace.value == '' ? '' : formObj.vspace.value + "px";\r
+               st['margin-bottom'] = formObj.vspace.value == '' ? '' : formObj.vspace.value + "px";\r
+               st['margin-left'] = formObj.hspace.value == '' ? '' : formObj.hspace.value + "px";\r
+               st['margin-right'] = formObj.hspace.value == '' ? '' : formObj.hspace.value + "px";\r
+       } else {\r
+               st['width'] = st['height'] = st['border-width'] = null;\r
+\r
+               if (st['margin-top'] == st['margin-bottom'])\r
+                       st['margin-top'] = st['margin-bottom'] = null;\r
+\r
+               if (st['margin-left'] == st['margin-right'])\r
+                       st['margin-left'] = st['margin-right'] = null;\r
+       }\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function styleUpdated() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['width'])\r
+               formObj.width.value = st['width'].replace('px', '');\r
+\r
+       if (st['height'])\r
+               formObj.height.value = st['height'].replace('px', '');\r
+\r
+       if (st['margin-top'] && st['margin-top'] == st['margin-bottom'])\r
+               formObj.vspace.value = st['margin-top'].replace('px', '');\r
+\r
+       if (st['margin-left'] && st['margin-left'] == st['margin-right'])\r
+               formObj.hspace.value = st['margin-left'].replace('px', '');\r
+\r
+       if (st['border-width'])\r
+               formObj.border.value = st['border-width'].replace('px', '');\r
+}\r
+\r
+function changeHeight() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (!formObj.constrain.checked || !preloadImg) {\r
+               updateStyle();\r
+               return;\r
+       }\r
+\r
+       if (formObj.width.value == "" || formObj.height.value == "")\r
+               return;\r
+\r
+       var temp = (parseInt(formObj.width.value) / parseInt(preloadImg.width)) * preloadImg.height;\r
+       formObj.height.value = temp.toFixed(0);\r
+       updateStyle();\r
+}\r
+\r
+function changeWidth() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (!formObj.constrain.checked || !preloadImg) {\r
+               updateStyle();\r
+               return;\r
+       }\r
+\r
+       if (formObj.width.value == "" || formObj.height.value == "")\r
+               return;\r
+\r
+       var temp = (parseInt(formObj.height.value) / parseInt(preloadImg.height)) * preloadImg.width;\r
+       formObj.width.value = temp.toFixed(0);\r
+       updateStyle();\r
+}\r
+\r
+function onSelectMainImage(target_form_element, name, value) {\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.alt.value = name;\r
+       formObj.title.value = name;\r
+\r
+       resetImageData();\r
+       showPreviewImage(formObj.elements[target_form_element].value, false);\r
+}\r
+\r
+function showPreviewImage(src, start) {\r
+       var formObj = document.forms[0];\r
+\r
+       selectByValue(document.forms[0], 'imagelistsrc', src);\r
+\r
+       var elm = document.getElementById('prev');\r
+       var src = src == "" ? src : tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);\r
+\r
+       if (!start && tinyMCE.getParam("advimage_update_dimensions_onchange", true))\r
+               resetImageData();\r
+\r
+       if (src == "")\r
+               elm.innerHTML = "";\r
+       else\r
+               elm.innerHTML = '<img id="previewImg" src="' + src + '" border="0" onload="updateImageData(' + start + ');" onerror="resetImageData();" />'\r
+}\r
+\r
+function updateImageData(start) {\r
+       var formObj = document.forms[0];\r
+\r
+       preloadImg = document.getElementById('previewImg');\r
+\r
+       if (!start && formObj.width.value == "")\r
+               formObj.width.value = preloadImg.width;\r
+\r
+       if (!start && formObj.height.value == "")\r
+               formObj.height.value = preloadImg.height;\r
+\r
+       updateStyle();\r
+}\r
+\r
+function resetImageData() {\r
+       var formObj = document.forms[0];\r
+       formObj.width.value = formObj.height.value = "";        \r
+}\r
+\r
+function getSelectValue(form_obj, field_name) {\r
+       var elm = form_obj.elements[field_name];\r
+\r
+       if (elm == null || elm.options == null)\r
+               return "";\r
+\r
+       return elm.options[elm.selectedIndex].value;\r
+}\r
+\r
+function getImageListHTML(elm_id, target_form_element, onchange_func) {\r
+       if (typeof(tinyMCEImageList) == "undefined" || tinyMCEImageList.length == 0)\r
+               return "";\r
+\r
+       var html = "";\r
+\r
+       html += '<select id="' + elm_id + '" name="' + elm_id + '"';\r
+       html += ' class="mceImageList" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';\r
+       html += 'this.options[this.selectedIndex].value;';\r
+\r
+       if (typeof(onchange_func) != "undefined")\r
+               html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);';\r
+\r
+       html += '"><option value="">---</option>';\r
+\r
+       for (var i=0; i<tinyMCEImageList.length; i++)\r
+               html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';\r
+\r
+       html += '</select>';\r
+\r
+       return html;\r
+\r
+       // tinyMCE.debug('-- image list start --', html, '-- image list end --');\r
+}\r
+\r
+// While loading\r
+preinit();\r
diff --git a/media/tiny_mce/plugins/advimage/langs/en.js b/media/tiny_mce/plugins/advimage/langs/en.js
new file mode 100755 (executable)
index 0000000..ffd7e30
--- /dev/null
@@ -0,0 +1,27 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('advimage',{\r
+tab_general : 'General',\r
+tab_appearance : 'Appearance',\r
+tab_advanced : 'Advanced',\r
+general : 'General',\r
+title : 'Title',\r
+preview : 'Preview',\r
+constrain_proportions : 'Constrain proportions',\r
+langdir : 'Language direction',\r
+langcode : 'Language code',\r
+long_desc : 'Long description link',\r
+style : 'Style',\r
+classes : 'Classes',\r
+ltr : 'Left to right',\r
+rtl : 'Right to left',\r
+id : 'Id',\r
+image_map : 'Image map',\r
+swap_image : 'Swap image',\r
+alt_image : 'Alternative image',\r
+mouseover : 'for mouse over',\r
+mouseout : 'for mouse out',\r
+misc : 'Miscellaneous',\r
+example_img : 'Appearance&nbsp;preview&nbsp;image',\r
+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.'\r
+});\r
diff --git a/media/tiny_mce/plugins/advimage/readme.txt b/media/tiny_mce/plugins/advimage/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/advlink/css/advlink.css b/media/tiny_mce/plugins/advlink/css/advlink.css
new file mode 100755 (executable)
index 0000000..0cb37bd
--- /dev/null
@@ -0,0 +1,35 @@
+/* CSS file for advimage plugin popup */\r
+\r
+.mceLinkList, .mceAnchorList, #targetlist {\r
+       width: 280px;\r
+}\r
+\r
+.mceActionPanel {\r
+       margin-top: 7px;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 320px;\r
+}\r
+\r
+#classlist, #title, #href {\r
+       width: 280px;\r
+}\r
+\r
+#popupurl, #popupname {\r
+       width: 200px;\r
+}\r
+\r
+#popupwidth, #popupheight, #popupleft, #popuptop {\r
+       width: 30px;\r
+       vertical-align: middle;\r
+       text-align: center;\r
+}\r
+\r
+#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {\r
+       width: 200px;\r
+}\r
+\r
+#events_panel input {\r
+       width: 200px;\r
+}\r
diff --git a/media/tiny_mce/plugins/advlink/editor_plugin.js b/media/tiny_mce/plugins/advlink/editor_plugin.js
new file mode 100755 (executable)
index 0000000..66602fa
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink',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 inst=tinyMCE.getInstanceById(editor_id),anySelection=false;var focusElm=inst.getFocusElement(),selectedText=inst.selection.getSelectedText();if(tinyMCE.selectedElement)anySelection=(tinyMCE.selectedElement.nodeName.toLowerCase()=="img")||(selectedText&&selectedText.length>0);if(anySelection||(focusElm!=null&&focusElm.nodeName=="A")){tinyMCE.openWindow({file:'../../plugins/advlink/link.htm',width:480+tinyMCE.getLang('lang_advlink_delta_width',0),height:400+tinyMCE.getLang('lang_advlink_delta_height',0)},{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/media/tiny_mce/plugins/advlink/editor_plugin_src.js b/media/tiny_mce/plugins/advlink/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..0fed63f
--- /dev/null
@@ -0,0 +1,83 @@
+/**\r
+ * $Id: editor_plugin_src.js 268 2007-04-28 15:52:59Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('advlink');\r
+\r
+var TinyMCE_AdvancedLinkPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Advanced link',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               inst.addShortcut('ctrl', 'k', 'lang_advlink_desc', 'mceAdvLink');\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "link":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_link_desc', '{$themeurl}/images/link.gif', 'mceAdvLink');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               switch (command) {\r
+                       case "mceAdvLink":\r
+                               var inst = tinyMCE.getInstanceById(editor_id), anySelection = false;\r
+                               var focusElm = inst.getFocusElement(), selectedText = inst.selection.getSelectedText();\r
+\r
+                               if (tinyMCE.selectedElement)\r
+                                       anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (selectedText && selectedText.length > 0);\r
+\r
+                               if (anySelection || (focusElm != null && focusElm.nodeName == "A")) {\r
+                                       tinyMCE.openWindow({\r
+                                               file : '../../plugins/advlink/link.htm',\r
+                                               width : 480 + tinyMCE.getLang('lang_advlink_delta_width', 0),\r
+                                               height : 400 + tinyMCE.getLang('lang_advlink_delta_height', 0)\r
+                                       }, {\r
+                                               editor_id : editor_id,\r
+                                               inline : "yes"\r
+                                       });\r
+                               }\r
+\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               if (node == null)\r
+                       return;\r
+\r
+               do {\r
+                       if (node.nodeName == "A" && tinyMCE.getAttrib(node, 'href') != "") {\r
+                               tinyMCE.switchClass(editor_id + '_advlink', 'mceButtonSelected');\r
+                               return true;\r
+                       }\r
+               } while ((node = node.parentNode));\r
+\r
+               if (any_selection) {\r
+                       tinyMCE.switchClass(editor_id + '_advlink', 'mceButtonNormal');\r
+                       return true;\r
+               }\r
+\r
+               tinyMCE.switchClass(editor_id + '_advlink', 'mceButtonDisabled');\r
+\r
+               return true;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("advlink", TinyMCE_AdvancedLinkPlugin);\r
diff --git a/media/tiny_mce/plugins/advlink/jscripts/functions.js b/media/tiny_mce/plugins/advlink/jscripts/functions.js
new file mode 100755 (executable)
index 0000000..9fd4da8
--- /dev/null
@@ -0,0 +1,587 @@
+/* Functions for the advlink plugin popup */\r
+\r
+var templates = {\r
+       "window.open" : "window.open('${url}','${target}','${options}')"\r
+};\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+\r
+       // Import external list url javascript\r
+       var url = tinyMCE.getParam("external_link_list_url");\r
+       if (url != null) {\r
+               // Fix relative\r
+               if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+                       url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+               document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+       }\r
+}\r
+\r
+function changeClass() {\r
+       var formObj = document.forms[0];\r
+       formObj.classes.value = getSelectValue(formObj, 'classlist');\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\r
+       var action = "insert";\r
+       var html;\r
+\r
+       document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink');\r
+       document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink');\r
+       document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href');\r
+       document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href');\r
+       document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target');\r
+\r
+       // Link list\r
+       html = getLinkListHTML('linklisthref','href');\r
+       if (html == "")\r
+               document.getElementById("linklisthrefrow").style.display = 'none';\r
+       else\r
+               document.getElementById("linklisthrefcontainer").innerHTML = html;\r
+\r
+       // Resize some elements\r
+       if (isVisible('hrefbrowser'))\r
+               document.getElementById('href').style.width = '260px';\r
+\r
+       if (isVisible('popupurlbrowser'))\r
+               document.getElementById('popupurl').style.width = '180px';\r
+\r
+       elm = tinyMCE.getParentElement(elm, "a");\r
+       if (elm != null && elm.nodeName == "A")\r
+               action = "update";\r
+\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); \r
+\r
+       setPopupControlsDisabled(true);\r
+\r
+       if (action == "update") {\r
+               var href = tinyMCE.getAttrib(elm, 'href');\r
+\r
+               href = convertURL(href, elm, true);\r
+\r
+               // Use mce_href if found\r
+               var mceRealHref = tinyMCE.getAttrib(elm, 'mce_href');\r
+               if (mceRealHref != "") {\r
+                       href = mceRealHref;\r
+\r
+                       if (tinyMCE.getParam('convert_urls'))\r
+                               href = convertURL(href, elm, true);\r
+               }\r
+\r
+               var onclick = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onclick'));\r
+\r
+               // Setup form data\r
+               setFormValue('href', href);\r
+               setFormValue('title', tinyMCE.getAttrib(elm, 'title'));\r
+               setFormValue('id', tinyMCE.getAttrib(elm, 'id'));\r
+               setFormValue('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style"))));\r
+               setFormValue('rel', tinyMCE.getAttrib(elm, 'rel'));\r
+               setFormValue('rev', tinyMCE.getAttrib(elm, 'rev'));\r
+               setFormValue('charset', tinyMCE.getAttrib(elm, 'charset'));\r
+               setFormValue('hreflang', tinyMCE.getAttrib(elm, 'hreflang'));\r
+               setFormValue('dir', tinyMCE.getAttrib(elm, 'dir'));\r
+               setFormValue('lang', tinyMCE.getAttrib(elm, 'lang'));\r
+               setFormValue('tabindex', tinyMCE.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));\r
+               setFormValue('accesskey', tinyMCE.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));\r
+               setFormValue('type', tinyMCE.getAttrib(elm, 'type'));\r
+               setFormValue('onfocus', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onfocus')));\r
+               setFormValue('onblur', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onblur')));\r
+               setFormValue('onclick', onclick);\r
+               setFormValue('ondblclick', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'ondblclick')));\r
+               setFormValue('onmousedown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousedown')));\r
+               setFormValue('onmouseup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseup')));\r
+               setFormValue('onmouseover', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover')));\r
+               setFormValue('onmousemove', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousemove')));\r
+               setFormValue('onmouseout', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout')));\r
+               setFormValue('onkeypress', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeypress')));\r
+               setFormValue('onkeydown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeydown')));\r
+               setFormValue('onkeyup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeyup')));\r
+               setFormValue('target', tinyMCE.getAttrib(elm, 'target'));\r
+               setFormValue('classes', tinyMCE.getAttrib(elm, 'class'));\r
+\r
+               // Parse onclick data\r
+               if (onclick != null && onclick.indexOf('window.open') != -1)\r
+                       parseWindowOpen(onclick);\r
+               else\r
+                       parseFunction(onclick);\r
+\r
+               // Select by the values\r
+               selectByValue(formObj, 'dir', tinyMCE.getAttrib(elm, 'dir'));\r
+               selectByValue(formObj, 'rel', tinyMCE.getAttrib(elm, 'rel'));\r
+               selectByValue(formObj, 'rev', tinyMCE.getAttrib(elm, 'rev'));\r
+               selectByValue(formObj, 'linklisthref', href);\r
+\r
+               if (href.charAt(0) == '#')\r
+                       selectByValue(formObj, 'anchorlist', href);\r
+\r
+               addClassesToList('classlist', 'advlink_styles');\r
+\r
+               selectByValue(formObj, 'classlist', tinyMCE.getAttrib(elm, 'class'), true);\r
+               selectByValue(formObj, 'targetlist', tinyMCE.getAttrib(elm, 'target'), true);\r
+       } else\r
+               addClassesToList('classlist', 'advlink_styles');\r
+\r
+       window.focus();\r
+}\r
+\r
+function checkPrefix(n) {\r
+       if (Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCE.getLang('lang_is_email')))\r
+               n.value = 'mailto:' + n.value;\r
+\r
+       if (/^\s*www./i.test(n.value) && confirm(tinyMCE.getLang('lang_is_external')))\r
+               n.value = 'http://' + n.value;\r
+}\r
+\r
+function setFormValue(name, value) {\r
+       document.forms[0].elements[name].value = value;\r
+}\r
+\r
+function convertURL(url, node, on_save) {\r
+       return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);");\r
+}\r
+\r
+function parseWindowOpen(onclick) {\r
+       var formObj = document.forms[0];\r
+\r
+       // Preprocess center code\r
+       if (onclick.indexOf('return false;') != -1) {\r
+               formObj.popupreturn.checked = true;\r
+               onclick = onclick.replace('return false;', '');\r
+       } else\r
+               formObj.popupreturn.checked = false;\r
+\r
+       var onClickData = parseLink(onclick);\r
+\r
+       if (onClickData != null) {\r
+               formObj.ispopup.checked = true;\r
+               setPopupControlsDisabled(false);\r
+\r
+               var onClickWindowOptions = parseOptions(onClickData['options']);\r
+               var url = onClickData['url'];\r
+\r
+               if (tinyMCE.getParam('convert_urls'))\r
+                       url = convertURL(url, null, true);\r
+\r
+               formObj.popupname.value = onClickData['target'];\r
+               formObj.popupurl.value = url;\r
+               formObj.popupwidth.value = getOption(onClickWindowOptions, 'width');\r
+               formObj.popupheight.value = getOption(onClickWindowOptions, 'height');\r
+\r
+               formObj.popupleft.value = getOption(onClickWindowOptions, 'left');\r
+               formObj.popuptop.value = getOption(onClickWindowOptions, 'top');\r
+\r
+               if (formObj.popupleft.value.indexOf('screen') != -1)\r
+                       formObj.popupleft.value = "c";\r
+\r
+               if (formObj.popuptop.value.indexOf('screen') != -1)\r
+                       formObj.popuptop.value = "c";\r
+\r
+               formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes";\r
+               formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes";\r
+               formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes";\r
+               formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes";\r
+               formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes";\r
+               formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes";\r
+               formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes";\r
+\r
+               buildOnClick();\r
+       }\r
+}\r
+\r
+function parseFunction(onclick) {\r
+       var formObj = document.forms[0];\r
+       var onClickData = parseLink(onclick);\r
+\r
+       // TODO: Add stuff here\r
+}\r
+\r
+function getOption(opts, name) {\r
+       return typeof(opts[name]) == "undefined" ? "" : opts[name];\r
+}\r
+\r
+function setPopupControlsDisabled(state) {\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.popupname.disabled = state;\r
+       formObj.popupurl.disabled = state;\r
+       formObj.popupwidth.disabled = state;\r
+       formObj.popupheight.disabled = state;\r
+       formObj.popupleft.disabled = state;\r
+       formObj.popuptop.disabled = state;\r
+       formObj.popuplocation.disabled = state;\r
+       formObj.popupscrollbars.disabled = state;\r
+       formObj.popupmenubar.disabled = state;\r
+       formObj.popupresizable.disabled = state;\r
+       formObj.popuptoolbar.disabled = state;\r
+       formObj.popupstatus.disabled = state;\r
+       formObj.popupreturn.disabled = state;\r
+       formObj.popupdependent.disabled = state;\r
+\r
+       setBrowserDisabled('popupurlbrowser', state);\r
+}\r
+\r
+function parseLink(link) {\r
+       link = link.replace(new RegExp('&#39;', 'g'), "'");\r
+\r
+       var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1");\r
+\r
+       // Is function name a template function\r
+       var template = templates[fnName];\r
+       if (template) {\r
+               // Build regexp\r
+               var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi"));\r
+               var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\(";\r
+               var replaceStr = "";\r
+               for (var i=0; i<variableNames.length; i++) {\r
+                       // Is string value\r
+                       if (variableNames[i].indexOf("'${") != -1)\r
+                               regExp += "'(.*)'";\r
+                       else // Number value\r
+                               regExp += "([0-9]*)";\r
+\r
+                       replaceStr += "$" + (i+1);\r
+\r
+                       // Cleanup variable name\r
+                       variableNames[i] = variableNames[i].replace(new RegExp("[^A-Za-z0-9]", "gi"), "");\r
+\r
+                       if (i != variableNames.length-1) {\r
+                               regExp += "\\s*,\\s*";\r
+                               replaceStr += "<delim>";\r
+                       } else\r
+                               regExp += ".*";\r
+               }\r
+\r
+               regExp += "\\);?";\r
+\r
+               // Build variable array\r
+               var variables = new Array();\r
+               variables["_function"] = fnName;\r
+               var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('<delim>');\r
+               for (var i=0; i<variableNames.length; i++)\r
+                       variables[variableNames[i]] = variableValues[i];\r
+\r
+               return variables;\r
+       }\r
+\r
+       return null;\r
+}\r
+\r
+function parseOptions(opts) {\r
+       if (opts == null || opts == "")\r
+               return new Array();\r
+\r
+       // Cleanup the options\r
+       opts = opts.toLowerCase();\r
+       opts = opts.replace(/;/g, ",");\r
+       opts = opts.replace(/[^0-9a-z=,]/g, "");\r
+\r
+       var optionChunks = opts.split(',');\r
+       var options = new Array();\r
+\r
+       for (var i=0; i<optionChunks.length; i++) {\r
+               var parts = optionChunks[i].split('=');\r
+\r
+               if (parts.length == 2)\r
+                       options[parts[0]] = parts[1];\r
+       }\r
+\r
+       return options;\r
+}\r
+\r
+function buildOnClick() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (!formObj.ispopup.checked) {\r
+               formObj.onclick.value = "";\r
+               return;\r
+       }\r
+\r
+       var onclick = "window.open('";\r
+       var url = formObj.popupurl.value;\r
+\r
+       if (tinyMCE.getParam('convert_urls'))\r
+               url = convertURL(url, null, true);\r
+\r
+       onclick += url + "','";\r
+       onclick += formObj.popupname.value + "','";\r
+\r
+       if (formObj.popuplocation.checked)\r
+               onclick += "location=yes,";\r
+\r
+       if (formObj.popupscrollbars.checked)\r
+               onclick += "scrollbars=yes,";\r
+\r
+       if (formObj.popupmenubar.checked)\r
+               onclick += "menubar=yes,";\r
+\r
+       if (formObj.popupresizable.checked)\r
+               onclick += "resizable=yes,";\r
+\r
+       if (formObj.popuptoolbar.checked)\r
+               onclick += "toolbar=yes,";\r
+\r
+       if (formObj.popupstatus.checked)\r
+               onclick += "status=yes,";\r
+\r
+       if (formObj.popupdependent.checked)\r
+               onclick += "dependent=yes,";\r
+\r
+       if (formObj.popupwidth.value != "")\r
+               onclick += "width=" + formObj.popupwidth.value + ",";\r
+\r
+       if (formObj.popupheight.value != "")\r
+               onclick += "height=" + formObj.popupheight.value + ",";\r
+\r
+       if (formObj.popupleft.value != "") {\r
+               if (formObj.popupleft.value != "c")\r
+                       onclick += "left=" + formObj.popupleft.value + ",";\r
+               else\r
+                       onclick += "left='+(screen.availWidth/2-" + (formObj.popupwidth.value/2) + ")+',";\r
+       }\r
+\r
+       if (formObj.popuptop.value != "") {\r
+               if (formObj.popuptop.value != "c")\r
+                       onclick += "top=" + formObj.popuptop.value + ",";\r
+               else\r
+                       onclick += "top='+(screen.availHeight/2-" + (formObj.popupheight.value/2) + ")+',";\r
+       }\r
+\r
+       if (onclick.charAt(onclick.length-1) == ',')\r
+               onclick = onclick.substring(0, onclick.length-1);\r
+\r
+       onclick += "');";\r
+\r
+       if (formObj.popupreturn.checked)\r
+               onclick += "return false;";\r
+\r
+       // tinyMCE.debug(onclick);\r
+\r
+       formObj.onclick.value = onclick;\r
+\r
+       if (formObj.href.value == "")\r
+               formObj.href.value = url;\r
+}\r
+\r
+function setAttrib(elm, attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib.toLowerCase()];\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value != "") {\r
+               elm.setAttribute(attrib.toLowerCase(), value);\r
+\r
+               if (attrib == "style")\r
+                       attrib = "style.cssText";\r
+\r
+               if (attrib.substring(0, 2) == 'on')\r
+                       value = 'return true;' + value;\r
+\r
+               if (attrib == "class")\r
+                       attrib = "className";\r
+\r
+               eval('elm.' + attrib + "=value;");\r
+       } else\r
+               elm.removeAttribute(attrib);\r
+}\r
+\r
+function getAnchorListHTML(id, target) {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var nodes = inst.getBody().getElementsByTagName("a"), name, i;\r
+       var html = "";\r
+\r
+       html += '<select id="' + id + '" name="' + id + '" class="mceAnchorList" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target + '.value=';\r
+       html += 'this.options[this.selectedIndex].value;">';\r
+       html += '<option value="">---</option>';\r
+\r
+       for (i=0; i<nodes.length; i++) {\r
+               if ((name = tinyMCE.getAttrib(nodes[i], "name")) != "")\r
+                       html += '<option value="#' + name + '">' + name + '</option>';\r
+       }\r
+\r
+       html += '</select>';\r
+\r
+       return html;\r
+}\r
+\r
+function insertAction() {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\r
+\r
+       checkPrefix(document.forms[0].href);\r
+\r
+       elm = tinyMCE.getParentElement(elm, "a");\r
+\r
+       tinyMCEPopup.execCommand("mceBeginUndoLevel");\r
+\r
+       // Create new anchor elements\r
+       if (elm == null) {\r
+               if (tinyMCE.isSafari)\r
+                       tinyMCEPopup.execCommand("mceInsertContent", false, '<a href="#mce_temp_url#">' + inst.selection.getSelectedHTML() + '</a>');\r
+               else\r
+                       tinyMCEPopup.execCommand("createlink", false, "#mce_temp_url#");\r
+\r
+               var elementArray = tinyMCE.getElementsByAttributeValue(inst.getBody(), "a", "href", "#mce_temp_url#");\r
+               for (var i=0; i<elementArray.length; i++) {\r
+                       var elm = elementArray[i];\r
+\r
+                       // Move cursor to end\r
+                       try {\r
+                               tinyMCE.selectedInstance.selection.collapse(false);\r
+                       } catch (ex) {\r
+                               // Ignore\r
+                       }\r
+\r
+                       // Move cursor behind the new anchor\r
+                       // Don't remember why this was needed so it's now removed\r
+                       /*\r
+                       if (tinyMCE.isGecko) {\r
+                               var sp = inst.getDoc().createTextNode(" ");\r
+\r
+                               if (elm.nextSibling)\r
+                                       elm.parentNode.insertBefore(sp, elm.nextSibling);\r
+                               else\r
+                                       elm.parentNode.appendChild(sp);\r
+\r
+                               // Set range after link\r
+                               var rng = inst.getDoc().createRange();\r
+                               rng.setStartAfter(elm);\r
+                               rng.setEndAfter(elm);\r
+\r
+                               // Update selection\r
+                               var sel = inst.getSel();\r
+                               sel.removeAllRanges();\r
+                               sel.addRange(rng);\r
+                       }\r
+                       */\r
+\r
+                       setAllAttribs(elm);\r
+               }\r
+       } else\r
+               setAllAttribs(elm);\r
+\r
+       tinyMCE._setEventsEnabled(inst.getBody(), false);\r
+       tinyMCEPopup.execCommand("mceEndUndoLevel");\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function setAllAttribs(elm) {\r
+       var formObj = document.forms[0];\r
+       var href = formObj.href.value;\r
+       var target = getSelectValue(formObj, 'targetlist');\r
+\r
+       // Make anchors absolute\r
+       if (href.charAt(0) != '#')\r
+               href = convertURL(href, elm);\r
+\r
+       setAttrib(elm, 'href', href);\r
+       setAttrib(elm, 'mce_href', href);\r
+       setAttrib(elm, 'title');\r
+       setAttrib(elm, 'target', target == '_self' ? '' : target);\r
+       setAttrib(elm, 'id');\r
+       setAttrib(elm, 'style');\r
+       setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));\r
+       setAttrib(elm, 'rel');\r
+       setAttrib(elm, 'rev');\r
+       setAttrib(elm, 'charset');\r
+       setAttrib(elm, 'hreflang');\r
+       setAttrib(elm, 'dir');\r
+       setAttrib(elm, 'lang');\r
+       setAttrib(elm, 'tabindex');\r
+       setAttrib(elm, 'accesskey');\r
+       setAttrib(elm, 'type');\r
+       setAttrib(elm, 'onfocus');\r
+       setAttrib(elm, 'onblur');\r
+       setAttrib(elm, 'onclick');\r
+       setAttrib(elm, 'ondblclick');\r
+       setAttrib(elm, 'onmousedown');\r
+       setAttrib(elm, 'onmouseup');\r
+       setAttrib(elm, 'onmouseover');\r
+       setAttrib(elm, 'onmousemove');\r
+       setAttrib(elm, 'onmouseout');\r
+       setAttrib(elm, 'onkeypress');\r
+       setAttrib(elm, 'onkeydown');\r
+       setAttrib(elm, 'onkeyup');\r
+\r
+       // Refresh in old MSIE\r
+       if (tinyMCE.isMSIE5)\r
+               elm.outerHTML = elm.outerHTML;\r
+}\r
+\r
+function getSelectValue(form_obj, field_name) {\r
+       var elm = form_obj.elements[field_name];\r
+\r
+       if (elm == null || elm.options == null)\r
+               return "";\r
+\r
+       return elm.options[elm.selectedIndex].value;\r
+}\r
+\r
+function getLinkListHTML(elm_id, target_form_element, onchange_func) {\r
+       if (typeof(tinyMCELinkList) == "undefined" || tinyMCELinkList.length == 0)\r
+               return "";\r
+\r
+       var html = "";\r
+\r
+       html += '<select id="' + elm_id + '" name="' + elm_id + '"';\r
+       html += ' class="mceLinkList" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';\r
+       html += 'this.options[this.selectedIndex].value;';\r
+\r
+       if (typeof(onchange_func) != "undefined")\r
+               html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);';\r
+\r
+       html += '"><option value="">---</option>';\r
+\r
+       for (var i=0; i<tinyMCELinkList.length; i++)\r
+               html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';\r
+\r
+       html += '</select>';\r
+\r
+       return html;\r
+\r
+       // tinyMCE.debug('-- image list start --', html, '-- image list end --');\r
+}\r
+\r
+function getTargetListHTML(elm_id, target_form_element) {\r
+       var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';');\r
+       var html = '';\r
+\r
+       html += '<select id="' + elm_id + '" name="' + elm_id + '" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';\r
+       html += 'this.options[this.selectedIndex].value;">';\r
+\r
+       html += '<option value="_self">' + tinyMCE.getLang('lang_advlink_target_same') + '</option>';\r
+       html += '<option value="_blank">' + tinyMCE.getLang('lang_advlink_target_blank') + ' (_blank)</option>';\r
+       html += '<option value="_parent">' + tinyMCE.getLang('lang_advlink_target_parent') + ' (_parent)</option>';\r
+       html += '<option value="_top">' + tinyMCE.getLang('lang_advlink_target_top') + ' (_top)</option>';\r
+\r
+       for (var i=0; i<targets.length; i++) {\r
+               var key, value;\r
+\r
+               if (targets[i] == "")\r
+                       continue;\r
+\r
+               key = targets[i].split('=')[0];\r
+               value = targets[i].split('=')[1];\r
+\r
+               html += '<option value="' + key + '">' + value + ' (' + key + ')</option>';\r
+       }\r
+\r
+       html += '</select>';\r
+\r
+       return html;\r
+}\r
+\r
+// While loading\r
+preinit();\r
diff --git a/media/tiny_mce/plugins/advlink/langs/en.js b/media/tiny_mce/plugins/advlink/langs/en.js
new file mode 100755 (executable)
index 0000000..1d50e4e
--- /dev/null
@@ -0,0 +1,46 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('advlink',{\r
+general_tab : 'General',\r
+popup_tab : 'Popup',\r
+events_tab : 'Events',\r
+advanced_tab : 'Advanced',\r
+general_props : 'General properties',\r
+popup_props : 'Popup properties',\r
+event_props : 'Events',\r
+advanced_props : 'Advanced properties',\r
+popup_opts : 'Options',\r
+anchor_names : 'Anchors',\r
+target_same : 'Open in this window / frame',\r
+target_parent : 'Open in parent window / frame',\r
+target_top : 'Open in top frame (replaces all frames)',\r
+target_blank : 'Open in new window',\r
+popup : 'Javascript popup',\r
+popup_url : 'Popup URL',\r
+popup_name : 'Window name',\r
+popup_return : 'Insert \'return false\'',\r
+popup_scrollbars : 'Show scrollbars',\r
+popup_statusbar : 'Show status bar',\r
+popup_toolbar : 'Show toolbars',\r
+popup_menubar : 'Show menu bar',\r
+popup_location : 'Show location bar',\r
+popup_resizable : 'Make window resizable',\r
+popup_dependent : 'Dependent (Mozilla/Firefox only)',\r
+popup_size : 'Size',\r
+popup_position : 'Position (X/Y)',\r
+id : 'Id',\r
+style: 'Style',\r
+classes : 'Classes',\r
+target_name : 'Target name',\r
+langdir : 'Language direction',\r
+target_langcode : 'Target language',\r
+langcode : 'Language code',\r
+encoding : 'Target character encoding',\r
+mime : 'Target MIME type',\r
+rel : 'Relationship page to target',\r
+rev : 'Relationship target to page',\r
+tabindex : 'Tabindex',\r
+accesskey : 'Accesskey',\r
+ltr : 'Left to right',\r
+rtl : 'Right to left'\r
+});
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/advlink/link.htm b/media/tiny_mce/plugins/advlink/link.htm
new file mode 100755 (executable)
index 0000000..95d89a1
--- /dev/null
@@ -0,0 +1,338 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_link_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/functions.js"></script>\r
+       <link href="css/advlink.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="advlink" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form onsubmit="insertAction();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_advlink_general_tab}</a></span></li>\r
+                               <li id="popup_tab"><span><a href="javascript:mcTabs.displayTab('popup_tab','popup_panel');" onmousedown="return false;">{$lang_advlink_popup_tab}</a></span></li>\r
+                               <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{$lang_advlink_events_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_advlink_advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_advlink_general_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                 <td nowrap="nowrap"><label id="hreflabel" for="href">{$lang_insert_link_url}</label></td>\r
+                                                 <td><table border="0" cellspacing="0" cellpadding="0">\r
+                                                               <tr>\r
+                                                                 <td><input id="href" name="href" type="text" value="" onchange="selectByValue(this.form,'linklisthref',this.value);" /></td>\r
+                                                                 <td id="hrefbrowsercontainer">&nbsp;</td>\r
+                                                               </tr>\r
+                                                         </table></td>\r
+                                               </tr>\r
+                                               <tr id="linklisthrefrow">\r
+                                                       <td class="column1"><label for="linklisthref">{$lang_link_list}</label></td>\r
+                                                       <td colspan="2" id="linklisthrefcontainer">&nbsp;</td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="anchorlist">{$lang_advlink_anchor_names}</label></td>\r
+                                                       <td colspan="2" id="anchorlistcontainer">&nbsp;</td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td><label id="targetlistlabel" for="targetlist">{$lang_insert_link_target}</label></td>\r
+                                                       <td id="targetlistcontainer">&nbsp;</td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label id="titlelabel" for="title">{$lang_theme_insert_link_titlefield}</label></td>\r
+                                                       <td><input id="title" name="title" type="text" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td><label id="classlabel" for="classlist">{$lang_class_name}</label></td>\r
+                                                       <td>\r
+                                                                <select id="classlist" name="classlist" onchange="changeClass();">\r
+                                                                       <option value="" selected>{$lang_not_set}</option>\r
+                                                                </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="popup_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_advlink_popup_props}</legend>\r
+\r
+                                       <input type="checkbox" id="ispopup" name="ispopup" class="radio" onclick="setPopupControlsDisabled(!this.checked);buildOnClick();" />\r
+                                       <label id="ispopuplabel" for="ispopup">{$lang_advlink_popup}</label>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="popupurl">{$lang_advlink_popup_url}</label>&nbsp;</td>\r
+                                                       <td>\r
+                                                               <table border="0" cellspacing="0" cellpadding="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" name="popupurl" id="popupurl" value="" onchange="buildOnClick();" /></td>\r
+                                                                               <td id="popupurlbrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="popupname">{$lang_advlink_popup_name}</label>&nbsp;</td>\r
+                                                       <td><input type="text" name="popupname" id="popupname" value="" onchange="buildOnClick();" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label>{$lang_advlink_popup_size}</label>&nbsp;</td>\r
+                                                       <td nowrap="nowrap">\r
+                                                               <input type="text" id="popupwidth" name="popupwidth" value="" onchange="buildOnClick();" /> x\r
+                                                               <input type="text" id="popupheight" name="popupheight" value="" onchange="buildOnClick();" /> px\r
+                                                       </td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap" id="labelleft"><label>{$lang_advlink_popup_position}</label>&nbsp;</td>\r
+                                                       <td nowrap="nowrap">\r
+                                                               <input type="text" id="popupleft" name="popupleft" value="" onchange="buildOnClick();" /> /                                \r
+                                                               <input type="text" id="popuptop" name="popuptop" value="" onchange="buildOnClick();" /> (c /c = center)\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <fieldset>\r
+                                               <legend>{$lang_advlink_popup_opts}</legend>\r
+\r
+                                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popuplocation" name="popuplocation" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popuplocationlabel" for="popuplocation">{$lang_advlink_popup_location}</label></td>\r
+                                                               <td><input type="checkbox" id="popupscrollbars" name="popupscrollbars" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupscrollbarslabel" for="popupscrollbars">{$lang_advlink_popup_scrollbars}</label></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popupmenubar" name="popupmenubar" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupmenubarlabel" for="popupmenubar">{$lang_advlink_popup_menubar}</label></td>\r
+                                                               <td><input type="checkbox" id="popupresizable" name="popupresizable" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupresizablelabel" for="popupresizable">{$lang_advlink_popup_resizable}</label></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popuptoolbar" name="popuptoolbar" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popuptoolbarlabel" for="popuptoolbar">{$lang_advlink_popup_toolbar}</label></td>\r
+                                                               <td><input type="checkbox" id="popupdependent" name="popupdependent" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupdependentlabel" for="popupdependent">{$lang_advlink_popup_dependent}</label></td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><input type="checkbox" id="popupstatus" name="popupstatus" class="checkbox" onchange="buildOnClick();" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupstatuslabel" for="popupstatus">{$lang_advlink_popup_statusbar}</label></td>\r
+                                                               <td><input type="checkbox" id="popupreturn" name="popupreturn" class="checkbox" onchange="buildOnClick();" checked="checked" /></td>\r
+                                                               <td nowrap="nowrap"><label id="popupreturnlabel" for="popupreturn">{$lang_advlink_popup_return}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </fieldset>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                       <fieldset>\r
+                                       <legend>{$lang_advlink_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="idlabel" for="id">{$lang_advlink_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="stylelabel" for="style">{$lang_advlink_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="classeslabel" for="classes">{$lang_advlink_classes}</label></td>\r
+                                                       <td><input type="text" id="classes" name="classes" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="targetlabel" for="target">{$lang_advlink_target_name}</label></td>\r
+                                                       <td><input type="text" id="target" name="target" value="" onchange="selectByValue(this.form,'targetlist',this.value,true);" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="dirlabel" for="dir">{$lang_advlink_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_advlink_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_advlink_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="hreflanglabel" for="hreflang">{$lang_advlink_target_langcode}</label></td>\r
+                                                       <td><input type="text" id="hreflang" name="hreflang" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="langlabel" for="lang">{$lang_advlink_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="charsetlabel" for="charset">{$lang_advlink_encoding}</label></td>\r
+                                                       <td><input type="text" id="charset" name="charset" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="typelabel" for="type">{$lang_advlink_mime}</label></td>\r
+                                                       <td><input type="text" id="type" name="type" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="rellabel" for="rel">{$lang_advlink_rel}</label></td>\r
+                                                       <td><select id="rel" name="rel"> \r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="lightbox">Lightbox</option> \r
+                                                                       <option value="alternate">Alternate</option> \r
+                                                                       <option value="designates">Designates</option> \r
+                                                                       <option value="stylesheet">Stylesheet</option> \r
+                                                                       <option value="start">Start</option> \r
+                                                                       <option value="next">Next</option> \r
+                                                                       <option value="prev">Prev</option> \r
+                                                                       <option value="contents">Contents</option> \r
+                                                                       <option value="index">Index</option> \r
+                                                                       <option value="glossary">Glossary</option> \r
+                                                                       <option value="copyright">Copyright</option> \r
+                                                                       <option value="chapter">Chapter</option> \r
+                                                                       <option value="subsection">Subsection</option> \r
+                                                                       <option value="appendix">Appendix</option> \r
+                                                                       <option value="help">Help</option> \r
+                                                                       <option value="bookmark">Bookmark</option>\r
+                                                                       <option value="nofollow">No Follow</option>\r
+                                                                       <option value="tag">Tag</option>\r
+                                                               </select> \r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="revlabel" for="rev">{$lang_advlink_rev}</label></td>\r
+                                                       <td><select id="rev" name="rev"> \r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="alternate">Alternate</option> \r
+                                                                       <option value="designates">Designates</option> \r
+                                                                       <option value="stylesheet">Stylesheet</option> \r
+                                                                       <option value="start">Start</option> \r
+                                                                       <option value="next">Next</option> \r
+                                                                       <option value="prev">Prev</option> \r
+                                                                       <option value="contents">Contents</option> \r
+                                                                       <option value="index">Index</option> \r
+                                                                       <option value="glossary">Glossary</option> \r
+                                                                       <option value="copyright">Copyright</option> \r
+                                                                       <option value="chapter">Chapter</option> \r
+                                                                       <option value="subsection">Subsection</option> \r
+                                                                       <option value="appendix">Appendix</option> \r
+                                                                       <option value="help">Help</option> \r
+                                                                       <option value="bookmark">Bookmark</option> \r
+                                                               </select> \r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="tabindexlabel" for="tabindex">{$lang_advlink_tabindex}</label></td>\r
+                                                       <td><input type="text" id="tabindex" name="tabindex" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="accesskeylabel" for="accesskey">{$lang_advlink_accesskey}</label></td>\r
+                                                       <td><input type="text" id="accesskey" name="accesskey" value="" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                                       <legend>{$lang_advlink_event_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onfocus">onfocus</label></td> \r
+                                                       <td><input id="onfocus" name="onfocus" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onblur">onblur</label></td> \r
+                                                       <td><input id="onblur" name="onblur" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onclick">onclick</label></td> \r
+                                                       <td><input id="onclick" name="onclick" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="ondblclick">ondblclick</label></td> \r
+                                                       <td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onmousedown">onmousedown</label></td> \r
+                                                       <td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onmouseup">onmouseup</label></td> \r
+                                                       <td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onmouseover">onmouseover</label></td> \r
+                                                       <td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onmousemove">onmousemove</label></td> \r
+                                                       <td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onmouseout">onmouseout</label></td> \r
+                                                       <td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onkeypress">onkeypress</label></td> \r
+                                                       <td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onkeydown">onkeydown</label></td> \r
+                                                       <td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="onkeyup">onkeyup</label></td> \r
+                                                       <td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertAction();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+    </form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/advlink/readme.txt b/media/tiny_mce/plugins/advlink/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/autosave/editor_plugin.js b/media/tiny_mce/plugins/autosave/editor_plugin.js
new file mode 100755 (executable)
index 0000000..e347646
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave',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/media/tiny_mce/plugins/autosave/editor_plugin_src.js b/media/tiny_mce/plugins/autosave/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..f76aeeb
--- /dev/null
@@ -0,0 +1,46 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('autosave');\r
+\r
+var TinyMCE_AutoSavePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Auto save',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       // Private plugin internal methods\r
+\r
+       _beforeUnloadHandler : function() {\r
+               var n, inst, anyDirty = false, msg = tinyMCE.getLang("lang_autosave_unload_msg");\r
+\r
+               if (tinyMCE.getParam("fullscreen_is_enabled"))\r
+                       return;\r
+\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       if (inst.isDirty())\r
+                               return msg;\r
+               }\r
+\r
+               return;\r
+       }\r
+};\r
+\r
+window.onbeforeunload = TinyMCE_AutoSavePlugin._beforeUnloadHandler;\r
+\r
+tinyMCE.addPlugin("autosave", TinyMCE_AutoSavePlugin);\r
diff --git a/media/tiny_mce/plugins/autosave/langs/en.js b/media/tiny_mce/plugins/autosave/langs/en.js
new file mode 100755 (executable)
index 0000000..0195133
--- /dev/null
@@ -0,0 +1,5 @@
+// EN lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+autosave_unload_msg : 'The changes you made will be lost if you navigate away from this page.'\r
+});\r
diff --git a/media/tiny_mce/plugins/autosave/readme.txt b/media/tiny_mce/plugins/autosave/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/bbcode/editor_plugin.js b/media/tiny_mce/plugins/bbcode/editor_plugin.js
new file mode 100755 (executable)
index 0000000..805aaf4
--- /dev/null
@@ -0,0 +1 @@
+var TinyMCE_BBCodePlugin={getInfo:function(){return{longname:'BBCode Plugin',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},cleanup:function(type,content){var dialect=tinyMCE.getParam('bbcode_dialect','punbb').toLowerCase();switch(type){case"insert_to_editor":content=this['_'+dialect+'_bbcode2html'](content);break;case"get_from_editor":content=this['_'+dialect+'_html2bbcode'](content);break}return content},_punbb_html2bbcode:function(s){s=tinyMCE.trim(s);function rep(re,str){s=s.replace(re,str)};rep(/<a href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url]$1[/url]");rep(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");rep(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");rep(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");rep(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");rep(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");rep(/<font>(.*?)<\/font>/gi,"$1");rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");rep(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");rep(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");rep(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");rep(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");rep(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");rep(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");rep(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");rep(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");rep(/<\/(strong|b)>/gi,"[/b]");rep(/<(strong|b)>/gi,"[b]");rep(/<\/(em|i)>/gi,"[/i]");rep(/<(em|i)>/gi,"[i]");rep(/<\/u>/gi,"[/u]");rep(/<u>/gi,"[u]");rep(/<br \/>/gi,"\n");rep(/<br\/>/gi,"\n");rep(/<br>/gi,"\n");rep(/<p>/gi,"");rep(/<\/p>/gi,"\n");rep(/&nbsp;/gi," ");rep(/&quot;/gi,"\"");rep(/&lt;/gi,"<");rep(/&gt;/gi,">");rep(/&amp;/gi,"&");rep(/&undefined;/gi,"'");return s},_punbb_bbcode2html:function(s){s=tinyMCE.trim(s);function rep(re,str){s=s.replace(re,str)};rep(/\n/gi,"<br />");rep(/\[b\]/gi,"<strong>");rep(/\[\/b\]/gi,"</strong>");rep(/\[i\]/gi,"<em>");rep(/\[\/i\]/gi,"</em>");rep(/\[u\]/gi,"<u>");rep(/\[\/u\]/gi,"</u>");rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<font color=\"$1\">$2</font>");rep(/\[code\](.*?)\[\/code\]/gi,"<span class=\"codeStyle\">$1</span>&nbsp;");rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<span class=\"quoteStyle\">$1</span>&nbsp;");return s}};tinyMCE.addPlugin("bbcode",TinyMCE_BBCodePlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/bbcode/editor_plugin_src.js b/media/tiny_mce/plugins/bbcode/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..1d38317
--- /dev/null
@@ -0,0 +1,102 @@
+var TinyMCE_BBCodePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'BBCode Plugin',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       cleanup : function(type, content) {\r
+               var dialect = tinyMCE.getParam('bbcode_dialect', 'punbb').toLowerCase();\r
+\r
+               switch (type) {\r
+                       case "insert_to_editor":\r
+                               content = this['_' + dialect + '_bbcode2html'](content);\r
+                               break;\r
+\r
+                       case "get_from_editor":\r
+                               content = this['_' + dialect + '_html2bbcode'](content);\r
+                               break;\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       // Private methods\r
+\r
+       // HTML -> BBCode in PunBB dialect\r
+       _punbb_html2bbcode : function(s) {\r
+               s = tinyMCE.trim(s);\r
+\r
+               function rep(re, str) {\r
+                       s = s.replace(re, str);\r
+               };\r
+\r
+               // example: <strong> to [b]\r
+               rep(/<a href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url]$1[/url]");\r
+               rep(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");\r
+               rep(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");\r
+               rep(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");\r
+               rep(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");\r
+               rep(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");\r
+               rep(/<font>(.*?)<\/font>/gi,"$1");\r
+               rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");\r
+               rep(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");\r
+               rep(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");\r
+               rep(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");\r
+               rep(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");\r
+               rep(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");\r
+               rep(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");\r
+               rep(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");\r
+               rep(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");\r
+               rep(/<\/(strong|b)>/gi,"[/b]");\r
+               rep(/<(strong|b)>/gi,"[b]");\r
+               rep(/<\/(em|i)>/gi,"[/i]");\r
+               rep(/<(em|i)>/gi,"[i]");\r
+               rep(/<\/u>/gi,"[/u]");\r
+               rep(/<u>/gi,"[u]");\r
+               rep(/<br \/>/gi,"\n");\r
+               rep(/<br\/>/gi,"\n");\r
+               rep(/<br>/gi,"\n");\r
+               rep(/<p>/gi,"");\r
+               rep(/<\/p>/gi,"\n");\r
+               rep(/&nbsp;/gi," ");\r
+               rep(/&quot;/gi,"\"");\r
+               rep(/&lt;/gi,"<");\r
+               rep(/&gt;/gi,">");\r
+               rep(/&amp;/gi,"&");\r
+               rep(/&undefined;/gi,"'"); // quickfix\r
+\r
+               return s; \r
+       },\r
+\r
+       // BBCode -> HTML from PunBB dialect\r
+       _punbb_bbcode2html : function(s) {\r
+               s = tinyMCE.trim(s);\r
+\r
+               function rep(re, str) {\r
+                       s = s.replace(re, str);\r
+               };\r
+\r
+               // example: [b] to <strong>\r
+               rep(/\n/gi,"<br />");\r
+               rep(/\[b\]/gi,"<strong>");\r
+               rep(/\[\/b\]/gi,"</strong>");\r
+               rep(/\[i\]/gi,"<em>");\r
+               rep(/\[\/i\]/gi,"</em>");\r
+               rep(/\[u\]/gi,"<u>");\r
+               rep(/\[\/u\]/gi,"</u>");\r
+               rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");\r
+               rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");\r
+               rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<font color=\"$1\">$2</font>");\r
+               rep(/\[code\](.*?)\[\/code\]/gi,"<span class=\"codeStyle\">$1</span>&nbsp;");\r
+               rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<span class=\"quoteStyle\">$1</span>&nbsp;");\r
+\r
+               return s; \r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("bbcode", TinyMCE_BBCodePlugin);\r
diff --git a/media/tiny_mce/plugins/cleanup/editor_plugin.js b/media/tiny_mce/plugins/cleanup/editor_plugin.js
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/media/tiny_mce/plugins/cleanup/editor_plugin_src.js b/media/tiny_mce/plugins/cleanup/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..8e1312f
--- /dev/null
@@ -0,0 +1,10 @@
+/**\r
+ * $Id: editor_plugin_src.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Experimental plugin for new Cleanup routine, this logic will be moved into the core ones it's stable enougth.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Dummy file since cleanup is now moved to core */\r
diff --git a/media/tiny_mce/plugins/cleanup/readme.txt b/media/tiny_mce/plugins/cleanup/readme.txt
new file mode 100755 (executable)
index 0000000..d1a6466
--- /dev/null
@@ -0,0 +1 @@
+Dummy plugin since cleanup is now moved into core.\r
diff --git a/media/tiny_mce/plugins/contextmenu/css/contextmenu.css b/media/tiny_mce/plugins/contextmenu/css/contextmenu.css
new file mode 100755 (executable)
index 0000000..fb37214
--- /dev/null
@@ -0,0 +1,74 @@
+.contextMenuIEPopup {\r
+       padding: 0;\r
+       margin: 0;\r
+       border: 0;\r
+       overflow: hidden;\r
+}\r
+\r
+.contextMenu {\r
+       position: absolute;\r
+       cursor: default;\r
+       z-index: 1000;\r
+       border: 1px solid #D4D0C8;\r
+       background-color: #FFFFFF;\r
+}\r
+\r
+.contextMenuItem, .contextMenuItemOver {\r
+}\r
+\r
+.contextMenuSeparator {\r
+       width: 100%;\r
+       background-color: #D4D0C8;\r
+       border: 0;\r
+}\r
+\r
+.contextMenuImage, .contextMenuItemDisabled {\r
+       border: 0;\r
+}\r
+\r
+.contextMenuIcon {\r
+       background-color: #F0F0EE;\r
+}\r
+\r
+.contextMenuItemOver .contextMenuIcon {\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.contextMenuIcon {\r
+       background-color: #F0F0EE;\r
+}\r
+\r
+.contextMenuItemDisabled img {\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
+       -moz-opacity:0.3;\r
+       opacity: 0.3;\r
+}\r
+\r
+.contextMenuText {\r
+       font-family: Tahoma, Verdana, Arial, Helvetica;\r
+       font-size: 11px;\r
+       line-height: 20px;\r
+}\r
+\r
+.contextMenuItemDisabled {\r
+       color: #AAAAAA;\r
+}\r
+\r
+.contextMenuText a {\r
+       display: block;\r
+       line-height: 20px;\r
+       width: 100%;\r
+       text-decoration: none;\r
+       color: black;\r
+       font-weight: normal;\r
+       margin: 0;\r
+       padding: 0;\r
+}\r
+\r
+.contextMenuText a:hover {\r
+       background-color: #B6BDD2;\r
+       text-decoration: none !important;\r
+       font-weight: normal;\r
+       margin: 0;\r
+       padding: 0;\r
+}\r
diff --git a/media/tiny_mce/plugins/contextmenu/editor_plugin.js b/media/tiny_mce/plugins/contextmenu/editor_plugin.js
new file mode 100755 (executable)
index 0000000..8426e0b
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu',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){if(e.ctrlKey)return true;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'&&tinyMCE.getAttrib(elm,'name')=='')||(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('<html><head><link href="'+tinyMCE.baseURL+'/plugins/contextmenu/css/contextmenu.css" rel="stylesheet" type="text/css" /></head><body unselectable="yes" class="contextMenuIEPopup"></body></html>');doc.close()}};TinyMCE_ContextMenu.prototype={clearAll:function(){this.html="";this.contextMenuDiv.innerHTML=""},addSeparator:function(){this.html+='<tr class="contextMenuItem"><td class="contextMenuIcon"><img src="'+this.settings['spacer_image']+'" width="20" height="1" class="contextMenuImage" /></td><td><img class="contextMenuSeparator" width="1" height="1" src="'+this.settings['spacer_image']+'" /></td></tr>'},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+='<tr class="contextMenuItem">';else html+='<tr class="contextMenuItemDisabled">';html+='<td class="contextMenuIcon"><img src="'+icon+'" width="20" height="20" class="contextMenuImage" /></td>';html+='<td><div class="contextMenuText">';html+='<a href="javascript:void(0);" onclick="'+onMouseDown+'" onmousedown="return false;">&#160;';html+=title;html+='&#160;</a>';html+='</div></td>';html+='</tr>';this.html+=html},show:function(x,y){var vp,width,height,yo;if(this.html=="")return;var html='';html+='<a href="#"></a><table border="0" cellpadding="0" cellspacing="0">';html+=this.html;html+='</table>';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='<div class="contextMenu">'+html+"</div>";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/media/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/media/tiny_mce/plugins/contextmenu/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..51340f6
--- /dev/null
@@ -0,0 +1,360 @@
+/**\r
+ * $Id: editor_plugin_src.js 264 2007-04-26 20:53:09Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+if (!tinyMCE.settings['contextmenu_skip_plugin_css']) {\r
+       tinyMCE.loadCSS(tinyMCE.baseURL + "/plugins/contextmenu/css/contextmenu.css");\r
+}\r
+\r
+var TinyMCE_ContextMenuPlugin = {\r
+       // Private fields\r
+       _contextMenu : null,\r
+\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Context menus',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               // Is not working on MSIE 5.0 or Opera no contextmenu event\r
+               if (tinyMCE.isMSIE5_0 && tinyMCE.isOpera)\r
+                       return;\r
+\r
+               TinyMCE_ContextMenuPlugin._contextMenu = new TinyMCE_ContextMenu({\r
+                       commandhandler : "TinyMCE_ContextMenuPlugin._commandHandler",\r
+                       spacer_image : tinyMCE.baseURL + "/plugins/contextmenu/images/spacer.gif"\r
+               });\r
+\r
+               // Add hide event handles\r
+               tinyMCE.addEvent(inst.getDoc(), "click", TinyMCE_ContextMenuPlugin._hideContextMenu);\r
+               tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_ContextMenuPlugin._hideContextMenu);\r
+               tinyMCE.addEvent(inst.getDoc(), "keydown", TinyMCE_ContextMenuPlugin._hideContextMenu);\r
+               tinyMCE.addEvent(document, "click", TinyMCE_ContextMenuPlugin._hideContextMenu);\r
+               tinyMCE.addEvent(document, "keypress", TinyMCE_ContextMenuPlugin._hideContextMenu);\r
+               tinyMCE.addEvent(document, "keydown", TinyMCE_ContextMenuPlugin._hideContextMenu);\r
+\r
+               // Attach contextmenu event\r
+               if (tinyMCE.isGecko) {\r
+                       tinyMCE.addEvent(inst.getDoc(), "contextmenu", function(e) {TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE ? inst.contentWindow.event : e, inst);});\r
+               } else\r
+                       tinyMCE.addEvent(inst.getDoc(), "contextmenu", TinyMCE_ContextMenuPlugin._onContextMenu);\r
+       },\r
+\r
+       // Private plugin internal methods\r
+\r
+       _onContextMenu : function(e) {\r
+               var elm = tinyMCE.isMSIE ? e.srcElement : e.target;\r
+               var targetInst, body;\r
+\r
+               // Find instance\r
+               if ((body = tinyMCE.getParentElement(elm, "body")) != null) {\r
+                       for (var n in tinyMCE.instances) {\r
+                               var inst = tinyMCE.instances[n];\r
+                               if (!tinyMCE.isInstance(inst))\r
+                                       continue;\r
+\r
+                               if (body == inst.getBody()) {\r
+                                       targetInst = inst;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       return TinyMCE_ContextMenuPlugin._showContextMenu(tinyMCE.isMSIE ? targetInst.contentWindow.event : e, targetInst);\r
+               }\r
+       },\r
+\r
+       _showContextMenu : function(e, inst) {\r
+               if (e.ctrlKey)\r
+                       return true;\r
+\r
+               function getAttrib(elm, name) {\r
+                       return elm.getAttribute(name) ? elm.getAttribute(name) : "";\r
+               }\r
+\r
+               var x, y, elm, contextMenu;\r
+               var pos = tinyMCE.getAbsPosition(inst.iframeElement);\r
+\r
+               x = tinyMCE.isMSIE ? e.screenX : pos.absLeft + (e.pageX - inst.getBody().scrollLeft);\r
+               y = tinyMCE.isMSIE ? e.screenY : pos.absTop + (e.pageY - inst.getBody().scrollTop);\r
+               elm = tinyMCE.isMSIE ? e.srcElement : e.target;\r
+\r
+               contextMenu = this._contextMenu;\r
+               contextMenu.inst = inst;\r
+\r
+               // Mozilla needs some time\r
+               window.setTimeout(function () {\r
+                       var theme = tinyMCE.getParam("theme");\r
+\r
+                       contextMenu.clearAll();\r
+                       var sel = inst.selection.getSelectedText().length != 0 || elm.nodeName == "IMG";\r
+\r
+                       // Default items\r
+                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_cut_desc", "Cut", "", !sel);\r
+                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_copy_desc", "Copy", "", !sel);\r
+                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_paste_desc", "Paste", "", false);\r
+\r
+                       if (sel || (elm ? (elm.nodeName == 'A' && tinyMCE.getAttrib(elm, 'name') == '') || (elm.nodeName == 'IMG') : false)) {\r
+                               contextMenu.addSeparator();\r
+                               contextMenu.addItem(tinyMCE.baseURL + "/themes/advanced/images/link.gif", "$lang_link_desc", inst.hasPlugin("advlink") ? "mceAdvLink" : "mceLink");\r
+                               contextMenu.addItem(tinyMCE.baseURL + "/themes/advanced/images/unlink.gif", "$lang_unlink_desc", "unlink", "", (elm ? (elm.nodeName != 'A') && (elm.nodeName != 'IMG') : true));\r
+                       }\r
+\r
+                       // Get element\r
+                       elm = tinyMCE.getParentElement(elm, "img,table,td" + (inst.hasPlugin("advhr") ? ',hr' : ''));\r
+                       if (elm) {\r
+                               switch (elm.nodeName) {\r
+                                       case "IMG":\r
+                                               contextMenu.addSeparator();\r
+\r
+                                               // If flash\r
+                                               if (tinyMCE.hasPlugin('flash') && tinyMCE.getAttrib(elm, 'class').indexOf('mceItemFlash') != -1)\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/flash/images/flash.gif", "$lang_flash_props", "mceFlash");\r
+                                               else if (tinyMCE.hasPlugin('media') && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(elm, 'class')))\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/flash/images/flash.gif", "$lang_media_title", "mceMedia");\r
+                                               else\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/image.gif", "$lang_image_props_desc", inst.hasPlugin("advimage") ? "mceAdvImage" : "mceImage");\r
+                                               break;\r
+\r
+                                       case "HR":\r
+                                               contextMenu.addSeparator();\r
+                                               contextMenu.addItem(tinyMCE.baseURL + "/plugins/advhr/images/advhr.gif", "$lang_insert_advhr_desc", "mceAdvancedHr");\r
+                                               break;\r
+\r
+                                       case "TABLE":\r
+                                       case "TD":\r
+                                               // Is table plugin loaded\r
+                                               if (inst.hasPlugin("table")) {\r
+                                                       var colspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "colspan");\r
+                                                       var rowspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "rowspan");\r
+\r
+                                                       colspan = colspan == "" ? "1" : colspan;\r
+                                                       rowspan = rowspan == "" ? "1" : rowspan;\r
+\r
+                                                       contextMenu.addSeparator();\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_table_cut_row_desc", "mceTableCutRow");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_table_copy_row_desc", "mceTableCopyRow");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_before_desc", "mceTablePasteRowBefore", "", inst.tableRowClipboard == null);\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_after_desc", "mceTablePasteRowAfter", "", inst.tableRowClipboard == null);\r
+\r
+       /*                                              contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyleft.gif", "$lang_justifyleft_desc", "JustifyLeft", "", false);\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifycenter.gif", "$lang_justifycenter_desc", "JustifyCenter", "", false);\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyright.gif", "$lang_justifyright_desc", "JustifyRight", "", false);\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyfull.gif", "$lang_justifyfull_desc", "JustifyFull", "", false);*/\r
+                                                       contextMenu.addSeparator();\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_props_desc", "mceInsertTable");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_cell_props.gif", "$lang_table_cell_desc", "mceTableCellProps");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete.gif", "$lang_table_del", "mceTableDelete");\r
+                                                       contextMenu.addSeparator();\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_row_props.gif", "$lang_table_row_desc", "mceTableRowProps");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_before.gif", "$lang_table_row_before_desc", "mceTableInsertRowBefore");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_after.gif", "$lang_table_row_after_desc", "mceTableInsertRowAfter");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_row.gif", "$lang_table_delete_row_desc", "mceTableDeleteRow");\r
+                                                       contextMenu.addSeparator();\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_before.gif", "$lang_table_col_before_desc", "mceTableInsertColBefore");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_after.gif", "$lang_table_col_after_desc", "mceTableInsertColAfter");\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_col.gif", "$lang_table_delete_col_desc", "mceTableDeleteCol");\r
+                                                       contextMenu.addSeparator();\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_split_cells.gif", "$lang_table_split_cells_desc", "mceTableSplitCells", "", (colspan == "1" && rowspan == "1"));\r
+                                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_merge_cells.gif", "$lang_table_merge_cells_desc", "mceTableMergeCells", "", false);\r
+                                               }\r
+                                               break;\r
+                               }\r
+                       }  else {\r
+                               // Add table specific\r
+                               if (inst.hasPlugin("table")) {\r
+                                       contextMenu.addSeparator();\r
+                                       contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert");\r
+                               }\r
+                       }\r
+\r
+                       contextMenu.show(x, y);\r
+               }, 10);\r
+\r
+               // Cancel default handeling\r
+               tinyMCE.cancelEvent(e);\r
+               return false;\r
+       },\r
+\r
+       _hideContextMenu : function() {\r
+               if (TinyMCE_ContextMenuPlugin._contextMenu)\r
+                       TinyMCE_ContextMenuPlugin._contextMenu.hide();\r
+       },\r
+\r
+       _commandHandler : function(command, value) {\r
+               var cm = TinyMCE_ContextMenuPlugin._contextMenu;\r
+\r
+               cm.hide();\r
+\r
+               // UI must be true on these\r
+               var ui = false;\r
+               if (command == "mceInsertTable" || command == "mceTableCellProps" || command == "mceTableRowProps" || command == "mceTableMergeCells")\r
+                       ui = true;\r
+\r
+               if (command == "Paste")\r
+                       value = null;\r
+\r
+               if (tinyMCE.getParam("dialog_type") == "modal" && tinyMCE.isMSIE) {\r
+                       // Cell properties will generate access denied error is this isn't done?!\r
+                       window.setTimeout(function() {\r
+                               cm.inst.execCommand(command, ui, value);\r
+                       }, 100);\r
+               } else\r
+                       cm.inst.execCommand(command, ui, value);\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("contextmenu", TinyMCE_ContextMenuPlugin);\r
+\r
+// Context menu class\r
+\r
+function TinyMCE_ContextMenu(settings) {\r
+       var doc, self = this;\r
+\r
+       // Default value function\r
+       function defParam(key, def_val) {\r
+               settings[key] = typeof(settings[key]) != "undefined" ? settings[key] : def_val;\r
+       }\r
+\r
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+\r
+       // Setup contextmenu div\r
+       this.contextMenuDiv = document.createElement("div");\r
+       this.contextMenuDiv.className = "contextMenu";\r
+       this.contextMenuDiv.setAttribute("class", "contextMenu");\r
+       this.contextMenuDiv.style.display = "none";\r
+       this.contextMenuDiv.style.position = 'absolute';\r
+       this.contextMenuDiv.style.zindex = 1000;\r
+       this.contextMenuDiv.style.left = '0';\r
+       this.contextMenuDiv.style.top = '0';\r
+       this.contextMenuDiv.unselectable = "on";\r
+\r
+       document.body.appendChild(this.contextMenuDiv);\r
+\r
+       // Setup default values\r
+       defParam("commandhandler", "");\r
+       defParam("spacer_image", "images/spacer.gif");\r
+\r
+       this.items = new Array();\r
+       this.settings = settings;\r
+       this.html = "";\r
+\r
+       // IE Popup\r
+       if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) {\r
+               this.pop = window.createPopup();\r
+               doc = this.pop.document;\r
+               doc.open();\r
+               doc.write('<html><head><link href="' + tinyMCE.baseURL + '/plugins/contextmenu/css/contextmenu.css" rel="stylesheet" type="text/css" /></head><body unselectable="yes" class="contextMenuIEPopup"></body></html>');\r
+               doc.close();\r
+       }\r
+};\r
+\r
+TinyMCE_ContextMenu.prototype = {\r
+       clearAll : function() {\r
+               this.html = "";\r
+               this.contextMenuDiv.innerHTML = "";\r
+       },\r
+\r
+       addSeparator : function() {\r
+               this.html += '<tr class="contextMenuItem"><td class="contextMenuIcon"><img src="' + this.settings['spacer_image'] + '" width="20" height="1" class="contextMenuImage" /></td><td><img class="contextMenuSeparator" width="1" height="1" src="' + this.settings['spacer_image'] + '" /></td></tr>';\r
+       },\r
+\r
+       addItem : function(icon, title, command, value, disabled) {\r
+               if (title.charAt(0) == '$')\r
+                       title = tinyMCE.getLang(title.substring(1));\r
+\r
+               var onMouseDown = '';\r
+               var html = '';\r
+\r
+               if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0)\r
+                       onMouseDown = 'contextMenu.execCommand(\'' + command + '\', \'' + value + '\');return false;';\r
+               else\r
+                       onMouseDown = this.settings['commandhandler'] + '(\'' + command + '\', \'' + value + '\');return false;';\r
+\r
+               if (icon == "")\r
+                       icon = this.settings['spacer_image'];\r
+\r
+               if (!disabled)\r
+                       html += '<tr class="contextMenuItem">';\r
+               else\r
+                       html += '<tr class="contextMenuItemDisabled">';\r
+\r
+               html += '<td class="contextMenuIcon"><img src="' + icon + '" width="20" height="20" class="contextMenuImage" /></td>';\r
+               html += '<td><div class="contextMenuText">';\r
+               html += '<a href="javascript:void(0);" onclick="' + onMouseDown + '" onmousedown="return false;">&#160;';\r
+\r
+               // Add text\r
+               html += title;\r
+\r
+               html += '&#160;</a>';\r
+               html += '</div></td>';\r
+               html += '</tr>';\r
+\r
+               // Add to main\r
+               this.html += html;\r
+       },\r
+\r
+       show : function(x, y) {\r
+               var vp, width, height, yo;\r
+\r
+               if (this.html == "")\r
+                       return;\r
+\r
+               var html = '';\r
+\r
+               html += '<a href="#"></a><table border="0" cellpadding="0" cellspacing="0">';\r
+               html += this.html;\r
+               html += '</table>';\r
+\r
+               this.contextMenuDiv.innerHTML = html;\r
+\r
+               // Get dimensions\r
+               this.contextMenuDiv.style.display = "block";\r
+               width = this.contextMenuDiv.offsetWidth;\r
+               height = this.contextMenuDiv.offsetHeight;\r
+               this.contextMenuDiv.style.display = "none";\r
+\r
+               if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) {\r
+                       // Setup popup and show\r
+                       this.pop.document.body.innerHTML = '<div class="contextMenu">' + html + "</div>";\r
+                       this.pop.document.tinyMCE = tinyMCE;\r
+                       this.pop.document.contextMenu = this;\r
+                       this.pop.show(x, y, width, height);\r
+               } else {\r
+                       vp = this.getViewPort();\r
+                       yo = tinyMCE.isMSIE5_0 ? document.body.scrollTop : self.pageYOffset;\r
+                       this.contextMenuDiv.style.left = (x > vp.left + vp.width - width ? vp.left + vp.width - width : x) + 'px';\r
+                       this.contextMenuDiv.style.top = (y > vp.top + vp.height - height ? vp.top + vp.height - height : y) + 'px';\r
+                       this.contextMenuDiv.style.display = "block";\r
+               }\r
+       },\r
+\r
+       getViewPort : function() {\r
+               return {\r
+                       left : self.pageXOffset || self.document.documentElement.scrollLeft || self.document.body.scrollLeft,\r
+                       top: self.pageYOffset || self.document.documentElement.scrollTop || self.document.body.scrollTop,\r
+                       width : document.documentElement.offsetWidth || document.body.offsetWidth,\r
+                       height : self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight\r
+               };\r
+       },\r
+\r
+       hide : function() {\r
+               if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera)\r
+                       this.pop.hide();\r
+               else\r
+                       this.contextMenuDiv.style.display = "none";\r
+       },\r
+\r
+       execCommand : function(command, value) {\r
+               eval(this.settings['commandhandler'] + "(command, value);");\r
+       }\r
+};\r
diff --git a/media/tiny_mce/plugins/contextmenu/images/spacer.gif b/media/tiny_mce/plugins/contextmenu/images/spacer.gif
new file mode 100755 (executable)
index 0000000..3884865
Binary files /dev/null and b/media/tiny_mce/plugins/contextmenu/images/spacer.gif differ
diff --git a/media/tiny_mce/plugins/contextmenu/readme.txt b/media/tiny_mce/plugins/contextmenu/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/devkit/css/devkit.css b/media/tiny_mce/plugins/devkit/css/devkit.css
new file mode 100755 (executable)
index 0000000..27eaac0
--- /dev/null
@@ -0,0 +1,117 @@
+body {\r
+       overflow: hidden;\r
+}\r
+\r
+h1 {\r
+       font-size: 14px;\r
+       margin: 0 0 10px 0;\r
+}\r
+\r
+h2 {\r
+       font-size: 12px;\r
+       margin: 3px 0 3px 0;\r
+}\r
+\r
+h3 {\r
+       font-size: 11px;\r
+       margin: 3px 0 3px 0;\r
+}\r
+\r
+#log {\r
+       font-family: Verdana;\r
+       border: 1px solid gray;\r
+       width: 100%; height: 240px;\r
+       overflow: scroll;\r
+       white-space: nowrap;\r
+}\r
+\r
+#log span {\r
+       display: block;\r
+}\r
+\r
+#log span.msg {\r
+       float: left;\r
+}\r
+\r
+#log span.time {\r
+       float: left;\r
+}\r
+\r
+#log br {\r
+       clear: both;\r
+}\r
+\r
+#logfilter {\r
+       width: 350px;\r
+}\r
+\r
+#logenabled {\r
+       border: 0;\r
+}\r
+\r
+#settings_panel span, #info_panel span, #content_panel span, #command_states_panel span, #undo_redo_panel span {\r
+       display: block;\r
+       margin: 5px 0 5px 0;\r
+}\r
+\r
+div.data {\r
+       width: 100%; height: 240px;\r
+       overflow: scroll;\r
+       border: 1px solid gray;\r
+}\r
+\r
+#misc_panel div.data {\r
+       height: 270px;\r
+}\r
+\r
+.data input {\r
+       width: 265px;\r
+       border: 0;\r
+}\r
+\r
+.data h2 {\r
+       margin-left: 5px;\r
+}\r
+\r
+.data h3 {\r
+       margin-left: 7px;\r
+}\r
+\r
+.data div {\r
+       margin-left: 7px;\r
+}\r
+\r
+.data table {\r
+       margin: 0 0 15px 15px;\r
+}\r
+\r
+.data p {\r
+       margin: 0; padding: 0;\r
+       margin-top: 5px;\r
+       margin-left: 5px;\r
+}\r
+\r
+table, td {\r
+       border: 1px solid gray;\r
+       border-collapse: collapse;\r
+}\r
+\r
+#flip {\r
+       position: absolute;\r
+       left: 295; top: 384px;\r
+}\r
+\r
+.bspec {\r
+       color: gray;\r
+}\r
+\r
+.dep {\r
+       color: #880000;\r
+}\r
+\r
+.col1 {\r
+       width: 265px;\r
+}\r
+\r
+div.undodata {\r
+}\r
diff --git a/media/tiny_mce/plugins/devkit/css/devkit_ui.css b/media/tiny_mce/plugins/devkit/css/devkit_ui.css
new file mode 100755 (executable)
index 0000000..6713abc
--- /dev/null
@@ -0,0 +1,15 @@
+#devkit {\r
+       position: absolute;\r
+       top: -385px; right: 0;\r
+       width: 640px; height: 390px;\r
+       border: 1px solid black;\r
+       z-index: 10000;\r
+}\r
+\r
+.devkitup {\r
+       top: -385px !important;\r
+}\r
+\r
+.devkitdown {\r
+       top: 0 !important;\r
+}\r
diff --git a/media/tiny_mce/plugins/devkit/devkit.htm b/media/tiny_mce/plugins/devkit/devkit.htm
new file mode 100755 (executable)
index 0000000..92a339b
--- /dev/null
@@ -0,0 +1,140 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_devkit_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/devkit.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/diff.js"></script>\r
+       <link href="css/devkit.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="devkit" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form action="#">\r
+               <h1>{$lang_devkit_title}</h1>\r
+\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="log_tab" class="current"><span><a href="javascript:mcTabs.displayTab('log_tab','log_panel');" onmousedown="return false;">{$lang_devkit_log_tab}</a></span></li>\r
+                               <li id="info_tab"><span><a href="javascript:mcTabs.displayTab('info_tab','info_panel');" onmousedown="return false;">{$lang_devkit_info_tab}</a></span></li>\r
+                               <li id="settings_tab"><span><a href="javascript:mcTabs.displayTab('settings_tab','settings_panel');" onmousedown="return false;">{$lang_devkit_settings_tab}</a></span></li>\r
+                               <li id="content_tab"><span><a href="javascript:mcTabs.displayTab('content_tab','content_panel');" onmousedown="return false;">{$lang_devkit_content_tab}</a></span></li>\r
+                               <!-- <li id="command_states_tab"><span><a href="javascript:mcTabs.displayTab('command_states_tab','command_states_panel');" onmousedown="return false;">{$lang_devkit_command_states_tab}</a></span></li> -->\r
+                               <li id="undo_redo_tab"><span><a href="javascript:mcTabs.displayTab('undo_redo_tab','undo_redo_panel');" onmousedown="return false;">{$lang_devkit_undo_redo_tab}</a></span></li>\r
+                               <li id="misc_tab"><span><a href="javascript:mcTabs.displayTab('misc_tab','misc_panel');" onmousedown="return false;">{$lang_devkit_misc_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="log_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_devkit_log_tab}</legend>\r
+\r
+                                       <div style="float: left">\r
+                                               <label>{$lang_devkit_filter} </label><input type="text" id="logfilter" name="logfilter" value="" onchange="changeFilter(this.value);" />\r
+                                       </div>\r
+\r
+                                       <div style="float: left">\r
+                                               <input type="checkbox" id="logenabled" name="logenabled" value="true" checked="checked" onclick="toggleLog(this.checked);" />\r
+                                       </div>\r
+\r
+                                       <div style="float: right">\r
+                                               <a href="javascript:clearLog();">[{$lang_devkit_clear_log}]</a>\r
+                                       </div>\r
+\r
+                                       <br style="clear: both" />\r
+\r
+                                       <div id="log">\r
+                                       </div>\r
+\r
+                                       <input type="checkbox" id="debug_events" name="debug_events" class="checkbox" onclick="toggleDebugEvents(this.checked);" /><label for="debug_events" onclick="toggleDebugEvents(this.form.debug_events.checked);">{$lang_devkit_debug_events}</label>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="info_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_devkit_info_tab}</legend>\r
+\r
+                                       <span><a href="javascript:renderInfo();">[{$lang_devkit_refresh}]</a></span>\r
+\r
+                                       <div id="info" class="data">\r
+                                               <p>{$lang_devkit_info_help}</p>\r
+                                       </div>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="settings_panel" class="panel">\r
+                       <fieldset>\r
+                                       <legend>{$lang_devkit_settings_tab}</legend>\r
+\r
+                                       <span><a href="javascript:renderSettings();">[{$lang_devkit_refresh}]</a></span>\r
+\r
+                                       <div id="settings" class="data">\r
+                                               <p>{$lang_devkit_settings_help}</p>\r
+                                       </div>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="content_panel" class="panel">\r
+                       <fieldset>\r
+                                       <legend>{$lang_devkit_content_tab}</legend>\r
+\r
+                                       <span><a href="javascript:renderContent();">[{$lang_devkit_refresh}]</a></span>\r
+\r
+                                       <div id="content" class="data">\r
+                                               <p>{$lang_devkit_content_help}</p>\r
+                                       </div>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="command_states_panel" class="panel">\r
+                       <fieldset>\r
+                                       <legend>{$lang_devkit_command_states_tab}</legend>\r
+\r
+                                       <span><a href="javascript:renderCommandStates();">[{$lang_devkit_refresh}]</a></span>\r
+\r
+                                       <div id="command_states" class="data">\r
+                                               <p>{$lang_devkit_command_states_help}</p>\r
+                                       </div>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="undo_redo_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_devkit_undo_redo_tab}</legend>\r
+\r
+                                       <span><a href="javascript:renderUndoRedo();">[{$lang_devkit_refresh}]</a></span>\r
+\r
+                                       <div id="undo_redo" class="data">\r
+                                               <p>{$lang_devkit_undo_redo_help}</p>\r
+                                       </div>\r
+\r
+                                       <input type="checkbox" id="undo_diff" name="undo_diff" class="checkbox" /><label for="undo_diff">{$lang_devkit_undo_diff}</label>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="misc_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_devkit_misc_tab}</legend>\r
+\r
+                                       <div class="data">\r
+                                               <p>{$lang_devkit_misc_help}</p>\r
+                                               <hr />\r
+                                               <p>Selection: <a href="#" onmousedown="return storeSelection();">[Store selection]</a> <a href="#" onmousedown="return restoreSelection();">[Restore selection]</a></p>\r
+                                               <hr />\r
+                                               <div><strong>Insert custom HTML content</strong></div>\r
+                                               <div><textarea id="htmlcont" name="htmlcont" style="width: 90%" rows="5"></textarea></div>\r
+                                               <div><a href="#" onclick="return tinyMCE.execCommand('mceInsertContent',false,document.getElementById('htmlcont').value);">[Insert content]</a></div>\r
+                                               <hr />\r
+                                               <div><strong>Eval JS:</strong></div>\r
+                                               <div><textarea id="jscont" name="jscont" style="width: 90%" rows="5">tinyMCE.execCommand('Bold',false,null);</textarea></div>\r
+                                               <div><a href="#" onclick="return parent.window.eval(document.getElementById('jscont').value);">[Evaluate]</a></div>\r
+                                       </div>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+    </form>\r
+\r
+       <div id="flip"><a href="javascript:toggleFlip();" onmousedown="return false;"><img id="flipbtn" src="images/flip_down.gif" border="0" /></a></div>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/devkit/editor_plugin.js b/media/tiny_mce/plugins/devkit/editor_plugin.js
new file mode 100755 (executable)
index 0000000..8a5d64c
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/devkit',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;i<a.length;i++){if(typeof(a[i])=='undefined')continue;if(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'];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<ev.length;i++){if(s)tinyMCE.addEvent(ld,ev[i],TinyMCE_DevKitPlugin._debugEvent);else tinyMCE.removeEvent(ld,ev[i],TinyMCE_DevKitPlugin._debugEvent)}}},_debugEvent:function(e){var t;e=e?e:tinyMCE.selectedInstance.getWin().event;t=e.srcElement?e.srcElement:e.target;tinyMCE.debug(e.type,t?t.nodeName:'')},_serialize:function(o){var i,v,s=TinyMCE_DevKitPlugin._serialize;if(o==null)return'null';switch(typeof o){case'string':v='\bb\tt\nn\ff\rr\""\'\'\\\\';return'"'+o.replace(new RegExp('([\u0080-\uFFFF\\x00-\\x1f\\"])','g'),function(a,b){i=v.indexOf(b);if(i+1)return'\\'+v.charAt(i+1);a=b.charCodeAt().toString(16);return'\\u'+'0000'.substring(a.length)+a})+'"';case'object':if(o instanceof Array){for(i=0,v='[';i<o.length;i++)v+=(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}};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<a.length;i++){if(typeof(a[i])=='undefined')continue;if(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);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/devkit/editor_plugin_src.js b/media/tiny_mce/plugins/devkit/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..efe7256
--- /dev/null
@@ -0,0 +1,325 @@
+/**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+tinyMCE.importPluginLanguagePack('devkit');\r
+\r
+var TinyMCE_DevKitPlugin = {\r
+       _logFilter : '\\[(importCSS|execCommand|execInstanceCommand|debug)\\]',\r
+       _logPadding : '',\r
+       _startTime : null,\r
+       _benchMark : false,\r
+       _winLoaded : false,\r
+       _isDebugEvents : false,\r
+\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Development Kit',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/devkit',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               this._setup();\r
+       },\r
+\r
+       _setup : function() {\r
+               if (this._loaded)\r
+                       return;\r
+\r
+               this._loaded = true;\r
+\r
+               // Register a document reference for more easy access in the FF DOM inspector\r
+               document.___TinyMCE = tinyMCE;\r
+\r
+               // Setup devkit by settings\r
+               this._logFilter = tinyMCE.getParam('devkit_log_filter', this._logFilter);\r
+               this._benchMark = tinyMCE.getParam('devkit_bench_mark', false);\r
+\r
+               var ifr = document.createElement('iframe');\r
+\r
+               ifr.setAttribute("id", "devkit");\r
+               ifr.setAttribute("frameBorder", "0");\r
+               ifr.setAttribute("src", tinyMCE.baseURL + '/plugins/devkit/devkit.htm');\r
+\r
+               document.body.appendChild(ifr);\r
+\r
+               // Workaround for strange IE reload bug\r
+               //if (tinyMCE.isRealIE)\r
+               //      document.getElementById('devkit').outerHTML = document.getElementById('devkit').outerHTML;\r
+\r
+               tinyMCE.importCSS(document, tinyMCE.baseURL + '/plugins/devkit/css/devkit_ui.css');\r
+       },\r
+\r
+       _start : function() {\r
+               this._logPadding += '\u00a0';\r
+\r
+               return new Date().getTime();\r
+       },\r
+\r
+       _end : function(st) {\r
+               if (this._logPadding.length > 0)\r
+                       this._logPadding = this._logPadding.substring(0, this._logPadding.length - 1);\r
+\r
+               if (this._benchMark)\r
+                       this._log("benchmark", "Execution time: " + (new Date().getTime() - st));\r
+       },\r
+\r
+       _log : function(t) {\r
+               var m, a, i, e = document.getElementById('devkit'), now = new Date().getTime();\r
+\r
+               if (!this._startTime)\r
+                       this._startTime = now;\r
+\r
+               m = (this._logPadding.length > 1 ? this._logPadding : '') + '[' + (now - this._startTime) + '] [' + t + '] ';\r
+\r
+               a = this._log.arguments;\r
+               for (i=1; i<a.length; i++) {\r
+                       if (typeof(a[i]) == 'undefined')\r
+                               continue;\r
+\r
+                       if (i > 1)\r
+                               m += ', ';\r
+\r
+                       m += a[i];\r
+               }\r
+\r
+               if (!new RegExp(this._logFilter, 'gi').test(m)) {\r
+                       if (this._logPadding.length > 0)\r
+                               this._logPadding = this._logPadding.substring(0, this._logPadding.length - 1);\r
+\r
+                       return;\r
+               }\r
+\r
+               if (!this._winLoaded)\r
+                       tinyMCE.log[tinyMCE.log.length] = m;\r
+               else\r
+                       e.contentWindow.debug(m);\r
+       },\r
+\r
+       _debugEvents : function(s) {\r
+               var i, ld, inst, n, ev = ['CheckboxStateChange','DOMAttrModified','DOMMenuItemActive',\r
+                               'DOMMenuItemInactive','DOMMouseScroll','DOMNodeInserted','DOMNodeRemoved',\r
+                               'RadioStateChange','blur','broadcast','change','click','close','command',\r
+                               'commandupdate','contextmenu','dblclick','dragdrop','dragenter','dragexit',\r
+                               'draggesture','dragover','focus','input','keydown','keypress','keyup','load',\r
+                               'mousedown','mouseout','mouseover','mouseup','overflow','overflowchanged','popuphidden',\r
+                               'popuphiding','popupshowing','popupshown','select','syncfrompreference','synctopreference',\r
+                               'underflow','unload','abort','activate','afterprint','afterupdate','beforeactivate',\r
+                               'beforecopy','beforecut','beforedeactivate','beforeeditfocus','beforepaste','beforeprint',\r
+                               'beforeunload','beforeupdate','bounce','cellchange','controlselect','copy','cut',\r
+                               'dataavailable','datasetchanged','datasetcomplete','deactivate','dragend','dragleave',\r
+                               'dragstart','drop','error','errorupdate','filterchange','finish','focusin','focusout',\r
+                               'help','layoutcomplete','losecapture','mouseenter','mouseleave','mousewheel',\r
+                               'move','moveend','movestart','paste','propertychange','readystatechange','reset','resize',\r
+                               'resizeend','resizestart','rowenter','rowexit','rowsdelete','rowsinserted','scroll',\r
+                               'selectionchange','selectstart','start','stop','submit'];\r
+               // mousemove\r
+\r
+               if (TinyMCE_DevKitPlugin._isDebugEvents == s)\r
+                       return;\r
+\r
+               TinyMCE_DevKitPlugin._isDebugEvents = s;\r
+\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst) || inst.getDoc() == ld)\r
+                               continue;\r
+\r
+                       ld = inst.getDoc();\r
+\r
+                       for (i=0; i<ev.length; i++) {\r
+                               if (s)\r
+                                       tinyMCE.addEvent(ld, ev[i], TinyMCE_DevKitPlugin._debugEvent);\r
+                               else\r
+                                       tinyMCE.removeEvent(ld, ev[i], TinyMCE_DevKitPlugin._debugEvent);\r
+                       }\r
+               }\r
+       },\r
+\r
+       _debugEvent : function(e) {\r
+               var t;\r
+\r
+               e = e ? e : tinyMCE.selectedInstance.getWin().event;\r
+               t = e.srcElement ? e.srcElement : e.target;\r
+\r
+               tinyMCE.debug(e.type, t ? t.nodeName : '');\r
+       },\r
+\r
+       _serialize : function(o) {\r
+               var i, v, s = TinyMCE_DevKitPlugin._serialize;\r
+\r
+               if (o == null)\r
+                       return 'null';\r
+\r
+               switch (typeof o) {\r
+                       case 'string':\r
+                               v = '\bb\tt\nn\ff\rr\""\'\'\\\\';\r
+\r
+                               return '"' + o.replace(new RegExp('([\u0080-\uFFFF\\x00-\\x1f\\"])', 'g'), function(a, b) {\r
+                                       i = v.indexOf(b);\r
+\r
+                                       if (i+1)\r
+                                               return '\\' + v.charAt(i + 1);\r
+\r
+                                       a = b.charCodeAt().toString(16);\r
+\r
+                                       return '\\u' + '0000'.substring(a.length) + a;\r
+                               }) + '"';\r
+\r
+                       case 'object':\r
+                               if (o instanceof Array) {\r
+                                       for (i=0, v = '['; i<o.length; i++)\r
+                                               v += (i > 0 ? ',' : '') + s(o[i]);\r
+\r
+                                       return v + ']';\r
+                               }\r
+\r
+                               v = '{';\r
+\r
+                               for (i in o)\r
+                                       v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : '';\r
+\r
+                               return v + '}';\r
+               }\r
+\r
+               return '' + o;\r
+       }\r
+};\r
+\r
+// Patch and piggy back functions\r
+tinyMCE.__debug = tinyMCE.debug;\r
+tinyMCE.debug = function() {\r
+       var a, i, m = '', now = new Date().getTime(), start = TinyMCE_DevKitPlugin._startTime;\r
+\r
+       if (!start)\r
+               TinyMCE_DevKitPlugin._startTime = start = now;\r
+\r
+       a = this.debug.arguments;\r
+       for (i=0; i<a.length; i++) {\r
+               if (typeof(a[i]) == 'undefined')\r
+                       continue;\r
+\r
+               if (i > 0)\r
+                       m += ', ';\r
+\r
+               m += a[i];\r
+       }\r
+\r
+       TinyMCE_DevKitPlugin._log('debug', m);\r
+};\r
+\r
+tinyMCE.dump = function(o) {\r
+       tinyMCE.debug(TinyMCE_DevKitPlugin._serialize(o));\r
+};\r
+\r
+tinyMCE.sleep = function(t) {\r
+       var s = new Date().getTime(), b;\r
+\r
+       while (new Date().getTime() - s < t) b=1;\r
+};\r
+\r
+tinyMCE.__execCommand = tinyMCE.execCommand;\r
+tinyMCE.execCommand = function(command, user_interface, value) {\r
+       var r, st, dk = TinyMCE_DevKitPlugin;\r
+\r
+       st = dk._start();\r
+       dk._log('execCommand', command, user_interface, value);\r
+       r = tinyMCE.__execCommand(command, user_interface, value);\r
+       dk._end(st);\r
+\r
+       return r;\r
+};\r
+\r
+tinyMCE.__execInstanceCommand = tinyMCE.execInstanceCommand;\r
+tinyMCE.execInstanceCommand = function(editor_id, command, user_interface, value, focus) {\r
+       var r, st, dk = TinyMCE_DevKitPlugin;\r
+\r
+       st = dk._start();\r
+       dk._log('execInstanceCommand', editor_id, command, user_interface, value);\r
+       r = tinyMCE.__execInstanceCommand(editor_id, command, user_interface, value);\r
+       dk._end(st);\r
+\r
+       return r;\r
+};\r
+\r
+TinyMCE_Engine.prototype.__handleEvent = TinyMCE_Engine.prototype.handleEvent;\r
+TinyMCE_Engine.prototype.handleEvent = function(e) {\r
+       var r, st, dk = TinyMCE_DevKitPlugin;\r
+\r
+       st = dk._start();\r
+       dk._log('handleEvent', e.type);\r
+       r = tinyMCE.__handleEvent(e);\r
+       dk._end(st);\r
+\r
+       return r;\r
+};\r
+\r
+tinyMCE.__importCSS = tinyMCE.importCSS;\r
+tinyMCE.importCSS = function(doc, css) {\r
+       var r, st, dk = TinyMCE_DevKitPlugin;\r
+\r
+       st = dk._start();\r
+       dk._log('importCSS', doc, css);\r
+       r = tinyMCE.__importCSS(doc, css);\r
+       dk._end(st);\r
+\r
+       return r;\r
+};\r
+\r
+tinyMCE.__triggerNodeChange = tinyMCE.triggerNodeChange;\r
+tinyMCE.triggerNodeChange = function(focus, setup_content) {\r
+       var r, st, dk = TinyMCE_DevKitPlugin;\r
+\r
+       st = dk._start();\r
+       dk._log('triggerNodeChange', focus, setup_content);\r
+       r = tinyMCE.__triggerNodeChange(focus, setup_content);\r
+       dk._end(st);\r
+\r
+       return r;\r
+};\r
+\r
+tinyMCE.__dispatchCallback = tinyMCE.dispatchCallback;\r
+tinyMCE.dispatchCallback = function(i, p, n) {\r
+       var r, st, dk = TinyMCE_DevKitPlugin;\r
+\r
+       st = dk._start();\r
+       dk._log('dispatchCallback', i, p, n);\r
+       r = tinyMCE.__dispatchCallback(i, p, n);\r
+       dk._end(st);\r
+\r
+       return r;\r
+};\r
+\r
+tinyMCE.__executeCallback = tinyMCE.executeCallback;\r
+tinyMCE.executeCallback = function(i, p, n) {\r
+       var r, st, dk = TinyMCE_DevKitPlugin;\r
+\r
+       st = dk._start();\r
+       dk._log('executeCallback', i, p, n);\r
+       r = tinyMCE.__executeCallback(i, p, n);\r
+       dk._end(st);\r
+\r
+       return r;\r
+};\r
+\r
+tinyMCE.__execCommandCallback = tinyMCE.execCommandCallback;\r
+tinyMCE.execCommandCallback = function(i, p, n) {\r
+       var r, st, dk = TinyMCE_DevKitPlugin;\r
+\r
+       st = dk._start();\r
+       dk._log('execCommandCallback', i, p, n);\r
+       r = tinyMCE.__execCommandCallback(i, p, n);\r
+       dk._end(st);\r
+\r
+       return r;\r
+};\r
+\r
+tinyMCE.addPlugin("devkit", TinyMCE_DevKitPlugin);\r
diff --git a/media/tiny_mce/plugins/devkit/images/flip_down.gif b/media/tiny_mce/plugins/devkit/images/flip_down.gif
new file mode 100755 (executable)
index 0000000..29a2d74
Binary files /dev/null and b/media/tiny_mce/plugins/devkit/images/flip_down.gif differ
diff --git a/media/tiny_mce/plugins/devkit/images/flip_up.gif b/media/tiny_mce/plugins/devkit/images/flip_up.gif
new file mode 100755 (executable)
index 0000000..4b9676b
Binary files /dev/null and b/media/tiny_mce/plugins/devkit/images/flip_up.gif differ
diff --git a/media/tiny_mce/plugins/devkit/jscripts/devkit.js b/media/tiny_mce/plugins/devkit/jscripts/devkit.js
new file mode 100755 (executable)
index 0000000..0225405
--- /dev/null
@@ -0,0 +1,331 @@
+var devkit = parent.tinyMCE.plugins['devkit'], logEnabled = true, flip = false, book = null;\r
+\r
+function init() {\r
+       var log, i, f = document.forms[0];\r
+\r
+       devkit._winLoaded = true;\r
+\r
+       log = tinyMCE.log;\r
+\r
+       for (i=0; i<log.length; i++)\r
+               debug(log[i]);\r
+\r
+       f.logfilter.value = devkit._logFilter;\r
+}\r
+\r
+function changeFilter(f) {\r
+       devkit._logFilter = f;\r
+}\r
+\r
+function toggleLog(s) {\r
+       logEnabled = s;\r
+}\r
+\r
+function toggleFlip() {\r
+       document.getElementById('flipbtn').src = flip ? 'images/flip_down.gif' : 'images/flip_up.gif';\r
+\r
+       if (flip)\r
+               parent.document.getElementById('devkit').className = 'devkitup';\r
+       else\r
+               parent.document.getElementById('devkit').className = 'devkitdown';\r
+\r
+       flip = !flip;\r
+}\r
+\r
+function debug(s) {\r
+       var d, l, n;\r
+\r
+       if (!logEnabled || !new RegExp(devkit._logFilter, 'gi').test(s))\r
+               return;\r
+\r
+       d = document;\r
+       l = d.getElementById('log');\r
+       n = d.createElement('span');\r
+\r
+       n.innerHTML = tinyMCE.xmlEncode(s);\r
+\r
+       l.appendChild(n);\r
+       l.scrollTop = l.scrollHeight;\r
+}\r
+\r
+function renderInfo() {\r
+       var se = document.getElementById('info'), n, sn, inst, h = '', sel, rng, instCount = 0, rc;\r
+\r
+       h += '<h2>Browser info:</h2>';\r
+\r
+       h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';\r
+       h += addRenderInfo('navigator.userAgent', navigator.userAgent);\r
+       h += addRenderInfo('navigator.appName', navigator.appName);\r
+       h += addRenderInfo('navigator.platform', navigator.platform);\r
+       h += addRenderInfo('navigator.language', navigator.language, 'bspec');\r
+       h += addRenderInfo('navigator.browserLanguage', navigator.browserLanguage, 'bspec');\r
+       h += addRenderInfo('navigator.systemLanguage', navigator.systemLanguage, 'bspec');\r
+       h += addRenderInfo('navigator.userLanguage', navigator.userLanguage, 'bspec');\r
+       h += addRenderInfo('opera.buildNumber("inconspicuous")', typeof(opera) != 'undefined' && opera.buildNumber ? opera.buildNumber('inconspicuous') : null, 'bspec');\r
+       h += addRenderInfo('window.innerWidth', parent.window.innerWidth, 'bspec');\r
+       h += addRenderInfo('window.innerHeight', parent.window.innerHeight, 'bspec');\r
+       h += addRenderInfo('document.body.offsetWidth', parent.document.body.offsetWidth);\r
+       h += addRenderInfo('document.body.offsetHeight', parent.document.body.offsetHeight);\r
+       h += addRenderInfo('screen.width', screen.width);\r
+       h += addRenderInfo('screen.height', screen.height);\r
+       h += addRenderInfo('screen.availWidth', screen.availWidth);\r
+       h += addRenderInfo('screen.availHeight', screen.availHeight);\r
+       h += addRenderInfo('screen.colorDepth', screen.colorDepth);\r
+       h += addRenderInfo('screen.pixelDepth', screen.pixelDepth, 'bspec');\r
+       h += addRenderInfo('document.contentType', document.contentType, 'bspec');\r
+       h += '</table>';\r
+\r
+       h += '<h2>TinyMCE_Engine info:</h2>';\r
+\r
+       h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';\r
+       h += addRenderInfo('baseURL', tinyMCE.baseURL);\r
+       h += addRenderInfo('selectedInstance.editorId', tinyMCE.selectedInstance ? tinyMCE.selectedInstance.editorId : null);\r
+       h += addRenderInfo('selectedElement.nodeName', tinyMCE.selectedElement ? tinyMCE.selectedElement.nodeName : null, 'dep');\r
+       h += addRenderInfo('loadedFiles',tinyMCE.loadedFiles.join(','));\r
+       h += addRenderInfo('isMSIE', tinyMCE.isMSIE);\r
+       h += addRenderInfo('isMSIE5', tinyMCE.isMSIE5);\r
+       h += addRenderInfo('isMSIE5_0', tinyMCE.isMSIE5_0);\r
+       h += addRenderInfo('isMSIE7', tinyMCE.isMSIE7);\r
+       h += addRenderInfo('isGecko', tinyMCE.isGecko);\r
+       h += addRenderInfo('isSafari', tinyMCE.isSafari);\r
+       h += addRenderInfo('isOpera', tinyMCE.isOpera);\r
+       h += addRenderInfo('isMac', tinyMCE.isMac);\r
+       h += addRenderInfo('isNS7', tinyMCE.isNS7);\r
+       h += addRenderInfo('isNS71', tinyMCE.isNS71);\r
+       h += addRenderInfo('idCounter', tinyMCE.idCounter);\r
+       h += addRenderInfo('currentConfig', tinyMCE.currentConfig);\r
+       h += addRenderInfo('majorVersion', tinyMCE.majorVersion);\r
+       h += addRenderInfo('minorVersion', tinyMCE.minorVersion);\r
+       h += addRenderInfo('releaseDate', tinyMCE.releaseDate);\r
+       h += addRenderInfo('documentBasePath', tinyMCE.documentBasePath);\r
+       h += addRenderInfo('documentURL', tinyMCE.documentURL);\r
+       h += '</table>';\r
+\r
+       for (n in tinyMCE.instances) {\r
+               inst = tinyMCE.instances[n];\r
+\r
+               if (!tinyMCE.isInstance(inst))\r
+                       continue;\r
+\r
+               sel = inst.selection.getSel();\r
+               rng = inst.selection.getRng();\r
+\r
+               h += '<h2>TinyMCE_Control(' + (instCount++) + ') id: ' + inst.editorId + '</h2>';\r
+               h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';\r
+\r
+               h += addRenderInfo('editorId', inst.editorId);\r
+               h += addRenderInfo('visualAid', inst.visualAid);\r
+               h += addRenderInfo('foreColor', inst.foreColor);\r
+               h += addRenderInfo('backColor', inst.backColor);\r
+               h += addRenderInfo('formTargetElementId', inst.formTargetElementId);\r
+               h += addRenderInfo('formElement', inst.formElement ? inst.formElement.nodeName : null);\r
+               h += addRenderInfo('oldTargetElement', inst.oldTargetElement ? inst.oldTargetElement.nodeName : null);\r
+               h += addRenderInfo('linkElement', inst.linkElement ? inst.linkElement.nodeName : null, 'dep');\r
+               h += addRenderInfo('imgElement', inst.imgElement ? inst.imgElement.nodeName : null, 'dep');\r
+               h += addRenderInfo('selectedNode', inst.selectedNode ? inst.selectedNode.nodeName : null, 'dep');\r
+               h += addRenderInfo('targetElement', inst.targetElement ? inst.targetElement.nodeName : null);\r
+               h += addRenderInfo('getBody().nodeName', inst.getBody() ? inst.getBody().nodeName : null);\r
+               h += addRenderInfo('getBody().getAttribute("id")', inst.getBody() ? inst.getBody().getAttribute("id") : null);\r
+               h += addRenderInfo('getDoc().location', inst.getDoc() ? inst.getDoc().location : null);\r
+               h += addRenderInfo('startContent', inst.startContent);\r
+               h += addRenderInfo('isHidden()', inst.isHidden());\r
+               h += addRenderInfo('isDirty()', inst.isDirty());\r
+               h += addRenderInfo('undoRedo.undoLevels.length', inst.undoRedo.undoLevels.length);\r
+               h += addRenderInfo('undoRedo.undoIndex', inst.undoRedo.undoIndex);\r
+               h += addRenderInfo('selection.getSelectedHTML()', inst.selection.getSelectedHTML());\r
+               h += addRenderInfo('selection.isCollapsed()', inst.selection.isCollapsed() || 'false');\r
+               h += addRenderInfo('selection.getSelectedText()', inst.selection.getSelectedText());\r
+               h += addRenderInfo('selection.getFocusElement().nodeName', inst.selection.getFocusElement().nodeName);\r
+               h += addRenderInfo('selection.getFocusElement().outerHTML', tinyMCE.getOuterHTML(inst.selection.getFocusElement()));\r
+\r
+               if ((tinyMCE.isGecko || tinyMCE.isOpera) && sel && rng) {\r
+                       h += addRenderInfo('selection.getSel().anchorNode.nodeName', sel.anchorNode ? sel.anchorNode.nodeName : null, 'bspec');\r
+                       h += addRenderInfo('selection.getSel().anchorOffset', sel.anchorOffset, 'bspec');\r
+                       h += addRenderInfo('selection.getSel().focusNode.nodeName', sel.focusNode ? sel.focusNode.nodeName : null, 'bspec');\r
+                       h += addRenderInfo('selection.getSel().focusOffset', sel.focusOffset, 'bspec');\r
+                       h += addRenderInfo('selection.getRng().startContainer.nodeName', rng.startContainer ? rng.startContainer.nodeName : null, 'bspec');\r
+                       h += addRenderInfo('selection.getRng().startOffset', rng.startOffset, 'bspec');\r
+                       h += addRenderInfo('selection.getRng().endContainer.nodeName', rng.endContainer ? rng.endContainer.nodeName : null, 'bspec');\r
+                       h += addRenderInfo('selection.getRng().endOffset', rng.endOffset, 'bspec');\r
+               }\r
+\r
+               if (typeof(rng.item) != 'undefined' || typeof(rng.htmlText) != 'undefined') {\r
+                       if (!rng.item) {\r
+                               h += addRenderInfo('selection.getSel().type', sel.type, 'bspec');\r
+                               h += addRenderInfo('selection.getRng().htmlText', rng.htmlText, 'bspec');\r
+                               h += addRenderInfo('selection.getRng().text', rng.text, 'bspec');\r
+                       } else\r
+                               h += addRenderInfo('selection.getRng().item(0).nodeName', rng.item(0).nodeName, 'bspec');\r
+               }\r
+\r
+               h += '</table>';\r
+       }\r
+\r
+       h += '<p>Fields marked in <strong class="bspec">gray</strong> is not cross browser and should be used with care.</p>';\r
+       h += '<p>Fields marked <strong class="dep">red</strong> are marked deprecated and will be removed in the future.</p><br />';\r
+\r
+       se.innerHTML = h;\r
+}\r
+\r
+function addRenderInfo(n, v, c) {\r
+       return '<tr><td' + (c ? ' class="' + c + '"' : '')+ '>' + n + '</td><td><input type="text" value="' + tinyMCE.xmlEncode(v != null ? ('' + v).replace(/[\r\n]/g, '') : 'null') + '" /></td></tr>';\r
+}\r
+\r
+function renderSettings() {\r
+       var se = document.getElementById('settings'), n, sn, inst, h = '', v;\r
+\r
+       for (n in tinyMCE.instances) {\r
+               inst = tinyMCE.instances[n];\r
+\r
+               if (!tinyMCE.isInstance(inst))\r
+                       continue;\r
+\r
+               h += '<h2>Instance id: ' + inst.editorId + '</h2>';\r
+               h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';\r
+\r
+               for (sn in inst.settings) {\r
+                       v = inst.settings[sn];\r
+\r
+                       h += '<tr><td class="col1">' + tinyMCE.xmlEncode(sn) + '</td><td><input type="text" value="' + tinyMCE.xmlEncode(v) + '" /></td></tr>';\r
+               }\r
+\r
+               h += '</table>';\r
+       }\r
+\r
+       se.innerHTML = h;\r
+}\r
+\r
+function renderContent() {\r
+       var se = document.getElementById('content'), n, inst, h = '';\r
+\r
+       for (n in tinyMCE.instances) {\r
+               inst = tinyMCE.instances[n];\r
+\r
+               if (!tinyMCE.isInstance(inst))\r
+                       continue;\r
+\r
+               h += '<h2>Instance id: ' + inst.editorId + '</h2>';\r
+\r
+               h += '<h3>Start content - inst.startContent:</h3>';\r
+               h += '<div>' + tinyMCE.xmlEncode(inst.startContent) + '</div>';\r
+\r
+               h += '<h3>Raw content - inst.getBody().innerHTML or inst.getHTML(true):</h3>';\r
+               h += '<div>' + tinyMCE.xmlEncode(inst.getHTML(true)) + '</div>';\r
+\r
+               h += '<h3>Cleaned content - inst.getHTML():</h3>';\r
+               h += '<div>' + tinyMCE.xmlEncode(inst.getHTML()) + '</div>';\r
+\r
+               if (inst.serializedHTML) {\r
+                       h += '<h3>Serialized HTML content - inst.serializedHTML:</h3>';\r
+                       h += '<div>' + tinyMCE.xmlEncode(inst.serializedHTML) + '</div>';\r
+               }\r
+       }\r
+\r
+       se.innerHTML = h;\r
+}\r
+\r
+function renderCommandStates() {\r
+       var se = document.getElementById('command_states'), n, inst, h = '', v, ex;\r
+       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;\r
+\r
+       for (n in tinyMCE.instances) {\r
+               inst = tinyMCE.instances[n];\r
+\r
+               if (!tinyMCE.isInstance(inst))\r
+                       continue;\r
+\r
+               h += '<h2>Instance id: ' + inst.editorId + '</h2>';\r
+               h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';\r
+\r
+               for (i=0; i<cmds.length; i++) {\r
+                       v = null;\r
+\r
+                       try {\r
+                               v = tinyMCE.isGecko || inst.getDoc().queryCommandSupported(cmds[i]);\r
+                               v = v ? inst.queryCommandState(cmds[i]) : 'Not supported';\r
+                       } catch (ex) {\r
+                               v = 'Not supported';\r
+                       }\r
+\r
+                       h += '<tr><td><input type="text" value="' + tinyMCE.xmlEncode(cmds[i]) + '" /></td><td><input type="text" value="' + tinyMCE.xmlEncode(v) + '" /></td></tr>';\r
+               }\r
+\r
+               h += '</table>';\r
+       }\r
+\r
+       se.innerHTML = h;\r
+}\r
+\r
+function renderUndoRedo() {\r
+       var se = document.getElementById('undo_redo'), inst, n, h = '', i, le, id, d, ur;\r
+       var f = document.forms[0];      \r
+\r
+       if (tinyMCE.undoLevels) {\r
+               le = tinyMCE.undoLevels;\r
+\r
+               h += '<h2>Global undo/redo</h2>';\r
+               h += '<table border="0" cellpadding="0" cellspacing="0" width="50%" class="data">';\r
+               h += '<tr><td>undoLevels.length</td><td>' + le.length + '</td></tr>';\r
+               h += '<tr><td>undoIndex</td><td>' + tinyMCE.undoIndex + '</td></tr>';\r
+               h += '</table>';\r
+\r
+               for (i=0; i<le.length; i++)\r
+                       h += '<h3>Level: ' + i + ', Instance: ' + (le[i] ? le[i].editorId : 'null') + '</h3>';\r
+       }\r
+\r
+       for (n in tinyMCE.instances) {\r
+               inst = tinyMCE.instances[n];\r
+\r
+               if (!tinyMCE.isInstance(inst))\r
+                       continue;\r
+\r
+               ur = inst.undoRedo;\r
+               le = ur.undoLevels;\r
+\r
+               h += '<hr /><h2>Instance id: ' + inst.editorId + '</h2>';\r
+               h += '<table border="0" cellpadding="0" cellspacing="0" width="50%" class="data">';\r
+               h += '<tr><td>undoLevels.length</td><td>' + le.length + '</td></tr>';\r
+               h += '<tr><td>undoIndex</td><td>' + ur.undoIndex + '</td></tr>';\r
+               h += '<tr><td>typingUndoIndex</td><td>' + ur.typingUndoIndex + '</td></tr>';\r
+               h += '<tr><td>undoRedo</td><td>' + ur.undoRedo + '</td></tr>';\r
+               h += '</table>';\r
+\r
+               for (i=0; i<le.length; i++) {\r
+                       h += '<h3>Level: ' + i + (!le[i].bookmark ? "" : " [bookmark]") + '</h3>';\r
+                       h += '<div class="undodata">' + tinyMCE.xmlEncode(le[i].content) + '</div>';\r
+\r
+                       if (i > 0 && f.undo_diff.checked) {\r
+                               d = diff_main(i > 0 ? le[i-1].content.replace(/[\r\n]+/g, '') : null, le[i].content.replace(/[\r\n]+/g, ''), false);\r
+                               diff_cleanup_semantic(d);\r
+                               h += '<h3>Diff ' + (i-1) + ',' + i + '</h3><div class="undodata">' + diff_prettyhtml(d) + '</div>';\r
+                       }\r
+               }\r
+       }\r
+\r
+       se.innerHTML = h;\r
+}\r
+\r
+function clearLog() {\r
+       document.getElementById('log').innerHTML = '';\r
+       devkit._startTime = null;\r
+}\r
+\r
+function cancelAction() {\r
+       parent.document.getElementById('devkit').style.display = 'none';\r
+}\r
+\r
+function toggleDebugEvents(s) {\r
+       devkit._debugEvents(s);\r
+}\r
+\r
+function storeSelection() {\r
+       book = tinyMCE.selectedInstance.selection.getBookmark();\r
+\r
+       return false;\r
+}\r
+\r
+function restoreSelection() {\r
+       tinyMCE.selectedInstance.selection.moveToBookmark(book);\r
+\r
+       return false;\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/devkit/jscripts/diff.js b/media/tiny_mce/plugins/devkit/jscripts/diff.js
new file mode 100755 (executable)
index 0000000..87b96cc
--- /dev/null
@@ -0,0 +1,1192 @@
+// Diff_Match_Patch v1.3\r
+// Computes the difference between two texts to create a patch.\r
+// Applies the patch onto another text, allowing for errors.\r
+// Copyright (C) 2006 Neil Fraser\r
+// http://neil.fraser.name/software/diff_match_patch/\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License (www.gnu.org) for more details.\r
+\r
+\r
+// Constants.\r
+// Redefine these in your program to override the defaults.\r
+\r
+// Number of seconds to map a diff before giving up.  (0 for infinity)\r
+var DIFF_TIMEOUT = 1.0;\r
+// Cost of an empty edit operation in terms of edit characters.\r
+var DIFF_EDIT_COST = 4;\r
+// Tweak the relative importance (0.0 = accuracy, 1.0 = proximity)\r
+var MATCH_BALANCE = 0.5;\r
+// At what point is no match declared (0.0 = perfection, 1.0 = very loose)\r
+var MATCH_THRESHOLD = 0.5;\r
+// The min and max cutoffs used when computing text lengths.\r
+var MATCH_MINLENGTH = 100;\r
+var MATCH_MAXLENGTH = 1000;\r
+// Chunk size for context length.\r
+var PATCH_MARGIN = 4;\r
+\r
+\r
+  //////////////////////////////////////////////////////////////////////\r
+ //  Diff                                                            //\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+// The data structure representing a diff is an array of tuples:\r
+// [[-1, "Hello"], [1, "Goodbye"], [0, " world."]]\r
+// which means: delete "Hello", add "Goodbye" and keep " world."\r
+\r
+\r
+function diff_main(text1, text2, checklines) {\r
+  // Find the differences between two texts.  Return an array of changes.\r
+  // If checklines is present and false, then don't run a line-level diff first to identify the changed areas.\r
+  // Check for equality (speedup)\r
+  if (text1 == text2)\r
+    return [[0, text1]];\r
+\r
+  if (typeof checklines == 'undefined')\r
+    checklines = true;\r
+\r
+  var a;\r
+  // Trim off common prefix (speedup)\r
+  a = diff_prefix(text1, text2);\r
+  text1 = a[0];\r
+  text2 = a[1];\r
+  var commonprefix = a[2];\r
+\r
+  // Trim off common suffix (speedup)\r
+  a = diff_suffix(text1, text2);\r
+  text1 = a[0];\r
+  text2 = a[1];\r
+  var commonsuffix = a[2];\r
+\r
+  var diff, i;\r
+  var longtext = text1.length > text2.length ? text1 : text2;\r
+  var shorttext = text1.length > text2.length ? text2 : text1;\r
+\r
+  if (!text1) {  // Just add some text (speedup)\r
+    diff = [[1, text2]];\r
+  } else if (!text2) { // Just delete some text (speedup)\r
+    diff = [[-1, text1]];\r
+  } else if ((i = longtext.indexOf(shorttext)) != -1) {\r
+    // Shorter text is inside the longer text (speedup)\r
+    diff = [[1, longtext.substring(0, i)], [0, shorttext], [1, longtext.substring(i+shorttext.length)]];\r
+    // Swap insertions for deletions if diff is reversed.\r
+    if (text1.length > text2.length)\r
+      diff[0][0] = diff[2][0] = -1;\r
+  } else {\r
+    longtext = shorttext = null; // Garbage collect\r
+    // Check to see if the problem can be split in two.\r
+    var hm = diff_halfmatch(text1, text2);\r
+    if (hm) {\r
+      // A half-match was found, sort out the return data.\r
+      var text1_a = hm[0];\r
+      var text1_b = hm[1];\r
+      var text2_a = hm[2];\r
+      var text2_b = hm[3];\r
+      var mid_common = hm[4];\r
+      // Send both pairs off for separate processing.\r
+      var diff_a = diff_main(text1_a, text2_a, checklines);\r
+      var diff_b = diff_main(text1_b, text2_b, checklines);\r
+      // Merge the results.\r
+      diff = diff_a.concat([[0, mid_common]], diff_b);\r
+    } else {\r
+      // Perform a real diff.\r
+      if (checklines && text1.length + text2.length < 250)\r
+        checklines = false; // Too trivial for the overhead.\r
+      if (checklines) {\r
+        // Scan the text on a line-by-line basis first.\r
+        a = diff_lines2chars(text1, text2);\r
+        text1 = a[0];\r
+        text2 = a[1];\r
+        var linearray = a[2];\r
+      }\r
+      diff = diff_map(text1, text2);\r
+      if (!diff) // No acceptable result.\r
+        diff = [[-1, text1], [1, text2]];\r
+      if (checklines) {\r
+        diff_chars2lines(diff, linearray); // Convert the diff back to original text.\r
+        diff_cleanup_semantic(diff); // Eliminate freak matches (e.g. blank lines)\r
+\r
+        // Rediff any replacement blocks, this time on character-by-character basis.\r
+        diff.push([0, '']);  // Add a dummy entry at the end.\r
+        var pointer = 0;\r
+        var count_delete = 0;\r
+        var count_insert = 0;\r
+        var text_delete = '';\r
+        var text_insert = '';\r
+        while(pointer < diff.length) {\r
+          if (diff[pointer][0] == 1) {\r
+            count_insert++;\r
+            text_insert += diff[pointer][1];\r
+          } else if (diff[pointer][0] == -1) {\r
+            count_delete++;\r
+            text_delete += diff[pointer][1];\r
+          } else {  // Upon reaching an equality, check for prior redundancies.\r
+            if (count_delete >= 1 && count_insert >= 1) {\r
+              // Delete the offending records and add the merged ones.\r
+              a = diff_main(text_delete, text_insert, false);\r
+              diff.splice(pointer - count_delete - count_insert, count_delete + count_insert);\r
+              pointer = pointer - count_delete - count_insert;\r
+              for (i=a.length-1; i>=0; i--)\r
+                diff.splice(pointer, 0, a[i]);\r
+              pointer = pointer + a.length;\r
+            }\r
+            count_insert = 0;\r
+            count_delete = 0;\r
+            text_delete = '';\r
+            text_insert = '';\r
+          }\r
+          pointer++;\r
+        }\r
+        diff.pop();  // Remove the dummy entry at the end.\r
+\r
+      }\r
+    }\r
+  }\r
+\r
+  if (commonprefix)\r
+    diff.unshift([0, commonprefix]);\r
+  if (commonsuffix)\r
+    diff.push([0, commonsuffix]);\r
+  diff_cleanup_merge(diff);\r
+  return diff;\r
+}\r
+\r
+\r
+function diff_lines2chars(text1, text2) {\r
+  // Split text into an array of strings.\r
+  // Reduce the texts to a string of hashes where each character represents one line.\r
+  var linearray = new Array();  // linearray[4] == "Hello\n"\r
+  var linehash = new Object();  // linehash["Hello\n"] == 4\r
+\r
+  // "\x00" is a valid JavaScript character, but the Venkman debugger doesn't like it (bug 335098)\r
+  // So we'll insert a junk entry to avoid generating a null character.\r
+  linearray.push('');\r
+\r
+  function diff_lines2chars_munge(text) {\r
+    // My first ever closure!\r
+    var i, line;\r
+    var chars = '';\r
+    while (text) {\r
+      i = text.indexOf('\n');\r
+      if (i == -1)\r
+        i = text.length;\r
+      line = text.substring(0, i+1);\r
+      text = text.substring(i+1);\r
+      if (linehash.hasOwnProperty ? linehash.hasOwnProperty(line) : (linehash[line] !== undefined)) {\r
+        chars += String.fromCharCode(linehash[line]);\r
+      } else {\r
+        linearray.push(line);\r
+        linehash[line] = linearray.length - 1;\r
+        chars += String.fromCharCode(linearray.length - 1);\r
+      }\r
+    }\r
+    return chars;\r
+  }\r
+\r
+  var chars1 = diff_lines2chars_munge(text1);\r
+  var chars2 = diff_lines2chars_munge(text2);\r
+  return [chars1, chars2, linearray];\r
+}\r
+\r
+\r
+function diff_chars2lines(diff, linearray) {\r
+  // Rehydrate the text in a diff from a string of line hashes to real lines of text.\r
+  var chars, text;\r
+  for (var x=0; x<diff.length; x++) {\r
+    chars = diff[x][1];\r
+    text = '';\r
+    for (var y=0; y<chars.length; y++)\r
+      text += linearray[chars.charCodeAt(y)];\r
+    diff[x][1] = text;\r
+  }\r
+}\r
+\r
+\r
+function diff_map(text1, text2) {\r
+  // Explore the intersection points between the two texts.\r
+  var now = new Date();\r
+  var ms_end = now.getTime() + DIFF_TIMEOUT * 1000; // Don't run for too long.\r
+  var max = (text1.length + text2.length) / 2;\r
+  var v_map1 = new Array();\r
+  var v_map2 = new Array();\r
+  var v1 = new Object();\r
+  var v2 = new Object();\r
+  v1[1] = 0;\r
+  v2[1] = 0;\r
+  var x, y;\r
+  var footstep; // Used to track overlapping paths.\r
+  var footsteps = new Object();\r
+  var done = false;\r
+  var hasOwnProperty = !!(footsteps.hasOwnProperty);\r
+  // If the total number of characters is odd, then the front path will collide with the reverse path.\r
+  var front = (text1.length + text2.length) % 2;\r
+  for (var d=0; d<max; d++) {\r
+    now = new Date();\r
+    if (DIFF_TIMEOUT > 0 && now.getTime() > ms_end) // Timeout reached\r
+      return null;\r
+\r
+    // Walk the front path one step.\r
+    v_map1[d] = new Object();\r
+    for (var k=-d; k<=d; k+=2) {\r
+      if (k == -d || k != d && v1[k-1] < v1[k+1])\r
+        x = v1[k+1];\r
+      else\r
+        x = v1[k-1]+1;\r
+      y = x - k;\r
+      footstep = x+","+y;\r
+      if (front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined)))\r
+        done = true;\r
+      if (!front)\r
+        footsteps[footstep] = d;\r
+      while (!done && x < text1.length && y < text2.length && text1.charAt(x) == text2.charAt(y)) {\r
+        x++; y++;\r
+        footstep = x+","+y;\r
+        if (front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined)))\r
+          done = true;\r
+        if (!front)\r
+          footsteps[footstep] = d;\r
+      }\r
+      v1[k] = x;\r
+      v_map1[d][x+","+y] = true;\r
+      if (done) {\r
+        // Front path ran over reverse path.\r
+        v_map2 = v_map2.slice(0, footsteps[footstep]+1);\r
+        var a = diff_path1(v_map1, text1.substring(0, x), text2.substring(0, y));\r
+        return a.concat(diff_path2(v_map2, text1.substring(x), text2.substring(y)));\r
+      }\r
+    }\r
+\r
+    // Walk the reverse path one step.\r
+    v_map2[d] = new Object();\r
+    for (var k=-d; k<=d; k+=2) {\r
+      if (k == -d || k != d && v2[k-1] < v2[k+1])\r
+        x = v2[k+1];\r
+      else\r
+        x = v2[k-1]+1;\r
+      y = x - k;\r
+      footstep = (text1.length-x)+","+(text2.length-y);\r
+      if (!front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined)))\r
+        done = true;\r
+      if (front)\r
+        footsteps[footstep] = d;\r
+      while (!done && x < text1.length && y < text2.length && text1.charAt(text1.length-x-1) == text2.charAt(text2.length-y-1)) {\r
+        x++; y++;\r
+        footstep = (text1.length-x)+","+(text2.length-y);\r
+        if (!front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined)))\r
+          done = true;\r
+        if (front)\r
+          footsteps[footstep] = d;\r
+      }\r
+      v2[k] = x;\r
+      v_map2[d][x+","+y] = true;\r
+      if (done) {\r
+        // Reverse path ran over front path.\r
+        v_map1 = v_map1.slice(0, footsteps[footstep]+1);\r
+        var a = diff_path1(v_map1, text1.substring(0, text1.length-x), text2.substring(0, text2.length-y));\r
+        return a.concat(diff_path2(v_map2, text1.substring(text1.length-x), text2.substring(text2.length-y)));\r
+      }\r
+    }\r
+  }\r
+  // Number of diffs equals number of characters, no commonality at all.\r
+  return null;\r
+}\r
+\r
+\r
+function diff_path1(v_map, text1, text2) {\r
+  // Work from the middle back to the start to determine the path.\r
+  var path = [];\r
+  var x = text1.length;\r
+  var y = text2.length;\r
+  var last_op = null;\r
+  for (var d=v_map.length-2; d>=0; d--) {\r
+    while(1) {\r
+      if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty((x-1)+","+y) : (v_map[d][(x-1)+","+y] !== undefined)) {\r
+        x--;\r
+        if (last_op === -1)\r
+          path[0][1] = text1.charAt(x) + path[0][1];\r
+        else\r
+          path.unshift([-1, text1.charAt(x)]);\r
+        last_op = -1;\r
+        break;\r
+      } else if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty(x+","+(y-1)) : (v_map[d][x+","+(y-1)] !== undefined)) {\r
+        y--;\r
+        if (last_op === 1)\r
+          path[0][1] = text2.charAt(y) + path[0][1];\r
+        else\r
+          path.unshift([1, text2.charAt(y)]);\r
+        last_op = 1;\r
+        break;\r
+      } else {\r
+        x--;\r
+        y--;\r
+        //if (text1.charAt(x) != text2.charAt(y))\r
+        //  return alert("No diagonal.  Can't happen. (diff_path1)");\r
+        if (last_op === 0)\r
+          path[0][1] = text1.charAt(x) + path[0][1];\r
+        else\r
+          path.unshift([0, text1.charAt(x)]);\r
+        last_op = 0;\r
+      }\r
+    }\r
+  }\r
+  return path;\r
+}\r
+\r
+\r
+function diff_path2(v_map, text1, text2) {\r
+  // Work from the middle back to the end to determine the path.\r
+  var path = [];\r
+  var x = text1.length;\r
+  var y = text2.length;\r
+  var last_op = null;\r
+  for (var d=v_map.length-2; d>=0; d--) {\r
+    while(1) {\r
+      if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty((x-1)+","+y) : (v_map[d][(x-1)+","+y] !== undefined)) {\r
+        x--;\r
+        if (last_op === -1)\r
+          path[path.length-1][1] += text1.charAt(text1.length-x-1);\r
+        else\r
+          path.push([-1, text1.charAt(text1.length-x-1)]);\r
+        last_op = -1;\r
+        break;\r
+      } else if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty(x+","+(y-1)) : (v_map[d][x+","+(y-1)] !== undefined)) {\r
+        y--;\r
+        if (last_op === 1)\r
+          path[path.length-1][1] += text2.charAt(text2.length-y-1);\r
+        else\r
+          path.push([1, text2.charAt(text2.length-y-1)]);\r
+        last_op = 1;\r
+        break;\r
+      } else {\r
+        x--;\r
+        y--;\r
+        //if (text1.charAt(text1.length-x-1) != text2.charAt(text2.length-y-1))\r
+        //  return alert("No diagonal.  Can't happen. (diff_path2)");\r
+        if (last_op === 0)\r
+          path[path.length-1][1] += text1.charAt(text1.length-x-1);\r
+        else\r
+          path.push([0, text1.charAt(text1.length-x-1)]);\r
+        last_op = 0;\r
+      }\r
+    }\r
+  }\r
+  return path;\r
+}\r
+\r
+\r
+function diff_prefix(text1, text2) {\r
+  // Trim off common prefix\r
+  var pointermin = 0;\r
+  var pointermax = Math.min(text1.length, text2.length);\r
+  var pointermid = pointermax;\r
+  while(pointermin < pointermid) {\r
+    if (text1.substring(0, pointermid) == text2.substring(0, pointermid))\r
+      pointermin = pointermid;\r
+    else\r
+      pointermax = pointermid;\r
+    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\r
+  }\r
+  var commonprefix = text1.substring(0, pointermid);\r
+  text1 = text1.substring(pointermid);\r
+  text2 = text2.substring(pointermid);\r
+  return [text1, text2, commonprefix];\r
+}\r
+\r
+\r
+function diff_suffix(text1, text2) {\r
+  // Trim off common suffix\r
+  var pointermin = 0;\r
+  var pointermax = Math.min(text1.length, text2.length);\r
+  var pointermid = pointermax;\r
+  while(pointermin < pointermid) {\r
+    if (text1.substring(text1.length-pointermid) == text2.substring(text2.length-pointermid))\r
+      pointermin = pointermid;\r
+    else\r
+      pointermax = pointermid;\r
+    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\r
+  }\r
+  var commonsuffix = text1.substring(text1.length-pointermid);\r
+  text1 = text1.substring(0, text1.length-pointermid);\r
+  text2 = text2.substring(0, text2.length-pointermid);\r
+  return [text1, text2, commonsuffix];\r
+}\r
+\r
+\r
+function diff_halfmatch(text1, text2) {\r
+  // Do the two texts share a substring which is at least half the length of the longer text?\r
+  var longtext = text1.length > text2.length ? text1 : text2;\r
+  var shorttext = text1.length > text2.length ? text2 : text1;\r
+  if (longtext.length < 10 || shorttext.length < 1)\r
+    return null; // Pointless.\r
+\r
+  function diff_halfmatch_i(longtext, shorttext, i) {\r
+    // Start with a 1/4 length substring at position i as a seed.\r
+    var seed = longtext.substring(i, i+Math.floor(longtext.length/4));\r
+    var j = -1;\r
+    var best_common = '';\r
+    var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;\r
+    while ((j = shorttext.indexOf(seed, j+1)) != -1) {\r
+      var my_prefix = diff_prefix(longtext.substring(i), shorttext.substring(j));\r
+      var my_suffix = diff_suffix(longtext.substring(0, i), shorttext.substring(0, j));\r
+      if (best_common.length < (my_suffix[2] + my_prefix[2]).length) {\r
+        best_common = my_suffix[2] + my_prefix[2];\r
+        best_longtext_a = my_suffix[0];\r
+        best_longtext_b = my_prefix[0];\r
+        best_shorttext_a = my_suffix[1];\r
+        best_shorttext_b = my_prefix[1];\r
+      }\r
+    }\r
+    if (best_common.length >= longtext.length/2)\r
+      return [best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b, best_common];\r
+    else\r
+      return null;\r
+  }\r
+\r
+  // First check if the second quarter is the seed for a half-match.\r
+  var hm1 = diff_halfmatch_i(longtext, shorttext, Math.ceil(longtext.length/4));\r
+  // Check again based on the third quarter.\r
+  var hm2 = diff_halfmatch_i(longtext, shorttext, Math.ceil(longtext.length/2));\r
+  var hm;\r
+  if (!hm1 && !hm2)\r
+    return null;\r
+  else if (!hm2)\r
+    hm = hm1;\r
+  else if (!hm1)\r
+    hm = hm2;\r
+  else // Both matched.  Select the longest.\r
+    hm = hm1[4].length > hm2[4].length ? hm1 : hm2;\r
+\r
+  // A half-match was found, sort out the return data.\r
+  if (text1.length > text2.length) {\r
+    var text1_a = hm[0];\r
+    var text1_b = hm[1];\r
+    var text2_a = hm[2];\r
+    var text2_b = hm[3];\r
+  } else {\r
+    var text2_a = hm[0];\r
+    var text2_b = hm[1];\r
+    var text1_a = hm[2];\r
+    var text1_b = hm[3];\r
+  }\r
+  var mid_common = hm[4];\r
+  return [text1_a, text1_b, text2_a, text2_b, mid_common];\r
+}\r
+\r
+\r
+function diff_cleanup_semantic(diff) {\r
+  // Reduce the number of edits by eliminating semantically trivial equalities.\r
+  var changes = false;\r
+  var equalities = []; // Stack of indices where equalities are found.\r
+  var lastequality = null; // Always equal to equalities[equalities.length-1][1]\r
+  var pointer = 0; // Index of current position.\r
+  var length_changes1 = 0; // Number of characters that changed prior to the equality.\r
+  var length_changes2 = 0; // Number of characters that changed after the equality.\r
+  while (pointer < diff.length) {\r
+    if (diff[pointer][0] == 0) { // equality found\r
+      equalities.push(pointer);\r
+      length_changes1 = length_changes2;\r
+      length_changes2 = 0;\r
+      lastequality = diff[pointer][1];\r
+    } else { // an insertion or deletion\r
+      length_changes2 += diff[pointer][1].length;\r
+      if (lastequality != null && (lastequality.length <= length_changes1) && (lastequality.length <= length_changes2)) {\r
+        //alert("Splitting: '"+lastequality+"'");\r
+        diff.splice(equalities[equalities.length-1], 0, [-1, lastequality]); // Duplicate record\r
+        diff[equalities[equalities.length-1]+1][0] = 1; // Change second copy to insert.\r
+        equalities.pop();  // Throw away the equality we just deleted;\r
+        equalities.pop();  // Throw away the previous equality;\r
+        pointer = equalities.length ? equalities[equalities.length-1] : -1;\r
+        length_changes1 = 0; // Reset the counters.\r
+        length_changes2 = 0;\r
+        lastequality = null;\r
+        changes = true;\r
+      }\r
+    }\r
+    pointer++;\r
+  }\r
+\r
+  if (changes)\r
+    diff_cleanup_merge(diff);\r
+}\r
+\r
+\r
+function diff_cleanup_efficiency(diff) {\r
+  // Reduce the number of edits by eliminating operationally trivial equalities.\r
+  var changes = false;\r
+  var equalities = []; // Stack of indices where equalities are found.\r
+  var lastequality = ''; // Always equal to equalities[equalities.length-1][1]\r
+  var pointer = 0; // Index of current position.\r
+  var pre_ins = false; // Is there an insertion operation before the last equality.\r
+  var pre_del = false; // Is there an deletion operation before the last equality.\r
+  var post_ins = false; // Is there an insertion operation after the last equality.\r
+  var post_del = false; // Is there an deletion operation after the last equality.\r
+  while (pointer < diff.length) {\r
+    if (diff[pointer][0] == 0) { // equality found\r
+      if (diff[pointer][1].length < DIFF_EDIT_COST && (post_ins || post_del)) {\r
+        // Candidate found.\r
+        equalities.push(pointer);\r
+        pre_ins = post_ins;\r
+        pre_del = post_del;\r
+        lastequality = diff[pointer][1];\r
+      } else {\r
+        // Not a candidate, and can never become one.\r
+        equalities = [];\r
+        lastequality = '';\r
+      }\r
+      post_ins = post_del = false;\r
+    } else { // an insertion or deletion\r
+      if (diff[pointer][0] == -1)\r
+        post_del = true;\r
+      else\r
+        post_ins = true;\r
+      // Five types to be split:\r
+      // <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\r
+      // <ins>A</ins>X<ins>C</ins><del>D</del>\r
+      // <ins>A</ins><del>B</del>X<ins>C</ins>\r
+      // <ins>A</del>X<ins>C</ins><del>D</del>\r
+      // <ins>A</ins><del>B</del>X<del>C</del>\r
+      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))) {\r
+        //alert("Splitting: '"+lastequality+"'");\r
+        diff.splice(equalities[equalities.length-1], 0, [-1, lastequality]); // Duplicate record\r
+        diff[equalities[equalities.length-1]+1][0] = 1; // Change second copy to insert.\r
+        equalities.pop();  // Throw away the equality we just deleted;\r
+        lastequality = '';\r
+        if (pre_ins && pre_del) {\r
+          // No changes made which could affect previous entry, keep going.\r
+          post_ins = post_del = true;\r
+          equalities = [];\r
+        } else {\r
+          equalities.pop();  // Throw away the previous equality;\r
+          pointer = equalities.length ? equalities[equalities.length-1] : -1;\r
+          post_ins = post_del = false;\r
+        }\r
+        changes = true;\r
+      }\r
+    }\r
+    pointer++;\r
+  }\r
+\r
+  if (changes)\r
+    diff_cleanup_merge(diff);\r
+}\r
+\r
+\r
+function diff_cleanup_merge(diff) {\r
+  // Reorder and merge like edit sections.  Merge equalities.\r
+  // Any edit section can move as long as it doesn't cross an equality.\r
+  diff.push([0, '']);  // Add a dummy entry at the end.\r
+  var pointer = 0;\r
+  var count_delete = 0;\r
+  var count_insert = 0;\r
+  var text_delete = '';\r
+  var text_insert = '';\r
+  var record_insert, record_delete;\r
+  var my_xfix;\r
+  while(pointer < diff.length) {\r
+    if (diff[pointer][0] == 1) {\r
+      count_insert++;\r
+      text_insert += diff[pointer][1];\r
+      pointer++;\r
+    } else if (diff[pointer][0] == -1) {\r
+      count_delete++;\r
+      text_delete += diff[pointer][1];\r
+      pointer++;\r
+    } else {  // Upon reaching an equality, check for prior redundancies.\r
+      if (count_delete > 1 || count_insert > 1) {\r
+        if (count_delete > 1 && count_insert > 1) {\r
+          // Factor out any common prefixies.\r
+          my_xfix = diff_prefix(text_insert, text_delete);\r
+          if (my_xfix[2] != '') {\r
+            if ((pointer - count_delete - count_insert) > 0 && diff[pointer - count_delete - count_insert - 1][0] == 0) {\r
+              text_insert = my_xfix[0];\r
+              text_delete = my_xfix[1];\r
+              diff[pointer - count_delete - count_insert - 1][1] += my_xfix[2];\r
+            }\r
+          }\r
+          // Factor out any common suffixies.\r
+          my_xfix = diff_suffix(text_insert, text_delete);\r
+          if (my_xfix[2] != '') {\r
+            text_insert = my_xfix[0];\r
+            text_delete = my_xfix[1];\r
+            diff[pointer][1] = my_xfix[2] + diff[pointer][1];\r
+          }\r
+        }\r
+        // Delete the offending records and add the merged ones.\r
+        if (count_delete == 0)\r
+          diff.splice(pointer - count_delete - count_insert, count_delete + count_insert, [1, text_insert]);\r
+        else if (count_insert == 0)\r
+          diff.splice(pointer - count_delete - count_insert, count_delete + count_insert, [-1, text_delete]);\r
+        else\r
+          diff.splice(pointer - count_delete - count_insert, count_delete + count_insert, [-1, text_delete], [1, text_insert]);\r
+        pointer = pointer - count_delete - count_insert + (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;\r
+      } else if (pointer != 0 && diff[pointer-1][0] == 0) {\r
+        // Merge this equality with the previous one.\r
+        diff[pointer-1][1] += diff[pointer][1];\r
+        diff.splice(pointer, 1);\r
+      } else {\r
+        pointer++;\r
+      }\r
+      count_insert = 0;\r
+      count_delete = 0;\r
+      text_delete = '';\r
+      text_insert = '';\r
+    }\r
+  }\r
+  if (diff[diff.length-1][1] == '')\r
+    diff.pop();  // Remove the dummy entry at the end.\r
+}\r
+\r
+\r
+function diff_addindex(diff) {\r
+  // Add an index to each tuple, represents where the tuple is located in text2.\r
+  // e.g. [[-1, 'h', 0], [1, 'c', 0], [0, 'at', 1]]\r
+  var i = 0;\r
+  for (var x=0; x<diff.length; x++) {\r
+    diff[x].push(i);\r
+    if (diff[x][0] != -1)\r
+      i += diff[x][1].length;\r
+  }\r
+}\r
+\r
+\r
+function diff_xindex(diff, loc) {\r
+  // loc is a location in text1, compute and return the equivalent location in text2.\r
+  // e.g. "The cat" vs "The big cat", 1->1, 5->8\r
+  var chars1 = 0;\r
+  var chars2 = 0;\r
+  var last_chars1 = 0;\r
+  var last_chars2 = 0;\r
+  for (var x=0; x<diff.length; x++) {\r
+    if (diff[x][0] != 1) // Equality or deletion.\r
+      chars1 += diff[x][1].length;\r
+    if (diff[x][0] != -1) // Equality or insertion.\r
+      chars2 += diff[x][1].length;\r
+    if (chars1 > loc) // Overshot the location.\r
+      break;\r
+    last_chars1 = chars1;\r
+    last_chars2 = chars2;\r
+  }\r
+  if (diff.length != x && diff[x][0] == -1) // The location was deleted.\r
+    return last_chars2;\r
+  // Add the remaining character length.\r
+  return last_chars2 + (loc - last_chars1);\r
+}\r
+\r
+\r
+function diff_prettyhtml(diff) {\r
+  // Convert a diff array into a pretty HTML report.\r
+  diff_addindex(diff);\r
+  var html = '';\r
+  for (var x=0; x<diff.length; x++) {\r
+    var m = diff[x][0]; // Mode (-1=delete, 0=copy, 1=add)\r
+    var t = diff[x][1]; // Text of change.\r
+    var i = diff[x][2]; // Index of change.\r
+    t = t.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");\r
+    t = t.replace(/\n/g, "&para;<BR>");\r
+    if (m == -1)\r
+      html += "<DEL STYLE='background:#FFE6E6;' TITLE='i="+i+"'>"+t+"</DEL>";\r
+    else if (m == 1)\r
+      html += "<INS STYLE='background:#E6FFE6;' TITLE='i="+i+"'>"+t+"</INS>";\r
+    else\r
+      html += "<SPAN TITLE='i="+i+"'>"+t+"</SPAN>";\r
+  }\r
+  return html;\r
+}\r
+\r
+\r
+  //////////////////////////////////////////////////////////////////////\r
+ //  Match                                                           //\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+\r
+function match_getmaxbits() {\r
+  // Compute the number of bits in an int.\r
+  // The normal answer for JavaScript is 32.\r
+  var maxbits = 0;\r
+  var oldi = 1;\r
+  var newi = 2;\r
+  while (oldi != newi) {\r
+    maxbits++;\r
+    oldi = newi;\r
+    newi = newi << 1;\r
+  }\r
+  return maxbits;\r
+}\r
+var MATCH_MAXBITS = match_getmaxbits();\r
+\r
+\r
+function match_main(text, pattern, loc) {\r
+  // Locate the best instance of 'pattern' in 'text' near 'loc'.\r
+  loc = Math.max(0, Math.min(loc, text.length-pattern.length));\r
+  if (text == pattern) {\r
+    // Shortcut (potentially not guaranteed by the algorithm)\r
+    return 0;\r
+  } else if (text.length == 0) {\r
+    // Nothing to match.\r
+    return null;\r
+  } else if (text.substring(loc, loc + pattern.length) == pattern) {\r
+    // Perfect match at the perfect spot!  (Includes case of null pattern)\r
+    return loc;\r
+  } else {\r
+    // Do a fuzzy compare.\r
+    var match = match_bitap(text, pattern, loc);\r
+    return match;\r
+  }\r
+}\r
+\r
+\r
+function match_bitap(text, pattern, loc) {\r
+  // Locate the best instance of 'pattern' in 'text' near 'loc' using the Bitap algorithm.\r
+  if (pattern.length > MATCH_MAXBITS)\r
+    return alert("Pattern too long for this browser.");\r
+\r
+  // Initialise the alphabet.\r
+  var s = match_alphabet(pattern);\r
+\r
+  var score_text_length = text.length;\r
+  // Coerce the text length between reasonable maximums and minimums.\r
+  score_text_length = Math.max(score_text_length, MATCH_MINLENGTH);\r
+  score_text_length = Math.min(score_text_length, MATCH_MAXLENGTH);\r
+\r
+  function match_bitap_score (e, x) {\r
+    // Compute and return the score for a match with e errors and x location.\r
+    var d = Math.abs(loc-x);\r
+    return (e / pattern.length / MATCH_BALANCE) + (d / score_text_length / (1.0 - MATCH_BALANCE));\r
+  }\r
+\r
+  // Highest score beyond which we give up.\r
+  var score_threshold = MATCH_THRESHOLD;\r
+  // Is there a nearby exact match? (speedup)\r
+  var best_loc = text.indexOf(pattern, loc);\r
+  if (best_loc != -1)\r
+    score_threshold = Math.min(match_bitap_score(0, best_loc), score_threshold);\r
+  // What about in the other direction? (speedup)\r
+  best_loc = text.lastIndexOf(pattern, loc+pattern.length);\r
+  if (best_loc != -1)\r
+    score_threshold = Math.min(match_bitap_score(0, best_loc), score_threshold);\r
+\r
+  // Initialise the bit arrays.\r
+  var r = Array();\r
+  var d = -1;\r
+  var matchmask = Math.pow(2, pattern.length-1);\r
+  best_loc = null;\r
+\r
+  var bin_min, bin_mid;\r
+  var bin_max = Math.max(loc+loc, text.length);\r
+  var last_rd;\r
+  for (var d=0; d<pattern.length; d++) {\r
+    // Scan for the best match; each iteration allows for one more error.\r
+    var rd = Array(text.length);\r
+\r
+    // Run a binary search to determine how far from 'loc' we can stray at this error level.\r
+    bin_min = loc;\r
+    bin_mid = bin_max;\r
+    while(bin_min < bin_mid) {\r
+      if (match_bitap_score(d, bin_mid) < score_threshold)\r
+        bin_min = bin_mid;\r
+      else\r
+        bin_max = bin_mid;\r
+      bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);\r
+    }\r
+    bin_max = bin_mid; // Use the result from this iteration as the maximum for the next.\r
+    var start = Math.max(0, loc - (bin_mid - loc) - 1);\r
+    var finish = Math.min(text.length-1, pattern.length + bin_mid);\r
+\r
+    if (text.charAt(finish) == pattern.charAt(pattern.length-1))\r
+      rd[finish] = Math.pow(2, d+1)-1;\r
+    else\r
+      rd[finish] = Math.pow(2, d)-1;\r
+    for (var j=finish-1; j>=start; j--) {\r
+      // The alphabet (s) is a sparse hash, so the following lines generate warnings.\r
+      if (d == 0) // First pass: exact match.\r
+        rd[j] = ((rd[j+1] << 1) | 1) & s[text.charAt(j)];\r
+      else // Subsequent passes: fuzzy match.\r
+        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];\r
+      if (rd[j] & matchmask) {\r
+        var score = match_bitap_score(d, j);\r
+        // This match will almost certainly be better than any existing match.  But check anyway.\r
+        if (score <= score_threshold) {\r
+          // Told you so.\r
+          score_threshold = score;\r
+          best_loc = j;\r
+          if (j > loc) {\r
+            // When passing loc, don't exceed our current distance from loc.\r
+            start = Math.max(0, loc - (j - loc));\r
+          } else {\r
+            // Already passed loc, downhill from here on in.\r
+            break;\r
+          }\r
+        }\r
+      }\r
+    }\r
+    if (match_bitap_score(d+1, loc) > score_threshold) // No hope for a (better) match at greater error levels.\r
+      break;\r
+    last_rd = rd;\r
+  }\r
+  return best_loc;\r
+}\r
+\r
+\r
+function match_alphabet(pattern) {\r
+  // Initialise the alphabet for the Bitap algorithm.\r
+  var s = Object();\r
+  for (var i=0; i<pattern.length; i++)\r
+    s[pattern.charAt(i)] = 0;\r
+  for (var i=0; i<pattern.length; i++)\r
+    s[pattern.charAt(i)] |= Math.pow(2, pattern.length-i-1);\r
+  return s;\r
+}\r
+\r
+\r
+  //////////////////////////////////////////////////////////////////////\r
+ //  Patch                                                           //\r
+//////////////////////////////////////////////////////////////////////\r
+\r
+\r
+function patch_obj() {\r
+  // Constructor for a patch object.\r
+  this.diffs = [];\r
+  this.start1 = null;\r
+  this.start2 = null;\r
+  this.length1 = 0;\r
+  this.length2 = 0;\r
+\r
+  this.toString = function() {\r
+    // Emmulate GNU diff's format.\r
+    // Header: @@ -382,8 +481,9 @@\r
+    // Indicies are printed as 1-based, not 0-based.\r
+    var coords1, coords2;\r
+    if (this.length1 == 0)\r
+      coords1 = this.start1+",0";\r
+    else if (this.length1 == 1)\r
+      coords1 = this.start1+1;\r
+    else\r
+      coords1 = (this.start1+1)+","+this.length1;\r
+    if (this.length2 == 0)\r
+      coords2 = this.start2+",0";\r
+    else if (this.length2 == 1)\r
+      coords2 = this.start2+1;\r
+    else\r
+      coords2 = (this.start2+1)+","+this.length2;\r
+    var txt = "@@ -"+coords1+" +"+coords2+" @@\n";\r
+    // Escape the body of the patch with %xx notation.\r
+    for (var x=0; x<this.diffs.length; x++)\r
+      txt += ("- +".charAt(this.diffs[x][0]+1)) + encodeURI(this.diffs[x][1]) + "\n";\r
+    return txt.replace(/%20/g, ' ');\r
+  }\r
+\r
+  this.text1 = function() {\r
+    // Compute and return the source text (all equalities and deletions).\r
+    var txt = '';\r
+    for (var x=0; x<this.diffs.length; x++)\r
+      if (this.diffs[x][0] == 0 || this.diffs[x][0] == -1)\r
+        txt += this.diffs[x][1];\r
+    return txt;\r
+  }\r
+\r
+  this.text2 = function() {\r
+    // Compute and return the destination text (all equalities and insertions).\r
+    var txt = '';\r
+    for (var x=0; x<this.diffs.length; x++)\r
+      if (this.diffs[x][0] == 0 || this.diffs[x][0] == 1)\r
+        txt += this.diffs[x][1];\r
+    return txt;\r
+  }\r
+}\r
+\r
+\r
+function patch_addcontext(patch, text) {\r
+  var pattern = text.substring(patch.start2, patch.start2+patch.length1);\r
+  var padding = 0;\r
+  // Increase the context until we're unique (but don't let the pattern expand beyond MATCH_MAXBITS).\r
+  while (text.indexOf(pattern) != text.lastIndexOf(pattern) && pattern.length < MATCH_MAXBITS-PATCH_MARGIN-PATCH_MARGIN) {\r
+    padding += PATCH_MARGIN;\r
+    pattern = text.substring(patch.start2 - padding, patch.start2+patch.length1 + padding);\r
+  }\r
+  // Add one chunk for good luck.\r
+  padding += PATCH_MARGIN;\r
+  // Add the prefix.\r
+  var prefix = text.substring(patch.start2 - padding, patch.start2);\r
+  if (prefix != '')\r
+    patch.diffs.unshift([0, prefix]);\r
+  // Add the suffix\r
+  var suffix = text.substring(patch.start2+patch.length1, patch.start2+patch.length1 + padding);\r
+  if (suffix != '')\r
+    patch.diffs.push([0, suffix]);\r
+\r
+  // Roll back the start points.\r
+  patch.start1 -= prefix.length;\r
+  patch.start2 -= prefix.length;\r
+  // Extend the lengths.\r
+  patch.length1 += prefix.length + suffix.length;\r
+  patch.length2 += prefix.length + suffix.length;\r
+}\r
+\r
+\r
+function patch_make(text1, text2, diff) {\r
+  // Compute a list of patches to turn text1 into text2.\r
+  // Use diff if provided, otherwise compute it ourselves.\r
+  if (typeof diff == 'undefined') {\r
+    diff = diff_main(text1, text2, true);\r
+    if (diff.length > 2) {\r
+      diff_cleanup_semantic(diff);\r
+      diff_cleanup_efficiency(diff);\r
+    }\r
+  }\r
+  if (diff.length == 0)\r
+    return []; // Get rid of the null case.\r
+  var patches = [];\r
+  var patch = new patch_obj();\r
+  var char_count1 = 0; // Number of characters into the text1 string.\r
+  var char_count2 = 0; // Number of characters into the text2 string.\r
+  var last_type = null;\r
+  var prepatch_text = text1; // Recreate the patches to determine context info.\r
+  var postpatch_text = text1;\r
+  for (var x=0; x<diff.length; x++) {\r
+    var diff_type = diff[x][0];\r
+    var diff_text = diff[x][1];\r
+\r
+    if (patch.diffs.length == 0 && diff_type != 0) {\r
+      // A new patch starts here.\r
+      patch.start1 = char_count1;\r
+      patch.start2 = char_count2;\r
+    }\r
+\r
+    if (diff_type == 1) {\r
+      // Insertion\r
+      patch.diffs.push(diff[x]);\r
+      patch.length2 += diff_text.length;\r
+      postpatch_text = postpatch_text.substring(0, char_count2) + diff_text + postpatch_text.substring(char_count2);\r
+    } else if (diff_type == -1) {\r
+      // Deletion.\r
+      patch.length1 += diff_text.length;\r
+      patch.diffs.push(diff[x]);\r
+      postpatch_text = postpatch_text.substring(0, char_count2) + postpatch_text.substring(char_count2 + diff_text.length);\r
+    } else if (diff_type == 0 && diff_text.length <= 2*PATCH_MARGIN && patch.diffs.length != 0 && diff.length != x+1) {\r
+      // Small equality inside a patch.\r
+      patch.diffs.push(diff[x]);\r
+      patch.length1 += diff_text.length;\r
+      patch.length2 += diff_text.length;\r
+    }\r
+\r
+    last_type = diff_type;\r
+    if (diff_type == 0 && diff_text.length >= 2*PATCH_MARGIN) {\r
+      // Time for a new patch.\r
+      if (patch.diffs.length != 0) {\r
+        patch_addcontext(patch, prepatch_text);\r
+        patches.push(patch);\r
+        var patch = new patch_obj();\r
+        last_type = null;\r
+        prepatch_text = postpatch_text;\r
+      }\r
+    }\r
+\r
+    // Update the current character count.\r
+    if (diff_type != 1)\r
+      char_count1 += diff_text.length;\r
+    if (diff_type != -1)\r
+      char_count2 += diff_text.length;\r
+  }\r
+  // Pick up the leftover patch if not empty.\r
+  if (patch.diffs.length != 0) {\r
+    patch_addcontext(patch, prepatch_text);\r
+    patches.push(patch);\r
+  }\r
+\r
+  return patches;\r
+}\r
+\r
+\r
+function patch_apply(patches, text) {\r
+  // Merge a set of patches onto the text.\r
+  // Return a patched text, as well as a list of true/false values indicating which patches were applied.\r
+  patch_splitmax(patches);\r
+  var results = [];\r
+  var delta = 0;\r
+  var expected_loc, start_loc;\r
+  var text1, text2;\r
+  var diff, mod, index1, index2;\r
+  for (var x=0; x<patches.length; x++) {\r
+    expected_loc = patches[x].start2 + delta;\r
+    text1 = patches[x].text1();\r
+    start_loc = match_main(text, text1, expected_loc);\r
+    if (start_loc == null) {\r
+      // No match found.  :(\r
+      results.push(false);\r
+    } else {\r
+      // Found a match.  :)\r
+      results.push(true);\r
+      delta = start_loc - expected_loc;\r
+      text2 = text.substring(start_loc, start_loc + text1.length);\r
+      if (text1 == text2) {\r
+        // Perfect match, just shove the replacement text in.\r
+        text = text.substring(0, start_loc) + patches[x].text2() + text.substring(start_loc + text1.length);\r
+      } else {\r
+        // Imperfect match.  Run a diff to get a framework of equivalent indicies.\r
+        diff = diff_main(text1, text2, false);\r
+        index1 = 0;\r
+        for (var y=0; y<patches[x].diffs.length; y++) {\r
+          mod = patches[x].diffs[y];\r
+          if (mod[0] != 0)\r
+            index2 = diff_xindex(diff, index1);\r
+          if (mod[0] == 1) // Insertion\r
+            text = text.substring(0, start_loc + index2) + mod[1] + text.substring(start_loc + index2);\r
+          else if (mod[0] == -1) // Deletion\r
+            text = text.substring(0, start_loc + index2) + text.substring(start_loc + diff_xindex(diff, index1 + mod[1].length));\r
+          if (mod[0] != -1)\r
+            index1 += mod[1].length;\r
+        }\r
+      }\r
+    }\r
+  }\r
+  return [text, results];\r
+}\r
+\r
+\r
+function patch_splitmax(patches) {\r
+  // Look through the patches and break up any which are longer than the maximum limit of the match algorithm.\r
+  var bigpatch, patch, patch_size, start1, start2, diff_type, diff_text, precontext, postcontext, empty;\r
+  for (var x=0; x<patches.length; x++) {\r
+    if (patches[x].length1 > MATCH_MAXBITS) {\r
+      bigpatch = patches[x];\r
+      // Remove the big old patch.\r
+      patches.splice(x, 1);\r
+      patch_size = MATCH_MAXBITS;\r
+      start1 = bigpatch.start1;\r
+      start2 = bigpatch.start2;\r
+      precontext = '';\r
+      while (bigpatch.diffs.length != 0) {\r
+        // Create one of several smaller patches.\r
+        patch = new patch_obj();\r
+        empty = true;\r
+        patch.start1 = start1 - precontext.length;\r
+        patch.start2 = start2 - precontext.length;\r
+        if (precontext  != '') {\r
+          patch.length1 = patch.length2 = precontext.length;\r
+          patch.diffs.push([0, precontext]);\r
+        }\r
+        while (bigpatch.diffs.length != 0 && patch.length1 < patch_size - PATCH_MARGIN) {\r
+          diff_type = bigpatch.diffs[0][0];\r
+          diff_text = bigpatch.diffs[0][1];\r
+          if (diff_type == 1) {\r
+            // Insertions are harmless.\r
+            patch.length2 += diff_text.length;\r
+            start2 += diff_text.length;\r
+            patch.diffs.push(bigpatch.diffs.shift());\r
+            empty = false;\r
+          } else {\r
+            // Deletion or equality.  Only take as much as we can stomach.\r
+            diff_text = diff_text.substring(0, patch_size - patch.length1 - PATCH_MARGIN);\r
+            patch.length1 += diff_text.length;\r
+            start1 += diff_text.length;\r
+            if (diff_type == 0) {\r
+              patch.length2 += diff_text.length;\r
+              start2 += diff_text.length;\r
+            } else {\r
+              empty = false;\r
+            }\r
+            patch.diffs.push([diff_type, diff_text]);\r
+            if (diff_text == bigpatch.diffs[0][1])\r
+              bigpatch.diffs.shift();\r
+            else\r
+              bigpatch.diffs[0][1] = bigpatch.diffs[0][1].substring(diff_text.length);\r
+          }\r
+        }\r
+        // Compute the head context for the next patch.\r
+        precontext = patch.text2();\r
+        precontext = precontext.substring(precontext.length - PATCH_MARGIN);\r
+        // Append the end context for this patch.\r
+        postcontext = bigpatch.text1().substring(0, PATCH_MARGIN);\r
+        if (postcontext  != '') {\r
+          patch.length1 += postcontext.length;\r
+          patch.length2 += postcontext.length;\r
+          if (patch.diffs.length > 0 && patch.diffs[patch.diffs.length-1][0] == 0)\r
+            patch.diffs[patch.diffs.length-1][1] += postcontext;\r
+          else\r
+            patch.diffs.push([0, postcontext]);\r
+        }\r
+        if (!empty)\r
+          patches.splice(x++, 0, patch);\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+\r
+function patch_totext(patches) {\r
+  // Take a list of patches and return a textual representation.\r
+  var text = '';\r
+  for (var x=0; x<patches.length; x++)\r
+    text += patches[x];\r
+  return text;\r
+}\r
+\r
+\r
+function patch_fromtext(text) {\r
+  // Take a textual representation of patches and return a list of patch objects.\r
+  var patches = [];\r
+  text = text.split('\n');\r
+  var patch, m, chars1, chars2, sign, line;\r
+  while (text.length != 0) {\r
+    m = text[0].match(/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/);\r
+    if (!m)\r
+      return alert("Invalid patch string:\n"+text[0]);\r
+    patch = new patch_obj();\r
+    patches.push(patch);\r
+    patch.start1 = parseInt(m[1]);\r
+    if (m[2] == '') {\r
+      patch.start1--;\r
+      patch.length1 = 1;\r
+    } else if (m[2] == '0') {\r
+      patch.length1 = 0;\r
+    } else {\r
+      patch.start1--;\r
+      patch.length1 = parseInt(m[2]);\r
+    }\r
+\r
+    patch.start2 = parseInt(m[3]);\r
+    if (m[4] == '') {\r
+      patch.start2--;\r
+      patch.length2 = 1;\r
+    } else if (m[4] == '0') {\r
+      patch.length2 = 0;\r
+    } else {\r
+      patch.start2--;\r
+      patch.length2 = parseInt(m[4]);\r
+    }\r
+    text.shift();\r
+\r
+    while (text.length != 0) {\r
+      sign = text[0].charAt(0);\r
+      line = decodeURIComponent(text[0].substring(1));\r
+      if (sign == '-') {\r
+        // Deletion.\r
+        patch.diffs.push([-1, line]);\r
+      } else if (sign == '+') {\r
+        // Insertion.\r
+        patch.diffs.push([1, line]);\r
+      } else if (sign == ' ') {\r
+        // Minor equality.\r
+        patch.diffs.push([0, line]);\r
+      } else if (sign == '@') {\r
+        // Start of next patch.\r
+        break;\r
+      } else if (sign == '') {\r
+        // Blank line?  Whatever.\r
+      } else {\r
+        // WTF?\r
+        return alert("Invalid patch mode: '"+sign+"'\n"+line);\r
+      }\r
+      text.shift();\r
+    }\r
+  }\r
+  return patches;\r
+}\r
+\r
+// EOF\r
diff --git a/media/tiny_mce/plugins/devkit/langs/en.js b/media/tiny_mce/plugins/devkit/langs/en.js
new file mode 100755 (executable)
index 0000000..44356cf
--- /dev/null
@@ -0,0 +1,23 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('devkit',{\r
+title : 'TinyMCE Development Kit',\r
+info_tab : 'Info',\r
+settings_tab : 'Settings',\r
+log_tab : 'Log',\r
+content_tab : 'Content',\r
+command_states_tab : 'Commands',\r
+undo_redo_tab : 'Undo/Redo',\r
+misc_tab : 'Misc',\r
+filter : 'Filter:',\r
+clear_log : 'Clear log',\r
+refresh : 'Refresh',\r
+info_help : 'Press Refresh to view info.',\r
+settings_help : 'Press Refresh to display the settings array for each TinyMCE_Control instance.',\r
+content_help : 'Press Refresh to display the raw and cleaned HTML content for each TinyMCE_Control instance.',\r
+command_states_help : 'Press Refresh to display the current command states from inst.queryCommandState. This list will also mark unsupported commands.',\r
+undo_redo_help : 'Press Refresh to display the global and instance undo/redo levels.',\r
+misc_help : 'Here are various tools for debugging and development purposes.',\r
+debug_events : 'Debug events',\r
+undo_diff : 'Diff undo levels'\r
+});\r
diff --git a/media/tiny_mce/plugins/directionality/editor_plugin.js b/media/tiny_mce/plugins/directionality/editor_plugin.js
new file mode 100755 (executable)
index 0000000..d3cc5cd
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('directionality');var TinyMCE_DirectionalityPlugin={getInfo:function(){return{longname:'Directionality',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"ltr":return tinyMCE.getButtonHTML(cn,'lang_directionality_ltr_desc','{$pluginurl}/images/ltr.gif','mceDirectionLTR');case"rtl":return tinyMCE.getButtonHTML(cn,'lang_directionality_rtl_desc','{$pluginurl}/images/rtl.gif','mceDirectionRTL')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceDirectionLTR":var inst=tinyMCE.getInstanceById(editor_id);var elm=tinyMCE.getParentElement(inst.getFocusElement(),"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(elm)elm.setAttribute("dir","ltr");tinyMCE.triggerNodeChange(false);return true;case"mceDirectionRTL":var inst=tinyMCE.getInstanceById(editor_id);var elm=tinyMCE.getParentElement(inst.getFocusElement(),"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(elm)elm.setAttribute("dir","rtl");tinyMCE.triggerNodeChange(false);return true}return false},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):""}if(node==null)return;var elm=tinyMCE.getParentElement(node,"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(!elm){tinyMCE.switchClass(editor_id+'_ltr','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_rtl','mceButtonDisabled');return true}tinyMCE.switchClass(editor_id+'_ltr','mceButtonNormal');tinyMCE.switchClass(editor_id+'_rtl','mceButtonNormal');var dir=getAttrib(elm,"dir");if(dir=="ltr"||dir=="")tinyMCE.switchClass(editor_id+'_ltr','mceButtonSelected');else tinyMCE.switchClass(editor_id+'_rtl','mceButtonSelected');return true}};tinyMCE.addPlugin("directionality",TinyMCE_DirectionalityPlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/directionality/editor_plugin_src.js b/media/tiny_mce/plugins/directionality/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..eb106f1
--- /dev/null
@@ -0,0 +1,90 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('directionality');\r
+\r
+var TinyMCE_DirectionalityPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Directionality',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "ltr":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_directionality_ltr_desc', '{$pluginurl}/images/ltr.gif', 'mceDirectionLTR');\r
+\r
+                       case "rtl":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_directionality_rtl_desc', '{$pluginurl}/images/rtl.gif', 'mceDirectionRTL');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceDirectionLTR":\r
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+                               var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");\r
+\r
+                               if (elm)\r
+                                       elm.setAttribute("dir", "ltr");\r
+\r
+                               tinyMCE.triggerNodeChange(false);\r
+                               return true;\r
+\r
+                       case "mceDirectionRTL":\r
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+                               var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");\r
+\r
+                               if (elm)\r
+                                       elm.setAttribute("dir", "rtl");\r
+\r
+                               tinyMCE.triggerNodeChange(false);\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               function getAttrib(elm, name) {\r
+                       return elm.getAttribute(name) ? elm.getAttribute(name) : "";\r
+               }\r
+\r
+               if (node == null)\r
+                       return;\r
+\r
+               var elm = tinyMCE.getParentElement(node, "p,div,td,h1,h2,h3,h4,h5,h6,pre,address");\r
+               if (!elm) {\r
+                       tinyMCE.switchClass(editor_id + '_ltr', 'mceButtonDisabled');\r
+                       tinyMCE.switchClass(editor_id + '_rtl', 'mceButtonDisabled');\r
+                       return true;\r
+               }\r
+\r
+               tinyMCE.switchClass(editor_id + '_ltr', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_rtl', 'mceButtonNormal');\r
+\r
+               var dir = getAttrib(elm, "dir");\r
+               if (dir == "ltr" || dir == "")\r
+                       tinyMCE.switchClass(editor_id + '_ltr', 'mceButtonSelected');\r
+               else\r
+                       tinyMCE.switchClass(editor_id + '_rtl', 'mceButtonSelected');\r
+\r
+               return true;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("directionality", TinyMCE_DirectionalityPlugin);\r
diff --git a/media/tiny_mce/plugins/directionality/images/ltr.gif b/media/tiny_mce/plugins/directionality/images/ltr.gif
new file mode 100755 (executable)
index 0000000..ac8f30c
Binary files /dev/null and b/media/tiny_mce/plugins/directionality/images/ltr.gif differ
diff --git a/media/tiny_mce/plugins/directionality/images/rtl.gif b/media/tiny_mce/plugins/directionality/images/rtl.gif
new file mode 100755 (executable)
index 0000000..0348f99
Binary files /dev/null and b/media/tiny_mce/plugins/directionality/images/rtl.gif differ
diff --git a/media/tiny_mce/plugins/directionality/langs/en.js b/media/tiny_mce/plugins/directionality/langs/en.js
new file mode 100755 (executable)
index 0000000..a1db297
--- /dev/null
@@ -0,0 +1,6 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+directionality_ltr_desc : 'Direction left to right',\r
+directionality_rtl_desc : 'Direction right to left'\r
+});\r
diff --git a/media/tiny_mce/plugins/directionality/readme.txt b/media/tiny_mce/plugins/directionality/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/emotions/editor_plugin.js b/media/tiny_mce/plugins/emotions/editor_plugin.js
new file mode 100755 (executable)
index 0000000..4d81e5a
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions',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']=250;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/media/tiny_mce/plugins/emotions/editor_plugin_src.js b/media/tiny_mce/plugins/emotions/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..c7d60cf
--- /dev/null
@@ -0,0 +1,63 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('emotions');\r
+\r
+// Plucin static class\r
+var TinyMCE_EmotionsPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Emotions',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       /**\r
+        * Returns the HTML contents of the emotions control.\r
+        */\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "emotions":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_emotions_desc', '{$pluginurl}/images/emotions.gif', 'mceEmotion');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes the mceEmotion command.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceEmotion":\r
+                               var template = new Array();\r
+\r
+                               template['file'] = '../../plugins/emotions/emotions.htm'; // Relative to theme\r
+                               template['width'] = 250;\r
+                               template['height'] = 160;\r
+\r
+                               // Language specific width and height addons\r
+                               template['width'] += tinyMCE.getLang('lang_emotions_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_emotions_delta_height', 0);\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       }\r
+};\r
+\r
+// Register plugin\r
+tinyMCE.addPlugin('emotions', TinyMCE_EmotionsPlugin);\r
diff --git a/media/tiny_mce/plugins/emotions/emotions.htm b/media/tiny_mce/plugins/emotions/emotions.htm
new file mode 100755 (executable)
index 0000000..fca8ffa
--- /dev/null
@@ -0,0 +1,40 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_emotions_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/functions.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <div align="center">\r
+               <div class="title">{$lang_emotions_title}:<br /><br /></div>\r
+\r
+               <table border="0" cellspacing="0" cellpadding="4">\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-cool.gif','lang_emotions_cool');"><img src="images/smiley-cool.gif" width="18" height="18" border="0" alt="{$lang_emotions_cool}" title="{$lang_emotions_cool}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-cry.gif','lang_emotions_cry');"><img src="images/smiley-cry.gif" width="18" height="18" border="0" alt="{$lang_emotions_cry}" title="{$lang_emotions_cry}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-embarassed.gif','lang_emotions_embarassed');"><img src="images/smiley-embarassed.gif" width="18" height="18" border="0" alt="{$lang_emotions_embarassed}" title="{$lang_emotions_embarassed}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-foot-in-mouth.gif','lang_emotions_foot_in_mouth');"><img src="images/smiley-foot-in-mouth.gif" width="18" height="18" border="0" alt="{$lang_emotions_foot_in_mouth}" title="{$lang_emotions_foot_in_mouth}" /></a></td>\r
+                 </tr>\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-frown.gif','lang_emotions_frown');"><img src="images/smiley-frown.gif" width="18" height="18" border="0" alt="{$lang_emotions_frown}" title="{$lang_emotions_frown}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-innocent.gif','lang_emotions_innocent');"><img src="images/smiley-innocent.gif" width="18" height="18" border="0" alt="{$lang_emotions_innocent}" title="{$lang_emotions_innocent}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-kiss.gif','lang_emotions_kiss');"><img src="images/smiley-kiss.gif" width="18" height="18" border="0" alt="{$lang_emotions_kiss}" title="{$lang_emotions_kiss}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-laughing.gif','lang_emotions_laughing');"><img src="images/smiley-laughing.gif" width="18" height="18" border="0" alt="{$lang_emotions_laughing}" title="{$lang_emotions_laughing}" /></a></td>\r
+                 </tr>\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-money-mouth.gif','lang_emotions_money_mouth');"><img src="images/smiley-money-mouth.gif" width="18" height="18" border="0" alt="{$lang_emotions_money_mouth}" title="{$lang_emotions_money_mouth}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-sealed.gif','lang_emotions_sealed');"><img src="images/smiley-sealed.gif" width="18" height="18" border="0" alt="{$lang_emotions_sealed}" title="{$lang_emotions_sealed}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-smile.gif','lang_emotions_smile');"><img src="images/smiley-smile.gif" width="18" height="18" border="0" alt="{$lang_emotions_smile}" title="{$lang_emotions_smile}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-surprised.gif','lang_emotions_surprised');"><img src="images/smiley-surprised.gif" width="18" height="18" border="0" alt="{$lang_emotions_surprised}" title="{$lang_emotions_surprised}" /></a></td>\r
+                 </tr>\r
+                 <tr>\r
+                       <td><a href="javascript:insertEmotion('smiley-tongue-out.gif','lang_emotions_tongue_out');"><img src="images/smiley-tongue-out.gif" width="18" height="18" border="0" alt="{$lang_emotions_tongue-out}" title="{$lang_emotions_tongue_out}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-undecided.gif','lang_emotions_undecided');"><img src="images/smiley-undecided.gif" width="18" height="18" border="0" alt="{$lang_emotions_undecided}" title="{$lang_emotions_undecided}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-wink.gif','lang_emotions_wink');"><img src="images/smiley-wink.gif" width="18" height="18" border="0" alt="{$lang_emotions_wink}" title="{$lang_emotions_wink}" /></a></td>\r
+                       <td><a href="javascript:insertEmotion('smiley-yell.gif','lang_emotions_yell');"><img src="images/smiley-yell.gif" width="18" height="18" border="0" alt="{$lang_emotions_yell}" title="{$lang_emotions_yell}" /></a></td>\r
+                 </tr>\r
+               </table>\r
+       </div>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/emotions/images/emotions.gif b/media/tiny_mce/plugins/emotions/images/emotions.gif
new file mode 100755 (executable)
index 0000000..a39ed8e
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/emotions.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/readme.txt b/media/tiny_mce/plugins/emotions/images/readme.txt
new file mode 100755 (executable)
index 0000000..a3cea1b
--- /dev/null
@@ -0,0 +1,2 @@
+These emotions where taken from Mozilla Thunderbird.\r
+I hope they don't get angry if I use them here after all this is a open source project aswell.\r
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-cool.gif b/media/tiny_mce/plugins/emotions/images/smiley-cool.gif
new file mode 100755 (executable)
index 0000000..ba90cc3
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-cool.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-cry.gif b/media/tiny_mce/plugins/emotions/images/smiley-cry.gif
new file mode 100755 (executable)
index 0000000..74d897a
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-cry.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-embarassed.gif b/media/tiny_mce/plugins/emotions/images/smiley-embarassed.gif
new file mode 100755 (executable)
index 0000000..963a96b
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-embarassed.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif b/media/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif
new file mode 100755 (executable)
index 0000000..16f68cc
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-frown.gif b/media/tiny_mce/plugins/emotions/images/smiley-frown.gif
new file mode 100755 (executable)
index 0000000..716f55e
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-frown.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-innocent.gif b/media/tiny_mce/plugins/emotions/images/smiley-innocent.gif
new file mode 100755 (executable)
index 0000000..334d49e
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-innocent.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-kiss.gif b/media/tiny_mce/plugins/emotions/images/smiley-kiss.gif
new file mode 100755 (executable)
index 0000000..4efd549
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-kiss.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-laughing.gif b/media/tiny_mce/plugins/emotions/images/smiley-laughing.gif
new file mode 100755 (executable)
index 0000000..1606c11
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-laughing.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif b/media/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif
new file mode 100755 (executable)
index 0000000..ca2451e
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-sealed.gif b/media/tiny_mce/plugins/emotions/images/smiley-sealed.gif
new file mode 100755 (executable)
index 0000000..b33d3cc
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-sealed.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-smile.gif b/media/tiny_mce/plugins/emotions/images/smiley-smile.gif
new file mode 100755 (executable)
index 0000000..e6a9e60
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-smile.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-surprised.gif b/media/tiny_mce/plugins/emotions/images/smiley-surprised.gif
new file mode 100755 (executable)
index 0000000..cb99cdd
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-surprised.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif b/media/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif
new file mode 100755 (executable)
index 0000000..2075dc1
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-undecided.gif b/media/tiny_mce/plugins/emotions/images/smiley-undecided.gif
new file mode 100755 (executable)
index 0000000..bef7e25
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-undecided.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-wink.gif b/media/tiny_mce/plugins/emotions/images/smiley-wink.gif
new file mode 100755 (executable)
index 0000000..9faf1af
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-wink.gif differ
diff --git a/media/tiny_mce/plugins/emotions/images/smiley-yell.gif b/media/tiny_mce/plugins/emotions/images/smiley-yell.gif
new file mode 100755 (executable)
index 0000000..648e6e8
Binary files /dev/null and b/media/tiny_mce/plugins/emotions/images/smiley-yell.gif differ
diff --git a/media/tiny_mce/plugins/emotions/jscripts/functions.js b/media/tiny_mce/plugins/emotions/jscripts/functions.js
new file mode 100755 (executable)
index 0000000..95a9eaf
--- /dev/null
@@ -0,0 +1,21 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+}\r
+\r
+function insertEmotion(file_name, title) {\r
+       title = tinyMCE.getLang(title);\r
+\r
+       if (title == null)\r
+               title = "";\r
+\r
+       // XML encode\r
+       title = title.replace(/&/g, '&amp;');\r
+       title = title.replace(/\"/g, '&quot;');\r
+       title = title.replace(/</g, '&lt;');\r
+       title = title.replace(/>/g, '&gt;');\r
+\r
+       var html = '<img src="' + tinyMCE.baseURL + "/plugins/emotions/images/" + file_name + '" mce_src="' + tinyMCE.baseURL + "/plugins/emotions/images/" + file_name + '" border="0" alt="' + title + '" title="' + title + '" />';\r
+\r
+       tinyMCE.execCommand('mceInsertContent', false, html);\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/media/tiny_mce/plugins/emotions/langs/en.js b/media/tiny_mce/plugins/emotions/langs/en.js
new file mode 100755 (executable)
index 0000000..3cdd675
--- /dev/null
@@ -0,0 +1,22 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('emotions',{\r
+title : 'Insert emotion',\r
+desc : 'Emotions',\r
+cool : 'Cool',\r
+cry : 'Cry',\r
+embarassed : 'Embarassed',\r
+foot_in_mouth : 'Foot in mouth',\r
+frown : 'Frown',\r
+innocent : 'Innocent',\r
+kiss : 'Kiss',\r
+laughing : 'Laughing',\r
+money_mouth : 'Money mouth',\r
+sealed : 'Sealed',\r
+smile : 'Smile',\r
+surprised : 'Surprised',\r
+tongue_out : 'Tongue out',\r
+undecided : 'Undecided',\r
+wink : 'Wink',\r
+yell : 'Yell'\r
+});\r
diff --git a/media/tiny_mce/plugins/emotions/readme.txt b/media/tiny_mce/plugins/emotions/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/flash/css/content.css b/media/tiny_mce/plugins/flash/css/content.css
new file mode 100755 (executable)
index 0000000..843258b
--- /dev/null
@@ -0,0 +1,7 @@
+.mceItemFlash {\r
+       border: 1px dotted #cc0000;\r
+       background-image: url('../images/flash.gif');\r
+       background-position: center;\r
+       background-repeat: no-repeat;\r
+       background-color: #ffffcc;\r
+}\r
diff --git a/media/tiny_mce/plugins/flash/css/flash.css b/media/tiny_mce/plugins/flash/css/flash.css
new file mode 100755 (executable)
index 0000000..d3e88e1
--- /dev/null
@@ -0,0 +1,11 @@
+.panel_wrapper div.current {\r
+       height: 100px;\r
+}\r
+\r
+#width, #height {\r
+       width: 50px;\r
+}\r
+\r
+#file {\r
+       width: 250px;\r
+}\r
diff --git a/media/tiny_mce/plugins/flash/editor_plugin.js b/media/tiny_mce/plugins/flash/editor_plugin.js
new file mode 100755 (executable)
index 0000000..ddcf35d
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/flash',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<imgs.length;i++){if(tinyMCE.getAttrib(imgs[i],"class")=="mceItemFlash"){var src=tinyMCE.getAttrib(imgs[i],"alt");if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('alt',src);imgs[i].setAttribute('title',src)}}}break;case"get_from_editor_dom":var imgs=content.getElementsByTagName("img");for(var i=0;i<imgs.length;i++){if(tinyMCE.getAttrib(imgs[i],"class")=="mceItemFlash"){var src=tinyMCE.getAttrib(imgs[i],"alt");if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('alt',src);imgs[i].setAttribute('title',src)}}break;case"insert_to_editor":var startPos=0;var embedList=new Array();content=content.replace(new RegExp('<[ ]*embed','gi'),'<embed');content=content.replace(new RegExp('<[ ]*/embed[ ]*>','gi'),'</embed>');content=content.replace(new RegExp('<[ ]*object','gi'),'<object');content=content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');while((startPos=content.indexOf('<embed',startPos+1))!=-1){var endPos=content.indexOf('>',startPos);var attribs=TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos+6,endPos));embedList[embedList.length]=attribs}var index=0;while((startPos=content.indexOf('<object',startPos))!=-1){if(index>=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('</object>',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+='<img width="'+attribs["width"]+'" height="'+attribs["height"]+'"';content+=' src="'+(tinyMCE.getParam("theme_href")+'/images/spacer.gif')+'" title="'+attribs["src"]+'"';content+=' alt="'+attribs["src"]+'" class="mceItemFlash" />'+content.substring(endPos);content+=contentAfter;index++;startPos++}var index=0;while((startPos=content.indexOf('<embed',startPos))!=-1){if(index>=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('>',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+='<img width="'+attribs["width"]+'" height="'+attribs["height"]+'"';content+=' src="'+(tinyMCE.getParam("theme_href")+'/images/spacer.gif')+'" title="'+attribs["src"]+'"';content+=' alt="'+attribs["src"]+'" class="mceItemFlash" />'+content.substring(endPos);content+=contentAfter;index++;startPos++}break;case"get_from_editor":var startPos=-1;while((startPos=content.indexOf('<img',startPos+1))!=-1){var endPos=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+='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"';embedHTML+=' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"';embedHTML+=' width="'+attribs["width"]+'" height="'+attribs["height"]+'">';embedHTML+='<param name="movie" value="'+attribs["title"]+'" />';embedHTML+='<param name="quality" value="'+quality+'" />';embedHTML+='<param name="menu" value="'+menu+'" />';embedHTML+='<param name="wmode" value="'+wmode+'" />';embedHTML+='<embed src="'+attribs["title"]+'" wmode="'+wmode+'" quality="'+quality+'" menu="'+menu+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="'+attribs["width"]+'" height="'+attribs["height"]+'"></embed></object>';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<attribute_string.length;i++){var chr=attribute_string.charAt(i);if((chr=='"'||chr=="'")&&!withInValue)withInValue=true;else if((chr=='"'||chr=="'")&&withInValue){withInValue=false;var pos=attributeName.lastIndexOf(' ');if(pos!=-1)attributeName=attributeName.substring(pos+1);attributes[attributeName.toLowerCase()]=attributeValue.substring(1);attributeName="";attributeValue=""}else if(!whiteSpaceRegExp.test(chr)&&!withInName&&!withInValue)withInName=true;if(chr=='='&&withInName)withInName=false;if(withInName)attributeName+=chr;if(withInValue)attributeValue+=chr}return attributes}};tinyMCE.addPlugin("flash",TinyMCE_FlashPlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/flash/editor_plugin_src.js b/media/tiny_mce/plugins/flash/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..d8e2d8a
--- /dev/null
@@ -0,0 +1,285 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('flash');\r
+\r
+var TinyMCE_FlashPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Flash',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/flash',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               if (!tinyMCE.settings['flash_skip_plugin_css'])\r
+                       tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/flash/css/content.css");\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "flash":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_flash_desc', '{$pluginurl}/images/flash.gif', 'mceFlash');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceFlash":\r
+                               var name = "", swffile = "", swfwidth = "", swfheight = "", action = "insert";\r
+                               var template = new Array();\r
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+                               var focusElm = inst.getFocusElement();\r
+\r
+                               template['file']   = '../../plugins/flash/flash.htm'; // Relative to theme\r
+                               template['width']  = 430;\r
+                               template['height'] = 175;\r
+\r
+                               template['width'] += tinyMCE.getLang('lang_flash_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_flash_delta_height', 0);\r
+\r
+                               // Is selection a image\r
+                               if (focusElm != null && focusElm.nodeName.toLowerCase() == "img") {\r
+                                       name = tinyMCE.getAttrib(focusElm, 'class');\r
+\r
+                                       if (name.indexOf('mceItemFlash') == -1) // Not a Flash\r
+                                               return true;\r
+\r
+                                       // Get rest of Flash items\r
+                                       swffile = tinyMCE.getAttrib(focusElm, 'alt');\r
+\r
+                                       if (tinyMCE.getParam('convert_urls'))\r
+                                               swffile = eval(tinyMCE.settings['urlconverter_callback'] + "(swffile, null, true);");\r
+\r
+                                       swfwidth = tinyMCE.getAttrib(focusElm, 'width');\r
+                                       swfheight = tinyMCE.getAttrib(focusElm, 'height');\r
+                                       action = "update";\r
+                               }\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", swffile : swffile, swfwidth : swfwidth, swfheight : swfheight, action : action});\r
+                       return true;\r
+          }\r
+\r
+          // Pass to next handler in chain\r
+          return false;\r
+       },\r
+\r
+       cleanup : function(type, content) {\r
+               switch (type) {\r
+                       case "insert_to_editor_dom":\r
+                               // Force relative/absolute\r
+                               if (tinyMCE.getParam('convert_urls')) {\r
+                                       var imgs = content.getElementsByTagName("img");\r
+                                       for (var i=0; i<imgs.length; i++) {\r
+                                               if (tinyMCE.getAttrib(imgs[i], "class") == "mceItemFlash") {\r
+                                                       var src = tinyMCE.getAttrib(imgs[i], "alt");\r
+\r
+                                                       if (tinyMCE.getParam('convert_urls'))\r
+                                                               src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");\r
+\r
+                                                       imgs[i].setAttribute('alt', src);\r
+                                                       imgs[i].setAttribute('title', src);\r
+                                               }\r
+                                       }\r
+                               }\r
+                               break;\r
+\r
+                       case "get_from_editor_dom":\r
+                               var imgs = content.getElementsByTagName("img");\r
+                               for (var i=0; i<imgs.length; i++) {\r
+                                       if (tinyMCE.getAttrib(imgs[i], "class") == "mceItemFlash") {\r
+                                               var src = tinyMCE.getAttrib(imgs[i], "alt");\r
+\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");\r
+\r
+                                               imgs[i].setAttribute('alt', src);\r
+                                               imgs[i].setAttribute('title', src);\r
+                                       }\r
+                               }\r
+                               break;\r
+\r
+                       case "insert_to_editor":\r
+                               var startPos = 0;\r
+                               var embedList = new Array();\r
+\r
+                               // Fix the embed and object elements\r
+                               content = content.replace(new RegExp('<[ ]*embed','gi'),'<embed');\r
+                               content = content.replace(new RegExp('<[ ]*/embed[ ]*>','gi'),'</embed>');\r
+                               content = content.replace(new RegExp('<[ ]*object','gi'),'<object');\r
+                               content = content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');\r
+\r
+                               // Parse all embed tags\r
+                               while ((startPos = content.indexOf('<embed', startPos+1)) != -1) {\r
+                                       var endPos = content.indexOf('>', startPos);\r
+                                       var attribs = TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos + 6, endPos));\r
+                                       embedList[embedList.length] = attribs;\r
+                               }\r
+\r
+                               // Parse all object tags and replace them with images from the embed data\r
+                               var index = 0;\r
+                               while ((startPos = content.indexOf('<object', startPos)) != -1) {\r
+                                       if (index >= embedList.length)\r
+                                               break;\r
+\r
+                                       var attribs = embedList[index];\r
+\r
+                                       // Find end of object\r
+                                       endPos = content.indexOf('</object>', startPos);\r
+                                       endPos += 9;\r
+\r
+                                       // Insert image\r
+                                       var contentAfter = content.substring(endPos);\r
+                                       content = content.substring(0, startPos);\r
+                                       content += '<img width="' + attribs["width"] + '" height="' + attribs["height"] + '"';\r
+                                       content += ' src="' + (tinyMCE.getParam("theme_href") + '/images/spacer.gif') + '" title="' + attribs["src"] + '"';\r
+                                       content += ' alt="' + attribs["src"] + '" class="mceItemFlash" />' + content.substring(endPos);\r
+                                       content += contentAfter;\r
+                                       index++;\r
+\r
+                                       startPos++;\r
+                               }\r
+\r
+                               // Parse all embed tags and replace them with images from the embed data\r
+                               var index = 0;\r
+                               while ((startPos = content.indexOf('<embed', startPos)) != -1) {\r
+                                       if (index >= embedList.length)\r
+                                               break;\r
+\r
+                                       var attribs = embedList[index];\r
+\r
+                                       // Find end of embed\r
+                                       endPos = content.indexOf('>', startPos);\r
+                                       endPos += 9;\r
+\r
+                                       // Insert image\r
+                                       var contentAfter = content.substring(endPos);\r
+                                       content = content.substring(0, startPos);\r
+                                       content += '<img width="' + attribs["width"] + '" height="' + attribs["height"] + '"';\r
+                                       content += ' src="' + (tinyMCE.getParam("theme_href") + '/images/spacer.gif') + '" title="' + attribs["src"] + '"';\r
+                                       content += ' alt="' + attribs["src"] + '" class="mceItemFlash" />' + content.substring(endPos);\r
+                                       content += contentAfter;\r
+                                       index++;\r
+\r
+                                       startPos++;\r
+                               }\r
+\r
+                               break;\r
+\r
+                       case "get_from_editor":\r
+                               // Parse all img tags and replace them with object+embed\r
+                               var startPos = -1;\r
+\r
+                               while ((startPos = content.indexOf('<img', startPos+1)) != -1) {\r
+                                       var endPos = content.indexOf('/>', startPos);\r
+                                       var attribs = TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos + 4, endPos));\r
+\r
+                                       // Is not flash, skip it\r
+                                       if (attribs['class'] != "mceItemFlash")\r
+                                               continue;\r
+\r
+                                       endPos += 2;\r
+\r
+                                       var embedHTML = '';\r
+                                       var wmode = tinyMCE.getParam("flash_wmode", "");\r
+                                       var quality = tinyMCE.getParam("flash_quality", "high");\r
+                                       var menu = tinyMCE.getParam("flash_menu", "false");\r
+\r
+                                       // Insert object + embed\r
+                                       embedHTML += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"';\r
+                                       embedHTML += ' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"';\r
+                                       embedHTML += ' width="' + attribs["width"] + '" height="' + attribs["height"] + '">';\r
+                                       embedHTML += '<param name="movie" value="' + attribs["title"] + '" />';\r
+                                       embedHTML += '<param name="quality" value="' + quality + '" />';\r
+                                       embedHTML += '<param name="menu" value="' + menu + '" />';\r
+                                       embedHTML += '<param name="wmode" value="' + wmode + '" />';\r
+                                       embedHTML += '<embed src="' + attribs["title"] + '" wmode="' + wmode + '" quality="' + quality + '" menu="' + menu + '" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="' + attribs["width"] + '" height="' + attribs["height"] + '"></embed></object>';\r
+\r
+                                       // Insert embed/object chunk\r
+                                       chunkBefore = content.substring(0, startPos);\r
+                                       chunkAfter = content.substring(endPos);\r
+                                       content = chunkBefore + embedHTML + chunkAfter;\r
+                               }\r
+                               break;\r
+               }\r
+\r
+               // Pass through to next handler in chain\r
+               return content;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               if (node == null)\r
+                       return;\r
+\r
+               do {\r
+                       if (node.nodeName == "IMG" && tinyMCE.getAttrib(node, 'class').indexOf('mceItemFlash') == 0) {\r
+                               tinyMCE.switchClass(editor_id + '_flash', 'mceButtonSelected');\r
+                               return true;\r
+                       }\r
+               } while ((node = node.parentNode));\r
+\r
+               tinyMCE.switchClass(editor_id + '_flash', 'mceButtonNormal');\r
+\r
+               return true;\r
+       },\r
+\r
+       // Private plugin internal functions\r
+\r
+       _parseAttributes : function(attribute_string) {\r
+               var attributeName = "";\r
+               var attributeValue = "";\r
+               var withInName;\r
+               var withInValue;\r
+               var attributes = new Array();\r
+               var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');\r
+\r
+               if (attribute_string == null || attribute_string.length < 2)\r
+                       return null;\r
+\r
+               withInName = withInValue = false;\r
+\r
+               for (var i=0; i<attribute_string.length; i++) {\r
+                       var chr = attribute_string.charAt(i);\r
+\r
+                       if ((chr == '"' || chr == "'") && !withInValue)\r
+                               withInValue = true;\r
+                       else if ((chr == '"' || chr == "'") && withInValue) {\r
+                               withInValue = false;\r
+\r
+                               var pos = attributeName.lastIndexOf(' ');\r
+                               if (pos != -1)\r
+                                       attributeName = attributeName.substring(pos+1);\r
+\r
+                               attributes[attributeName.toLowerCase()] = attributeValue.substring(1);\r
+\r
+                               attributeName = "";\r
+                               attributeValue = "";\r
+                       } else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)\r
+                               withInName = true;\r
+\r
+                       if (chr == '=' && withInName)\r
+                               withInName = false;\r
+\r
+                       if (withInName)\r
+                               attributeName += chr;\r
+\r
+                       if (withInValue)\r
+                               attributeValue += chr;\r
+               }\r
+\r
+               return attributes;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("flash", TinyMCE_FlashPlugin);\r
diff --git a/media/tiny_mce/plugins/flash/flash.htm b/media/tiny_mce/plugins/flash/flash.htm
new file mode 100755 (executable)
index 0000000..7bab48a
--- /dev/null
@@ -0,0 +1,70 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_flash_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/flash.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <link href="css/flash.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form onsubmit="insertFlash();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_flash_general}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_flash_general}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                                       <tr>\r
+                                                       <td nowrap="nowrap"><label for="file">{$lang_flash_file}</label></td>\r
+                                                         <td nowrap="nowrap">\r
+                                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                                         <tr>\r
+                                                                               <td><input id="file" name="file" type="text" value="" onfocus="this.select();" /></td>\r
+                                                                               <td id="filebrowsercontainer">&nbsp;</td>\r
+                                                                         </tr>\r
+                                                                       </table>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                                       <tr id="linklistrow">\r
+                                                               <td><label for="linklist">{$lang_flash_list}</label></td>\r
+                                                               <td id="linklistcontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td nowrap="nowrap"><label>{$lang_flash_size}</label></td>\r
+                                                               <td nowrap="nowrap">\r
+                                                                       <input type="text" id="width" name="width" value="" onfocus="this.select();" />\r
+                                                                       <select name="width2" id="width2" style="width: 50px">\r
+                                                                               <option value="">px</option>\r
+                                                                               <option value="%">%</option>\r
+                                                                       </select>&nbsp;x&nbsp;<input id="height" name="height" type="text"  value="" onfocus="this.select();" />\r
+                                                                       <select name="height2" id="height2" style="width: 50px">\r
+                                                                               <option value="">px</option>\r
+                                                                               <option value="%">%</option>\r
+                                                                       </select>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertFlash();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/flash/images/flash.gif b/media/tiny_mce/plugins/flash/images/flash.gif
new file mode 100755 (executable)
index 0000000..cb192e6
Binary files /dev/null and b/media/tiny_mce/plugins/flash/images/flash.gif differ
diff --git a/media/tiny_mce/plugins/flash/jscripts/flash.js b/media/tiny_mce/plugins/flash/jscripts/flash.js
new file mode 100755 (executable)
index 0000000..4f08077
--- /dev/null
@@ -0,0 +1,107 @@
+var url = tinyMCE.getParam("flash_external_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById("filebrowsercontainer").innerHTML = getBrowserHTML('filebrowser','file','flash','flash');\r
+\r
+       // Image list outsrc\r
+       var html = getFlashListHTML('filebrowser','file','flash','flash');\r
+       if (html == "")\r
+               document.getElementById("linklistrow").style.display = 'none';\r
+       else\r
+               document.getElementById("linklistcontainer").innerHTML = html;\r
+\r
+       var formObj = document.forms[0];\r
+       var swffile   = tinyMCE.getWindowArg('swffile');\r
+       var swfwidth  = '' + tinyMCE.getWindowArg('swfwidth');\r
+       var swfheight = '' + tinyMCE.getWindowArg('swfheight');\r
+\r
+       if (swfwidth.indexOf('%')!=-1) {\r
+               formObj.width2.value = "%";\r
+               formObj.width.value  = swfwidth.substring(0,swfwidth.length-1);\r
+       } else {\r
+               formObj.width2.value = "px";\r
+               formObj.width.value  = swfwidth;\r
+       }\r
+\r
+       if (swfheight.indexOf('%')!=-1) {\r
+               formObj.height2.value = "%";\r
+               formObj.height.value  = swfheight.substring(0,swfheight.length-1);\r
+       } else {\r
+               formObj.height2.value = "px";\r
+               formObj.height.value  = swfheight;\r
+       }\r
+\r
+       formObj.file.value = swffile;\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true);\r
+\r
+       selectByValue(formObj, 'linklist', swffile);\r
+\r
+       // Handle file browser\r
+       if (isVisible('filebrowser'))\r
+               document.getElementById('file').style.width = '230px';\r
+\r
+       // Auto select flash in list\r
+       if (typeof(tinyMCEFlashList) != "undefined" && tinyMCEFlashList.length > 0) {\r
+               for (var i=0; i<formObj.linklist.length; i++) {\r
+                       if (formObj.linklist.options[i].value == tinyMCE.getWindowArg('swffile'))\r
+                               formObj.linklist.options[i].selected = true;\r
+               }\r
+       }\r
+}\r
+\r
+function getFlashListHTML() {\r
+       if (typeof(tinyMCEFlashList) != "undefined" && tinyMCEFlashList.length > 0) {\r
+               var html = "";\r
+\r
+               html += '<select id="linklist" name="linklist" style="width: 250px" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.file.value=this.options[this.selectedIndex].value;">';\r
+               html += '<option value="">---</option>';\r
+\r
+               for (var i=0; i<tinyMCEFlashList.length; i++)\r
+                       html += '<option value="' + tinyMCEFlashList[i][1] + '">' + tinyMCEFlashList[i][0] + '</option>';\r
+\r
+               html += '</select>';\r
+\r
+               return html;\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+function insertFlash() {\r
+       var formObj = document.forms[0];\r
+       var html      = '';\r
+       var file      = formObj.file.value;\r
+       var width     = formObj.width.value;\r
+       var height    = formObj.height.value;\r
+       if (formObj.width2.value=='%') {\r
+               width = width + '%';\r
+       }\r
+       if (formObj.height2.value=='%') {\r
+               height = height + '%';\r
+       }\r
+\r
+       if (width == "")\r
+               width = 100;\r
+\r
+       if (height == "")\r
+               height = 100;\r
+\r
+       html += ''\r
+               + '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" mce_src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" '\r
+               + 'width="' + width + '" height="' + height + '" '\r
+               + 'border="0" alt="' + file + '" title="' + file + '" class="mceItemFlash" />';\r
+\r
+       tinyMCEPopup.execCommand("mceInsertContent", true, html);\r
+       tinyMCE.selectedInstance.repaint();\r
+\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/media/tiny_mce/plugins/flash/langs/en.js b/media/tiny_mce/plugins/flash/langs/en.js
new file mode 100755 (executable)
index 0000000..67272bc
--- /dev/null
@@ -0,0 +1,11 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('flash',{\r
+title : 'Insert / edit Flash Movie',\r
+desc : 'Insert / edit Flash Movie',\r
+file : 'Flash-File (.swf)',\r
+size : 'Size',\r
+list : 'Flash files',\r
+props : 'Flash properties',\r
+general : 'General'\r
+});\r
diff --git a/media/tiny_mce/plugins/flash/readme.txt b/media/tiny_mce/plugins/flash/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/fullpage/blank.htm b/media/tiny_mce/plugins/fullpage/blank.htm
new file mode 100755 (executable)
index 0000000..1e5876a
--- /dev/null
@@ -0,0 +1,9 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>blank_page</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+</head>\r
+<body onload="parent.setupIframe(document);">\r
+\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/fullpage/css/fullpage.css b/media/tiny_mce/plugins/fullpage/css/fullpage.css
new file mode 100755 (executable)
index 0000000..19f74f4
--- /dev/null
@@ -0,0 +1,176 @@
+/* Hide the advanced tab */\r
+#advanced_tab {\r
+       display: none;\r
+}\r
+\r
+#metatitle, #metakeywords, #metadescription, #metaauthor, #metacopyright {\r
+       width: 280px;\r
+}\r
+\r
+#doctype, #docencoding {\r
+       width: 200px;\r
+}\r
+\r
+#langcode {\r
+       width: 30px;\r
+}\r
+\r
+#bgimage {\r
+       width: 220px;   \r
+}\r
+\r
+#fontface {\r
+       width: 240px;\r
+}\r
+\r
+#leftmargin, #rightmargin, #topmargin, #bottommargin {\r
+       width: 50px;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 400px;\r
+}\r
+\r
+#stylesheet, #style {\r
+       width: 240px;\r
+}\r
+\r
+/* Head list classes */\r
+\r
+.headlistwrapper {\r
+       width: 100%;\r
+}\r
+\r
+.addbutton, .removebutton, .moveupbutton, .movedownbutton {\r
+       border-top: 1px solid;\r
+       border-left: 1px solid;\r
+       border-bottom: 1px solid;\r
+       border-right: 1px solid;\r
+       border-color: #F0F0EE;\r
+       cursor: default;\r
+       display: block;\r
+       width: 20px;\r
+       height: 20px;\r
+}\r
+\r
+.addbutton:hover, .removebutton:hover, .moveupbutton:hover, .movedownbutton:hover {\r
+       border: 1px solid #0A246A;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.addbutton {\r
+       background-image: url('../images/add.gif');\r
+       float: left;\r
+       margin-right: 3px;\r
+}\r
+\r
+.removebutton {\r
+       background-image: url('../images/remove.gif');\r
+       float: left;\r
+}\r
+\r
+.moveupbutton {\r
+       background-image: url('../images/move_up.gif');\r
+       float: left;\r
+       margin-right: 3px;\r
+}\r
+\r
+.movedownbutton {\r
+       background-image: url('../images/move_down.gif');\r
+       float: left;\r
+}\r
+\r
+.selected {\r
+       border: 1px solid #0A246A;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.toolbar {\r
+       width: 100%;\r
+}\r
+\r
+#headlist {\r
+       width: 100%;\r
+       margin-top: 3px;\r
+       font-size: 11px;\r
+}\r
+\r
+#info, #title_element, #meta_element, #script_element, #style_element, #base_element, #link_element, #comment_element, #unknown_element {\r
+       display: none;\r
+}\r
+\r
+#addmenu {\r
+       position: absolute;\r
+       border: 1px solid gray;\r
+       display: none;\r
+       z-index: 100;\r
+       background-color: white;\r
+}\r
+\r
+#addmenu a {\r
+       display: block;\r
+       width: 100%;\r
+       line-height: 20px;\r
+       text-decoration: none;\r
+       background-color: white;\r
+}\r
+\r
+#addmenu a:hover {\r
+       background-color: #B6BDD2;\r
+       color: black;\r
+}\r
+\r
+#addmenu span {\r
+       padding-left: 10px;\r
+       padding-right: 10px;\r
+}\r
+\r
+#updateElementPanel {\r
+       display: none;\r
+}\r
+\r
+#script_element .panel_wrapper div.current {\r
+       height: 108px;\r
+}\r
+\r
+#style_element .panel_wrapper div.current {\r
+       height: 108px;\r
+}\r
+\r
+#link_element  .panel_wrapper div.current {\r
+       height: 140px;\r
+}\r
+\r
+#element_script_value {\r
+       width: 100%;\r
+       height: 100px;\r
+}\r
+\r
+#element_comment_value {\r
+       width: 100%;\r
+       height: 120px;\r
+}\r
+\r
+#element_style_value {\r
+       width: 100%;\r
+       height: 100px;\r
+}\r
+\r
+#element_title, #element_script_src, #element_meta_name, #element_meta_content, #element_base_href, #element_link_href, #element_link_title {\r
+       width: 250px;\r
+}\r
+\r
+.updateElementButton {\r
+       margin-top: 3px;\r
+}\r
+\r
+/* MSIE specific styles */\r
+\r
+* html .addbutton, * html .removebutton, * html .moveupbutton, * html .movedownbutton {\r
+       width: 22px;\r
+       height: 22px;\r
+}\r
+\r
+textarea {\r
+       height: 55px;\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/fullpage/editor_plugin.js b/media/tiny_mce/plugins/fullpage/editor_plugin.js
new file mode 100755 (executable)
index 0000000..8e1eb51
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage',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('<body'),pos2;if(pos!=-1){pos=tmp.indexOf('>',pos);pos2=tmp.lastIndexOf('</body>');inst.fullpageTopContent=content.substring(0,pos+1);content=content.substring(pos+1,pos2);}else{if(!inst.fullpageTopContent){var docType=tinyMCE.getParam("fullpage_default_doctype",'<!DOCTYPE html PUBLIC "-/'+'/W3C//DTD XHTML 1.0 Transitional/'+'/EN" "http:/'+'/www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');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,'&amp;');title=title.replace(/\"/g,'&quot;');title=title.replace(/</g,'&lt;');title=title.replace(/>/g,'&gt;');tmp='';if(pi)tmp+='<?xml version="1.0" encoding="'+enc+'"?>\n';tmp+=docType+'\n';tmp+='<html xmlns="http:/'+'/www.w3.org/1999/xhtml" lang="'+lang+'" xml:lang="'+lang+'">\n';tmp+='<head>\n';tmp+='\t<title>'+title+'</title>\n';tmp+='\t<meta http-equiv="Content-Type" content="text/html; charset='+enc+'" />\n';tmp+='</head>\n';tmp+='<body';if(ff!=''||fz!=''){tmp+=' style="';if(ds!='')tmp+=ds+";";if(ff!='')tmp+='font-family: '+ff+";";if(fz!='')tmp+='font-size: '+fz+";";tmp+='"'}if(dtc!='')tmp+=' text="'+dtc+'"';tmp+='>\n';inst.fullpageTopContent=tmp}}this._addToHead(inst);break;case"get_from_editor":if(inst.fullpageTopContent&&!tinyMCE.getParam("fullpage_hide_in_source_view",false)){content=content.replace(/(\s)?mce\_[a-z_]+\=[^\s>]+(\s|\>)/i,'');content=inst.fullpageTopContent+content+"\n</body>\n</html>"}break;case"submit_content":if(inst.fullpageTopContent&&tinyMCE.getParam("fullpage_hide_in_source_view",false))content=inst.fullpageTopContent+content+"\n</body>\n</html>";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(/<script(.*?)<\/script>/gi,'');h=h.replace(/<title(.*?)<\/title>/gi,'');h=h.replace(/<(meta|base)[^>]*>/gi,'');h=h.replace(/<link([^>]*)\/>/gi,'<pre mce_type="link" $1></pre>');h=h.replace(/<body/gi,'<div mce_type="body"');h+='</div>';e.innerHTML=h;body.vLink=body.aLink=body.link=body.text='';body.style.cssText='';nl=head.getElementsByTagName('link');for(i=0;i<nl.length;i++){if(tinyMCE.getAttrib(nl[i],'mce_head')=="true")nl[i].parentNode.removeChild(nl[i])}nl=e.getElementsByTagName('pre');for(i=0;i<nl.length;i++){tmp=tinyMCE.getAttrib(nl[i],'media');if(tinyMCE.getAttrib(nl[i],'mce_type')=="link"&&(tmp==""||tmp=="screen"||tmp=="all")&&tinyMCE.getAttrib(nl[i],'rel')=="stylesheet"){le=doc.createElement("link");le.rel="stylesheet";le.href=tinyMCE.getAttrib(nl[i],'href');le.setAttribute("mce_head","true");head.appendChild(le)}}nl=e.getElementsByTagName('div');if(nl.length>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/media/tiny_mce/plugins/fullpage/editor_plugin_src.js b/media/tiny_mce/plugins/fullpage/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..8c61823
--- /dev/null
@@ -0,0 +1,235 @@
+/**\r
+ * $Id: editor_plugin_src.js 232 2007-03-05 17:00:27Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('fullpage');\r
+\r
+var TinyMCE_FullPagePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Fullpage',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "fullpage":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_fullpage_desc', '{$pluginurl}/images/fullpage.gif', 'mceFullPageProperties');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceFullPageProperties":\r
+                               var template = new Array();\r
+\r
+                               template['file']   = '../../plugins/fullpage/fullpage.htm';\r
+                               template['width']  = 430;\r
+                               template['height'] = 485 + (tinyMCE.isOpera ? 5 : 0);\r
+\r
+                               template['width'] += tinyMCE.getLang('lang_fullpage_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_fullpage_delta_height', 0);\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+                       return true;\r
+\r
+                       case "mceFullPageUpdate":\r
+                               TinyMCE_FullPagePlugin._addToHead(tinyMCE.getInstanceById(editor_id));\r
+                               return true;\r
+          }\r
+\r
+          // Pass to next handler in chain\r
+          return false;\r
+       },\r
+\r
+       cleanup : function(type, content, inst) {\r
+               switch (type) {\r
+                       case "insert_to_editor":\r
+                               var tmp = content.toLowerCase();\r
+                               var pos = tmp.indexOf('<body'), pos2;\r
+\r
+                               // Split page in header and body chunks\r
+                               if (pos != -1) {\r
+                                       pos = tmp.indexOf('>', pos);\r
+                                       pos2 = tmp.lastIndexOf('</body>');\r
+                                       inst.fullpageTopContent = content.substring(0, pos + 1);\r
+                                       content = content.substring(pos + 1, pos2);\r
+                                       // tinyMCE.debug(inst.fullpageTopContent, content);\r
+                               } else {\r
+                                       if (!inst.fullpageTopContent) {\r
+                                               var docType = tinyMCE.getParam("fullpage_default_doctype", '<!DOCTYPE html PUBLIC "-/'+'/W3C//DTD XHTML 1.0 Transitional/'+'/EN" "http:/'+'/www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');\r
+                                               var enc = tinyMCE.getParam("fullpage_default_encoding", 'utf-8');\r
+                                               var title = tinyMCE.getParam("fullpage_default_title", 'Untitled document');\r
+                                               var lang = tinyMCE.getParam("fullpage_default_langcode", 'en');\r
+                                               var pi = tinyMCE.getParam("fullpage_default_xml_pi", true);\r
+                                               var ff = tinyMCE.getParam("fullpage_default_font_family", "");\r
+                                               var fz = tinyMCE.getParam("fullpage_default_font_size", "");\r
+                                               var ds = tinyMCE.getParam("fullpage_default_style", "");\r
+                                               var dtc = tinyMCE.getParam("fullpage_default_text_color", "");\r
+\r
+                                               // Xml encode it\r
+                                               title = title.replace(/&/g, '&amp;');\r
+                                               title = title.replace(/\"/g, '&quot;');\r
+                                               title = title.replace(/</g, '&lt;');\r
+                                               title = title.replace(/>/g, '&gt;');\r
+\r
+                                               tmp = '';\r
+\r
+                                               // Make default chunk\r
+                                               if (pi)\r
+                                                       tmp += '<?xml version="1.0" encoding="' + enc + '"?>\n';\r
+\r
+                                               tmp += docType + '\n';\r
+                                               tmp += '<html xmlns="http:/'+'/www.w3.org/1999/xhtml" lang="' + lang + '" xml:lang="' + lang + '">\n';\r
+                                               tmp += '<head>\n';\r
+                                               tmp += '\t<title>' + title + '</title>\n';\r
+                                               tmp += '\t<meta http-equiv="Content-Type" content="text/html; charset=' + enc + '" />\n';\r
+                                               tmp += '</head>\n';\r
+                                               tmp += '<body';\r
+\r
+                                               if (ff != '' || fz != '') {\r
+                                                       tmp += ' style="';\r
+\r
+                                                       if (ds != '')\r
+                                                               tmp += ds + ";";\r
+\r
+                                                       if (ff != '')\r
+                                                               tmp += 'font-family: ' + ff + ";";\r
+\r
+                                                       if (fz != '')\r
+                                                               tmp += 'font-size: ' + fz + ";";\r
+\r
+                                                       tmp += '"';\r
+                                               }\r
+\r
+                                               if (dtc != '')\r
+                                                       tmp += ' text="' + dtc + '"';\r
+\r
+                                               tmp += '>\n';\r
+\r
+                                               inst.fullpageTopContent = tmp;\r
+                                       }\r
+                               }\r
+\r
+                               this._addToHead(inst);\r
+\r
+                               break;\r
+\r
+                       case "get_from_editor":\r
+                               if (inst.fullpageTopContent && !tinyMCE.getParam("fullpage_hide_in_source_view", false)) {\r
+                                       content = content.replace(/(\s)?mce\_[a-z_]+\=[^\s>]+(\s|\>)/i, ''); // Remove internal stuff\r
+                                       content = inst.fullpageTopContent + content + "\n</body>\n</html>";\r
+                               }\r
+\r
+                               break;\r
+\r
+                       case "submit_content":\r
+                               if (inst.fullpageTopContent && tinyMCE.getParam("fullpage_hide_in_source_view", false))\r
+                                       content = inst.fullpageTopContent + content + "\n</body>\n</html>";\r
+\r
+                               break;\r
+               }\r
+\r
+               // Pass through to next handler in chain\r
+               return content;\r
+       },\r
+\r
+       // Private plugin internal methods\r
+\r
+       _addToHead : function(inst) {\r
+               var doc = inst.getDoc();\r
+               var head = doc.getElementsByTagName("head")[0];\r
+               var body = doc.body;\r
+               var h = inst.fullpageTopContent;\r
+               var e = doc.createElement("body");\r
+               var nl, i, le, tmp;\r
+\r
+               // Remove stuff we don't want\r
+               h = h.replace(/(\r|\n)/gi, '');\r
+               h = h.replace(/<\?[^\>]*\>/gi, '');\r
+               h = h.replace(/<\/?(!DOCTYPE|head|html)[^\>]*\>/gi, '');\r
+               h = h.replace(/<script(.*?)<\/script>/gi, '');\r
+               h = h.replace(/<title(.*?)<\/title>/gi, '');\r
+               h = h.replace(/<(meta|base)[^>]*>/gi, '');\r
+\r
+               // Make link and style elements into pre\r
+               h = h.replace(/<link([^>]*)\/>/gi, '<pre mce_type="link" $1></pre>');\r
+               //h = h.replace(/<style([^>]*)>(.*?)<\/style>/gi, '<pre mce_type="style" $1>$2</pre>');\r
+\r
+               // Make body a div\r
+               h = h.replace(/<body/gi, '<div mce_type="body"');\r
+               h += '</div>';\r
+\r
+               // Now crapy MSIE can parse it\r
+               e.innerHTML = h;\r
+\r
+               // Reset all body attributes\r
+               body.vLink = body.aLink = body.link = body.text = '';\r
+               body.style.cssText = '';\r
+\r
+               // Delete all old links\r
+               nl = head.getElementsByTagName('link');\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (tinyMCE.getAttrib(nl[i], 'mce_head') == "true")\r
+                               nl[i].parentNode.removeChild(nl[i]);\r
+               }\r
+\r
+               // Add link elements\r
+               nl = e.getElementsByTagName('pre');\r
+               for (i=0; i<nl.length; i++) {\r
+                       tmp = tinyMCE.getAttrib(nl[i], 'media');\r
+                       if (tinyMCE.getAttrib(nl[i], 'mce_type') == "link" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCE.getAttrib(nl[i], 'rel') == "stylesheet") {\r
+                               le = doc.createElement("link");\r
+\r
+                               le.rel = "stylesheet";\r
+                               le.href = tinyMCE.getAttrib(nl[i], 'href');\r
+                               le.setAttribute("mce_head", "true");\r
+\r
+                               head.appendChild(le);\r
+                       }\r
+               }\r
+\r
+               // Add body attributes\r
+               nl = e.getElementsByTagName('div');\r
+               if (nl.length > 0) {\r
+                       body.style.cssText = tinyMCE.getAttrib(nl[0], 'style');\r
+\r
+                       if ((tmp = tinyMCE.getAttrib(nl[0], 'leftmargin')) != '' && body.style.marginLeft == '')\r
+                               body.style.marginLeft = tmp + "px";\r
+\r
+                       if ((tmp = tinyMCE.getAttrib(nl[0], 'rightmargin')) != '' && body.style.marginRight == '')\r
+                               body.style.marginRight = tmp + "px";\r
+\r
+                       if ((tmp = tinyMCE.getAttrib(nl[0], 'topmargin')) != '' && body.style.marginTop == '')\r
+                               body.style.marginTop = tmp + "px";\r
+\r
+                       if ((tmp = tinyMCE.getAttrib(nl[0], 'bottommargin')) != '' && body.style.marginBottom == '')\r
+                               body.style.marginBottom = tmp + "px";\r
+\r
+                       body.dir = tinyMCE.getAttrib(nl[0], 'dir');\r
+                       body.vLink = tinyMCE.getAttrib(nl[0], 'vlink');\r
+                       body.aLink = tinyMCE.getAttrib(nl[0], 'alink');\r
+                       body.link = tinyMCE.getAttrib(nl[0], 'link');\r
+                       body.text = tinyMCE.getAttrib(nl[0], 'text');\r
+\r
+                       if ((tmp = tinyMCE.getAttrib(nl[0], 'background')) != '')\r
+                               body.style.backgroundImage = "url('" + tmp + "')";\r
+\r
+                       if ((tmp = tinyMCE.getAttrib(nl[0], 'bgcolor')) != '')\r
+                               body.style.backgroundColor = tmp;\r
+               }\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("fullpage", TinyMCE_FullPagePlugin);\r
diff --git a/media/tiny_mce/plugins/fullpage/fullpage.htm b/media/tiny_mce/plugins/fullpage/fullpage.htm
new file mode 100755 (executable)
index 0000000..2781581
--- /dev/null
@@ -0,0 +1,577 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_fullpage_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mclayer.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/fullpage.js"></script>\r
+       <link href="css/fullpage.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="advlink" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form onsubmit="updateAction();return false;" name="fullpage" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="meta_tab" class="current"><span><a href="javascript:mcTabs.displayTab('meta_tab','meta_panel');" onmousedown="return false;">{$lang_fullpage_meta_tab}</a></span></li>\r
+                               <li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{$lang_fullpage_appearance_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_fullpage_advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="meta_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_fullpage_meta_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="metatitle">{$lang_fullpage_meta_title}</label>&nbsp;</td>\r
+                                                       <td><input type="text" id="metatitle" name="metatitle" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="metakeywords">{$lang_fullpage_meta_keywords}</label>&nbsp;</td>\r
+                                                       <td><textarea id="metakeywords" name="metakeywords" rows="4"></textarea></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="metadescription">{$lang_fullpage_meta_description}</label>&nbsp;</td>\r
+                                                       <td><textarea id="metadescription" name="metadescription" rows="4"></textarea></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="metaauthor">{$lang_fullpage_author}</label>&nbsp;</td>\r
+                                                       <td><input type="text" id="metaauthor" name="metaauthor" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="metacopyright">{$lang_fullpage_copyright}</label>&nbsp;</td>\r
+                                                       <td><input type="text" id="metacopyright" name="metacopyright" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="metarobots">{$lang_fullpage_meta_robots}</label>&nbsp;</td>\r
+                                                       <td>\r
+<select id="metarobots" name="metarobots">\r
+                       <option value="">{$lang_not_set}</option> \r
+                       <option value="index,follow">{$lang_fullpage_meta_index_follow}</option>\r
+                       <option value="index,nofollow">{$lang_fullpage_meta_index_nofollow}</option>\r
+                       <option value="noindex,follow">{$lang_fullpage_meta_noindex_follow}</option>\r
+                       <option value="noindex,nofollow">{$lang_fullpage_meta_noindex_nofollow}</option>\r
+</select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_fullpage_langprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="docencoding">{$lang_fullpage_encoding}</label></td> \r
+                                                       <td>\r
+                                                               <select id="docencoding" name="docencoding"> \r
+                                                                               <option value="">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="doctypes">{$lang_fullpage_doctypes}</label>&nbsp;</td>\r
+                                                       <td>\r
+                                                               <select id="doctypes" name="doctypes">\r
+                                                                               <option value="">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="langcode">{$lang_fullpage_langcode}</label>&nbsp;</td>\r
+                                                       <td><input type="text" id="langcode" name="langcode" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="langdir">{$lang_fullpage_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="langdir" name="langdir"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_fullpage_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_fullpage_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td nowrap="nowrap"><label for="xml_pi">{$lang_fullpage_xml_pi}</label>&nbsp;</td>\r
+                                                       <td><input type="checkbox" id="xml_pi" name="xml_pi" class="checkbox" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="appearance_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_fullpage_appearance_textprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="fontface">{$lang_fullpage_fontface}</label></td> \r
+                                                       <td>\r
+                                                               <select id="fontface" name="fontface" onchange="changedStyleField(this);">\r
+                                                                               <option value="">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="fontsize">{$lang_fullpage_fontsize}</label></td> \r
+                                                       <td>\r
+                                                               <select id="fontsize" name="fontsize" onchange="changedStyleField(this);">\r
+                                                                               <option value="">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="textcolor">{$lang_fullpage_textcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="textcolor" name="textcolor" type="text" value="" size="9" onchange="updateColor('textcolor_pick','textcolor');changedStyleField(this);" /></td>\r
+                                                                               <td id="textcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_fullpage_appearance_bgprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgimage">{$lang_fullpage_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgimage" name="bgimage" type="text" value="" onchange="changedStyleField(this);" /></td>\r
+                                                                               <td id="bgimage_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_fullpage_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedStyleField(this);" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_fullpage_appearance_marginprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="leftmargin">{$lang_fullpage_left_margin}</label></td> \r
+                                                       <td><input id="leftmargin" name="leftmargin" type="text" value="" onchange="changedStyleField(this);" /></td>\r
+                                                       <td class="column1"><label for="rightmargin">{$lang_fullpage_right_margin}</label></td> \r
+                                                       <td><input id="rightmargin" name="rightmargin" type="text" value="" onchange="changedStyleField(this);" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="topmargin">{$lang_fullpage_top_margin}</label></td> \r
+                                                       <td><input id="topmargin" name="topmargin" type="text" value="" onchange="changedStyleField(this);" /></td>\r
+                                                       <td class="column1"><label for="bottommargin">{$lang_fullpage_bottom_margin}</label></td> \r
+                                                       <td><input id="bottommargin" name="bottommargin" type="text" value="" onchange="changedStyleField(this);" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_fullpage_appearance_linkprops}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="link_color">{$lang_fullpage_link_color}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="link_color" name="link_color" type="text" value="" size="9" onchange="updateColor('link_color_pick','link_color');changedStyleField(this);" /></td>\r
+                                                                               <td id="link_color_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td class="column1"><label for="visited_color">{$lang_fullpage_visited_color}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="visited_color" name="visited_color" type="text" value="" size="9" onchange="updateColor('visited_color_pick','visited_color');changedStyleField(this);" /></td>\r
+                                                                               <td id="visited_color_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="active_color">{$lang_fullpage_active_color}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="active_color" name="active_color" type="text" value="" size="9" onchange="updateColor('active_color_pick','active_color');changedStyleField(this);" /></td>\r
+                                                                               <td id="active_color_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td>&nbsp;</td>\r
+                                                       <td>&nbsp;</td>\r
+\r
+<!--                                                   <td class="column1"><label for="hover_color">{$lang_fullpage_hover_color}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="hover_color" name="hover_color" type="text" value="" size="9" onchange="changedStyleField(this);" /></td>\r
+                                                                               <td id="hover_color_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> -->\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_fullpage_appearance_style}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="stylesheet">{$lang_fullpage_stylesheet}</label></td> \r
+                                                       <td><table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="stylesheet" name="stylesheet" type="text" value="" /></td>\r
+                                                                               <td id="stylesheet_browsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="style">{$lang_fullpage_style}</label></td> \r
+                                                       <td><input id="style" name="style" type="text" value="" onchange="changedStyleField(this);" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <div id="addmenu">\r
+                                       <table border="0" cellpadding="0" cellspacing="0">\r
+                                               <tr><td><a href="javascript:addHeadElm('title');" onmousedown="return false;"><span>{$lang_fullpage_add_title}</span></a></td></tr>\r
+                                               <tr><td><a href="javascript:addHeadElm('meta');" onmousedown="return false;"><span>{$lang_fullpage_add_meta}</span></a></td></tr>\r
+                                               <tr><td><a href="javascript:addHeadElm('script');" onmousedown="return false;"><span>{$lang_fullpage_add_script}</span></a></td></tr>\r
+                                               <tr><td><a href="javascript:addHeadElm('style');" onmousedown="return false;"><span>{$lang_fullpage_add_style}</span></a></td></tr>\r
+                                               <tr><td><a href="javascript:addHeadElm('link');" onmousedown="return false;"><span>{$lang_fullpage_add_link}</span></a></td></tr>\r
+                                               <tr><td><a href="javascript:addHeadElm('base');" onmousedown="return false;"><span>{$lang_fullpage_add_base}</span></a></td></tr>\r
+                                               <tr><td><a href="javascript:addHeadElm('comment');" onmousedown="return false;"><span>{$lang_fullpage_add_comment}</span></a></td></tr>\r
+                                       </table>\r
+                               </div>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_fullpage_head_elements}</legend>\r
+\r
+                                       <div class="headlistwrapper">\r
+                                               <div class="toolbar">\r
+                                                       <div style="float: left">\r
+                                                               <a id="addbutton" href="javascript:showAddMenu();" onmousedown="return false;" class="addbutton" title="{$lang_fullpage_add}"></a>\r
+                                                               <a href="#" onmousedown="return false;" class="removebutton" title="{$lang_fullpage_remove}"></a>\r
+                                                       </div>\r
+                                                       <div style="float: right">\r
+                                                               <a href="#" onmousedown="return false;" class="moveupbutton" title="{$lang_fullpage_moveup}"></a>\r
+                                                               <a href="#" onmousedown="return false;" class="movedownbutton" title="{$lang_fullpage_movedown}"></a>\r
+                                                       </div>\r
+                                                       <br style="clear: both" />\r
+                                               </div>\r
+                                               <select id="headlist" size="26" onchange="updateHeadElm(this.options[this.selectedIndex].value);">\r
+                                                       <option value="title_0">&lt;title&gt;Some title bla bla bla&lt;/title&gt;</option>\r
+                                                       <option value="meta_1">&lt;meta name="keywords"&gt;Some bla bla bla&lt;/meta&gt;</option>\r
+                                                       <option value="meta_2">&lt;meta name="description"&gt;Some bla bla bla bla bla bla bla bla bla&lt;/meta&gt;</option>\r
+                                                       <option value="script_3">&lt;script language=&quot;javascript&quot;&gt;...&lt;/script&gt;</option>\r
+                                                       <option value="style_4">&lt;style&gt;...&lt;/style&gt;</option>\r
+                                                       <option value="base_5">&lt;base href="." /&gt;</option>\r
+                                                       <option value="comment_6">&lt;!-- ... --&gt;</option>\r
+                                                       <option value="link_7">&lt;link href="." /&gt;</option>\r
+                                               </select>\r
+                                       </div>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="meta_element">\r
+                                       <legend>{$lang_fullpage_meta_element}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="element_meta_type">{$lang_fullpage_type}</label></td> \r
+                                                       <td><select id="element_meta_type">\r
+                                                                               <option value="name">name</option>\r
+                                                                               <option value="http-equiv">http-equiv</option>\r
+                                                               </select></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="element_meta_name">{$lang_fullpage_name}</label></td> \r
+                                                       <td><input id="element_meta_name" name="element_meta_name" type="text" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="element_meta_content">{$lang_fullpage_content}</label></td> \r
+                                                       <td><input id="element_meta_content" name="element_meta_content" type="text" value="" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <input type="button" id="meta_updateelement" class="updateElementButton" name="update" value="{$lang_update}" onclick="updateElement();" />\r
+                               </fieldset>\r
+\r
+                               <fieldset id="title_element">\r
+                                       <legend>{$lang_fullpage_title_element}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="element_title">{$lang_fullpage_meta_title}</label></td> \r
+                                                       <td><input id="element_title" name="element_title" type="text" value="" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <input type="button" id="title_updateelement" class="updateElementButton" name="update" value="{$lang_update}" onclick="updateElement();" />\r
+                               </fieldset>\r
+\r
+                               <fieldset id="script_element">\r
+                                       <legend>{$lang_fullpage_script_element}</legend>\r
+\r
+                                       <div class="tabs">\r
+                                               <ul>\r
+                                                       <li id="script_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('script_props_tab','script_props_panel');" onmousedown="return false;">{$lang_fullpage_properties}</a></span></li>\r
+                                                       <li id="script_value_tab"><span><a href="javascript:mcTabs.displayTab('script_value_tab','script_value_panel');" onmousedown="return false;">{$lang_fullpage_value}</a></span></li>\r
+                                               </ul>\r
+                                       </div>\r
+\r
+                                       <br style="clear: both" />\r
+\r
+                                       <div class="panel_wrapper">\r
+                                               <div id="script_props_panel" class="panel current">\r
+                                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_script_type">{$lang_fullpage_type}</label></td> \r
+                                                                       <td><select id="element_script_type">\r
+                                                                               <option value="text/javascript">text/javascript</option>\r
+                                                                               <option value="text/jscript">text/jscript</option>\r
+                                                                               <option value="text/vbscript">text/vbscript</option>\r
+                                                                               <option value="text/vbs">text/vbs</option>\r
+                                                                               <option value="text/ecmascript">text/ecmascript</option>\r
+                                                                               <option value="text/xml">text/xml</option>\r
+                                                                       </select></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_script_src">{$lang_fullpage_src}</label></td> \r
+                                                                       <td><table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="element_script_src" name="element_script_src" type="text" value="" /></td>\r
+                                                                               <td id="script_src_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_script_charset">{$lang_fullpage_charset}</label></td> \r
+                                                                       <td><select id="element_script_charset"><option value="">{$lang_not_set}</option></select></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_script_defer">{$lang_fullpage_defer}</label></td> \r
+                                                                       <td><input type="checkbox" id="element_script_defer" name="element_script_defer" class="checkbox" /></td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </div>\r
+\r
+                                               <div id="script_value_panel" class="panel">\r
+                                                       <textarea id="element_script_value"></textarea>\r
+                                               </div>\r
+                                       </div>\r
+\r
+                                       <input type="button" id="script_updateelement" class="updateElementButton" name="update" value="{$lang_update}" onclick="updateElement();" />\r
+                               </fieldset>\r
+\r
+                               <fieldset id="style_element">\r
+                                       <legend>{$lang_fullpage_style_element}</legend>\r
+\r
+                                       <div class="tabs">\r
+                                               <ul>\r
+                                                       <li id="style_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('style_props_tab','style_props_panel');" onmousedown="return false;">{$lang_fullpage_properties}</a></span></li>\r
+                                                       <li id="style_value_tab"><span><a href="javascript:mcTabs.displayTab('style_value_tab','style_value_panel');" onmousedown="return false;">{$lang_fullpage_value}</a></span></li>\r
+                                               </ul>\r
+                                       </div>\r
+\r
+                                       <br style="clear: both" />\r
+\r
+                                       <div class="panel_wrapper">\r
+                                               <div id="style_props_panel" class="panel current">\r
+                                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_style_type">{$lang_fullpage_type}</label></td> \r
+                                                                       <td><select id="element_style_type">\r
+                                                                               <option value="text/css">text/css</option>\r
+                                                                       </select></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_style_media">{$lang_fullpage_media}</label></td> \r
+                                                                       <td><select id="element_style_media"></select></td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </div>\r
+\r
+                                               <div id="style_value_panel" class="panel">\r
+                                                       <textarea id="element_style_value"></textarea>\r
+                                               </div>\r
+                                       </div>\r
+\r
+                                       <input type="button" id="style_updateelement" class="updateElementButton" name="update" value="{$lang_update}" onclick="updateElement();" />\r
+                               </fieldset>\r
+\r
+                               <fieldset id="base_element">\r
+                                       <legend>{$lang_fullpage_base_element}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="element_base_href">{$lang_fullpage_href}</label></td> \r
+                                                       <td><input id="element_base_href" name="element_base_href" type="text" value="" /></td>\r
+                                               </tr>\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="element_base_target">{$lang_fullpage_target}</label></td> \r
+                                                       <td><input id="element_base_target" name="element_base_target" type="text" value="" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <input type="button" id="base_updateelement" class="updateElementButton" name="update" value="{$lang_update}" onclick="updateElement();" />\r
+                               </fieldset>\r
+\r
+                               <fieldset id="link_element">\r
+                                       <legend>{$lang_fullpage_link_element}</legend>\r
+\r
+                                       <div class="tabs">\r
+                                               <ul>\r
+                                                       <li id="link_general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('link_general_tab','link_general_panel');" onmousedown="return false;">{$lang_fullpage_general_props}</a></span></li>\r
+                                                       <li id="link_advanced_tab"><span><a href="javascript:mcTabs.displayTab('link_advanced_tab','link_advanced_panel');" onmousedown="return false;">{$lang_fullpage_advanced_props}</a></span></li>\r
+                                               </ul>\r
+                                       </div>\r
+\r
+                                       <br style="clear: both" />\r
+\r
+                                       <div class="panel_wrapper">\r
+                                               <div id="link_general_panel" class="panel current">\r
+                                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_link_href">{$lang_fullpage_href}</label></td> \r
+                                                                       <td><table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="element_link_href" name="element_link_href" type="text" value="" /></td>\r
+                                                                               <td id="link_href_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_link_title">{$lang_fullpage_meta_title}</label></td> \r
+                                                                       <td><input id="element_link_title" name="element_link_title" type="text" value="" /></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_link_type">{$lang_fullpage_type}</label></td> \r
+                                                                       <td><select id="element_link_type" name="element_link_type">\r
+                                                                               <option value="text/css">text/css</option>\r
+                                                                               <option value="text/javascript">text/javascript</option>\r
+                                                                       </select></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_link_media">{$lang_fullpage_media}</label></td> \r
+                                                                       <td><select id="element_link_media" name="element_link_media"></select></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td><label for="element_style_rel">{$lang_fullpage_rel}</label></td>\r
+                                                                       <td><select id="element_style_rel" name="element_style_rel"> \r
+                                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                                       <option value="stylesheet">Stylesheet</option>\r
+                                                                                       <option value="alternate">Alternate</option>\r
+                                                                                       <option value="designates">Designates</option>\r
+                                                                                       <option value="start">Start</option>\r
+                                                                                       <option value="next">Next</option>\r
+                                                                                       <option value="prev">Prev</option>\r
+                                                                                       <option value="contents">Contents</option>\r
+                                                                                       <option value="index">Index</option>\r
+                                                                                       <option value="glossary">Glossary</option>\r
+                                                                                       <option value="copyright">Copyright</option>\r
+                                                                                       <option value="chapter">Chapter</option>\r
+                                                                                       <option value="subsection">Subsection</option>\r
+                                                                                       <option value="appendix">Appendix</option>\r
+                                                                                       <option value="help">Help</option>\r
+                                                                                       <option value="bookmark">Bookmark</option>\r
+                                                                               </select> \r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </div>\r
+\r
+                                               <div id="link_advanced_panel" class="panel">\r
+                                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_link_charset">{$lang_fullpage_charset}</label></td> \r
+                                                                       <td><select id="element_link_charset"><option value="">{$lang_not_set}</option></select></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_link_hreflang">{$lang_fullpage_hreflang}</label></td> \r
+                                                                       <td><input id="element_link_hreflang" name="element_link_hreflang" type="text" value="" /></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td class="column1"><label for="element_link_target">{$lang_fullpage_target}</label></td> \r
+                                                                       <td><input id="element_link_target" name="element_link_target" type="text" value="" /></td>\r
+                                                               </tr>\r
+                                                               <tr>\r
+                                                                       <td><label for="element_style_rev">{$lang_fullpage_rev}</label></td>\r
+                                                                       <td><select id="element_style_rev" name="element_style_rev"> \r
+                                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                                       <option value="alternate">Alternate</option> \r
+                                                                                       <option value="designates">Designates</option> \r
+                                                                                       <option value="stylesheet">Stylesheet</option> \r
+                                                                                       <option value="start">Start</option> \r
+                                                                                       <option value="next">Next</option> \r
+                                                                                       <option value="prev">Prev</option> \r
+                                                                                       <option value="contents">Contents</option> \r
+                                                                                       <option value="index">Index</option> \r
+                                                                                       <option value="glossary">Glossary</option> \r
+                                                                                       <option value="copyright">Copyright</option> \r
+                                                                                       <option value="chapter">Chapter</option> \r
+                                                                                       <option value="subsection">Subsection</option> \r
+                                                                                       <option value="appendix">Appendix</option> \r
+                                                                                       <option value="help">Help</option> \r
+                                                                                       <option value="bookmark">Bookmark</option> \r
+                                                                               </select> \r
+                                                                       </td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </div>\r
+                                       </div>\r
+\r
+                                       <input type="button" id="link_updateelement" class="updateElementButton" name="update" value="{$lang_update}" onclick="updateElement();" />\r
+                               </fieldset>\r
+\r
+                               <fieldset id="comment_element">\r
+                                       <legend>{$lang_fullpage_comment_element}</legend>\r
+\r
+                                       <textarea id="element_comment_value"></textarea>\r
+\r
+                                       <input type="button" id="comment_updateelement" class="updateElementButton" name="update" value="{$lang_update}" onclick="updateElement();" />\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="update" value="{$lang_update}" onclick="updateAction();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+    </form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/fullpage/images/add.gif b/media/tiny_mce/plugins/fullpage/images/add.gif
new file mode 100755 (executable)
index 0000000..d6291d9
Binary files /dev/null and b/media/tiny_mce/plugins/fullpage/images/add.gif differ
diff --git a/media/tiny_mce/plugins/fullpage/images/fullpage.gif b/media/tiny_mce/plugins/fullpage/images/fullpage.gif
new file mode 100755 (executable)
index 0000000..1ddefcd
Binary files /dev/null and b/media/tiny_mce/plugins/fullpage/images/fullpage.gif differ
diff --git a/media/tiny_mce/plugins/fullpage/images/move_down.gif b/media/tiny_mce/plugins/fullpage/images/move_down.gif
new file mode 100755 (executable)
index 0000000..5bec71f
Binary files /dev/null and b/media/tiny_mce/plugins/fullpage/images/move_down.gif differ
diff --git a/media/tiny_mce/plugins/fullpage/images/move_up.gif b/media/tiny_mce/plugins/fullpage/images/move_up.gif
new file mode 100755 (executable)
index 0000000..2f489c9
Binary files /dev/null and b/media/tiny_mce/plugins/fullpage/images/move_up.gif differ
diff --git a/media/tiny_mce/plugins/fullpage/images/remove.gif b/media/tiny_mce/plugins/fullpage/images/remove.gif
new file mode 100755 (executable)
index 0000000..299c684
Binary files /dev/null and b/media/tiny_mce/plugins/fullpage/images/remove.gif differ
diff --git a/media/tiny_mce/plugins/fullpage/jscripts/fullpage.js b/media/tiny_mce/plugins/fullpage/jscripts/fullpage.js
new file mode 100755 (executable)
index 0000000..b20e77c
--- /dev/null
@@ -0,0 +1,580 @@
+//\r
+\r
+var defaultDocTypes = \r
+       'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' +\r
+       'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' +\r
+       'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' +\r
+       'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">,' +\r
+       'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' +\r
+       'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' +\r
+       'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';\r
+\r
+var defaultEncodings = \r
+       'Western european (iso-8859-1)=iso-8859-1,' +\r
+       'Central European (iso-8859-2)=iso-8859-2,' +\r
+       'Unicode (UTF-8)=utf-8,' +\r
+       'Chinese traditional (Big5)=big5,' +\r
+       'Cyrillic (iso-8859-5)=iso-8859-5,' +\r
+       'Japanese (iso-2022-jp)=iso-2022-jp,' +\r
+       'Greek (iso-8859-7)=iso-8859-7,' +\r
+       'Korean (iso-2022-kr)=iso-2022-kr,' +\r
+       'ASCII (us-ascii)=us-ascii';\r
+\r
+var defaultMediaTypes = \r
+       'all=all,' +\r
+       'screen=screen,' +\r
+       'print=print,' +\r
+       'tty=tty,' +\r
+       'tv=tv,' +\r
+       'projection=projection,' +\r
+       'handheld=handheld,' +\r
+       'braille=braille,' +\r
+       'aural=aural';\r
+\r
+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';\r
+var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px';\r
+\r
+var addMenuLayer = new MCLayer("addmenu");\r
+var lastElementType = null;\r
+var topDoc;\r
+\r
+function init() {\r
+       var f = document.forms['fullpage'];\r
+       var i, p, doctypes, encodings, mediaTypes, fonts;\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+\r
+       // Setup doctype select box\r
+       doctypes = tinyMCE.getParam("fullpage_doctypes", defaultDocTypes).split(',');\r
+       for (i=0; i<doctypes.length; i++) {\r
+               p = doctypes[i].split('=');\r
+\r
+               if (p.length > 1)\r
+                       addSelectValue(f, 'doctypes', p[0], p[1]);\r
+       }\r
+\r
+       // Setup fonts select box\r
+       fonts = tinyMCE.getParam("fullpage_fonts", defaultFontNames).split(';');\r
+       for (i=0; i<fonts.length; i++) {\r
+               p = fonts[i].split('=');\r
+\r
+               if (p.length > 1)\r
+                       addSelectValue(f, 'fontface', p[0], p[1]);\r
+       }\r
+\r
+       // Setup fontsize select box\r
+       fonts = tinyMCE.getParam("fullpage_fontsizes", defaultFontSizes).split(',');\r
+       for (i=0; i<fonts.length; i++)\r
+               addSelectValue(f, 'fontsize', fonts[i], fonts[i]);\r
+\r
+       // Setup mediatype select boxs\r
+       mediaTypes = tinyMCE.getParam("fullpage_media_types", defaultMediaTypes).split(',');\r
+       for (i=0; i<mediaTypes.length; i++) {\r
+               p = mediaTypes[i].split('=');\r
+\r
+               if (p.length > 1) {\r
+                       addSelectValue(f, 'element_style_media', p[0], p[1]);\r
+                       addSelectValue(f, 'element_link_media', p[0], p[1]);\r
+               }\r
+       }\r
+\r
+       // Setup encodings select box\r
+       encodings = tinyMCE.getParam("fullpage_encodings", defaultEncodings).split(',');\r
+       for (i=0; i<encodings.length; i++) {\r
+               p = encodings[i].split('=');\r
+\r
+               if (p.length > 1) {\r
+                       addSelectValue(f, 'docencoding', p[0], p[1]);\r
+                       addSelectValue(f, 'element_script_charset', p[0], p[1]);\r
+                       addSelectValue(f, 'element_link_charset', p[0], p[1]);\r
+               }\r
+       }\r
+\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+       document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color');\r
+       //document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color');\r
+       document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color');\r
+       document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color');\r
+       document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor');\r
+       document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage');\r
+       document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage');\r
+       document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage');\r
+       document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage');\r
+\r
+       // Resize some elements\r
+       if (isVisible('stylesheetbrowser'))\r
+               document.getElementById('stylesheet').style.width = '220px';\r
+\r
+       if (isVisible('link_href_browser'))\r
+               document.getElementById('element_link_href').style.width = '230px';\r
+\r
+       if (isVisible('bgimage_browser'))\r
+               document.getElementById('bgimage').style.width = '210px';\r
+\r
+       // Create iframe\r
+       var iframe = document.createElement('iframe');\r
+\r
+       iframe.id = 'tempFrame';\r
+       iframe.style.display = 'none';\r
+       iframe.src = tinyMCE.baseURL + "/plugins/fullpage/blank.htm";\r
+\r
+       document.body.appendChild(iframe);\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+}\r
+\r
+function setupIframe(doc) {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var hc = inst.fullpageTopContent;\r
+       var f = document.forms[0];\r
+       var xmlVer, xmlEnc, docType;\r
+       var nodes, i, x, name, value, tmp, l;\r
+\r
+       // Keep it from not loading/executing stuff\r
+       hc = hc.replace(/<script>/gi, '<script type="text/javascript">');\r
+       hc = hc.replace(/\ssrc=/gi, " mce_src=");\r
+       hc = hc.replace(/\shref=/gi, " mce_href=");\r
+       hc = hc.replace(/\stype=/gi, " mce_type=");\r
+       hc = hc.replace(/<script/gi, '<script type="text/unknown" ');\r
+\r
+       // Add end to make it DOM parseable\r
+       hc += '</body></html>';\r
+\r
+       topDoc = doc;\r
+       doc.open();\r
+       doc.write(hc);\r
+       doc.close();\r
+\r
+       // ------- Setup options for genral tab\r
+\r
+       // Parse xml and doctype\r
+       xmlVer = getReItem(/<\?\s*?xml.*?version\s*?=\s*?"(.*?)".*?\?>/gi, hc, 1);\r
+       xmlEnc = getReItem(/<\?\s*?xml.*?encoding\s*?=\s*?"(.*?)".*?\?>/gi, hc, 1);\r
+       docType = getReItem(/<\!DOCTYPE.*?>/gi, hc, 0);\r
+       f.langcode.value = getReItem(/lang="(.*?)"/gi, hc, 1);\r
+\r
+       // Get title\r
+       f.metatitle.value = tinyMCE.entityDecode(getReItem(/<title>(.*?)<\/title>/gi, hc, 1));\r
+\r
+       // Check for meta encoding\r
+       nodes = doc.getElementsByTagName("meta");\r
+       for (i=0; i<nodes.length; i++) {\r
+               name = tinyMCE.getAttrib(nodes[i], 'name');\r
+               value = tinyMCE.getAttrib(nodes[i], 'content');\r
+               httpEquiv = tinyMCE.getAttrib(nodes[i], 'httpEquiv');\r
+\r
+               switch (name.toLowerCase()) {\r
+                       case "keywords":\r
+                               f.metakeywords.value = value;\r
+                               break;\r
+\r
+                       case "description":\r
+                               f.metadescription.value = value;\r
+                               break;\r
+\r
+                       case "author":\r
+                               f.metaauthor.value = value;\r
+                               break;\r
+\r
+                       case "copyright":\r
+                               f.metacopyright.value = value;\r
+                               break;\r
+\r
+                       case "robots":\r
+                               selectByValue(f, 'metarobots', value, true, true);\r
+                               break;\r
+               }\r
+\r
+               switch (httpEquiv.toLowerCase()) {\r
+                       case "content-type":\r
+                               tmp = getReItem(/charset\s*=\s*(.*)\s*/gi, value, 1);\r
+\r
+                               // Override XML encoding\r
+                               if (tmp != "")\r
+                                       xmlEnc = tmp;\r
+\r
+                               break;\r
+               }\r
+       }\r
+\r
+       selectByValue(f, 'doctypes', docType, true, true);\r
+       selectByValue(f, 'docencoding', xmlEnc, true, true);\r
+       selectByValue(f, 'langdir', tinyMCE.getAttrib(doc.body, 'dir'), true, true);\r
+\r
+       if (xmlVer != '')\r
+               f.xml_pi.checked = true;\r
+\r
+       // ------- Setup options for appearance tab\r
+\r
+       // Get primary stylesheet\r
+       nodes = doc.getElementsByTagName("link");\r
+       for (i=0; i<nodes.length; i++) {\r
+               l = nodes[i];\r
+               tmp = tinyMCE.getAttrib(l, 'media');\r
+\r
+               if (tinyMCE.getAttrib(l, 'mce_type') == "text/css" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCE.getAttrib(l, 'rel') == "stylesheet") {\r
+                       f.stylesheet.value = tinyMCE.getAttrib(l, 'mce_href');\r
+                       break;\r
+               }\r
+       }\r
+\r
+       // Get from style elements\r
+       nodes = doc.getElementsByTagName("style");\r
+       for (i=0; i<nodes.length; i++) {\r
+               tmp = parseStyleElement(nodes[i]);\r
+\r
+               for (x=0; x<tmp.length; x++) {\r
+               //      if (tmp[x].rule.indexOf('a:hover') != -1 && tmp[x].data['color'])\r
+               //              f.hover_color.value = tmp[x].data['color'];\r
+\r
+                       if (tmp[x].rule.indexOf('a:visited') != -1 && tmp[x].data['color'])\r
+                               f.visited_color.value = tmp[x].data['color'];\r
+\r
+                       if (tmp[x].rule.indexOf('a:link') != -1 && tmp[x].data['color'])\r
+                               f.link_color.value = tmp[x].data['color'];\r
+\r
+                       if (tmp[x].rule.indexOf('a:active') != -1 && tmp[x].data['color'])\r
+                               f.active_color.value = tmp[x].data['color'];\r
+               }\r
+       }\r
+\r
+       // Get from body attribs\r
+\r
+/*     f.leftmargin.value = tinyMCE.getAttrib(doc.body, "leftmargin");\r
+       f.rightmargin.value = tinyMCE.getAttrib(doc.body, "rightmargin");\r
+       f.topmargin.value = tinyMCE.getAttrib(doc.body, "topmargin");\r
+       f.bottommargin.value = tinyMCE.getAttrib(doc.body, "bottommargin");*/\r
+       f.textcolor.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "text"));\r
+       f.active_color.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "alink"));\r
+       f.link_color.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "link"));\r
+       f.visited_color.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "vlink"));\r
+       f.bgcolor.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "bgcolor"));\r
+       f.bgimage.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "background"));\r
+\r
+       // Get from style info\r
+       var style = tinyMCE.parseStyle(tinyMCE.getAttrib(doc.body, 'style'));\r
+\r
+       if (style['font-family'])\r
+               selectByValue(f, 'fontface', style['font-family'], true, true);\r
+       else\r
+               selectByValue(f, 'fontface', tinyMCE.getParam("fullpage_default_fontface", ""), true, true);\r
+\r
+       if (style['font-size'])\r
+               selectByValue(f, 'fontsize', style['font-size'], true, true);\r
+       else\r
+               selectByValue(f, 'fontsize', tinyMCE.getParam("fullpage_default_fontsize", ""), true, true);\r
+\r
+       if (style['color'])\r
+               f.textcolor.value = convertRGBToHex(style['color']);\r
+\r
+       if (style['background-image'])\r
+               f.bgimage.value = style['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+\r
+       if (style['background-color'])\r
+               f.bgcolor.value = convertRGBToHex(style['background-color']);\r
+\r
+       if (style['margin']) {\r
+               tmp = style['margin'].replace(/[^0-9 ]/g, '');\r
+               tmp = tmp.split(/ +/);\r
+               f.topmargin.value = tmp.length > 0 ? tmp[0] : '';\r
+               f.rightmargin.value = tmp.length > 1 ? tmp[1] : tmp[0];\r
+               f.bottommargin.value = tmp.length > 2 ? tmp[2] : tmp[0];\r
+               f.leftmargin.value = tmp.length > 3 ? tmp[3] : tmp[0];\r
+       }\r
+\r
+       if (style['margin-left'])\r
+               f.leftmargin.value = style['margin-left'].replace(/[^0-9]/g, '');\r
+\r
+       if (style['margin-right'])\r
+               f.rightmargin.value = style['margin-right'].replace(/[^0-9]/g, '');\r
+\r
+       if (style['margin-top'])\r
+               f.topmargin.value = style['margin-top'].replace(/[^0-9]/g, '');\r
+\r
+       if (style['margin-bottom'])\r
+               f.bottommargin.value = style['margin-bottom'].replace(/[^0-9]/g, '');\r
+\r
+       f.style.value = tinyMCE.serializeStyle(style);\r
+\r
+       updateColor('textcolor_pick', 'textcolor');\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+       updateColor('visited_color_pick', 'visited_color');\r
+       updateColor('active_color_pick', 'active_color');\r
+       updateColor('link_color_pick', 'link_color');\r
+       //updateColor('hover_color_pick', 'hover_color');\r
+}\r
+\r
+function updateAction() {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var f = document.forms[0];\r
+       var nl, i, h, v, s, head, html, l, tmp, addlink = true;\r
+\r
+       head = topDoc.getElementsByTagName('head')[0];\r
+\r
+       // Fix scripts without a type\r
+       nl = topDoc.getElementsByTagName('script');\r
+       for (i=0; i<nl.length; i++) {\r
+               if (tinyMCE.getAttrib(nl[i], 'mce_type') == '')\r
+                       nl[i].setAttribute('mce_type', 'text/javascript');\r
+       }\r
+\r
+       // Get primary stylesheet\r
+       nl = topDoc.getElementsByTagName("link");\r
+       for (i=0; i<nl.length; i++) {\r
+               l = nl[i];\r
+\r
+               tmp = tinyMCE.getAttrib(l, 'media');\r
+\r
+               if (tinyMCE.getAttrib(l, 'mce_type') == "text/css" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCE.getAttrib(l, 'rel') == "stylesheet") {\r
+                       addlink = false;\r
+\r
+                       if (f.stylesheet.value == '')\r
+                               l.parentNode.removeChild(l);\r
+                       else\r
+                               l.setAttribute('mce_href', f.stylesheet.value);\r
+\r
+                       break;\r
+               }\r
+       }\r
+\r
+       // Add new link\r
+       if (f.stylesheet.value != '') {\r
+               l = topDoc.createElement('link');\r
+\r
+               l.setAttribute('mce_type', 'text/css');\r
+               l.setAttribute('mce_href', f.stylesheet.value);\r
+               l.setAttribute('rel', 'stylesheet');\r
+\r
+               head.appendChild(l);\r
+       }\r
+\r
+       setMeta(head, 'keywords', f.metakeywords.value);\r
+       setMeta(head, 'description', f.metadescription.value);\r
+       setMeta(head, 'author', f.metaauthor.value);\r
+       setMeta(head, 'copyright', f.metacopyright.value);\r
+       setMeta(head, 'robots', getSelectValue(f, 'metarobots'));\r
+       setMeta(head, 'Content-Type', getSelectValue(f, 'docencoding'));\r
+\r
+       topDoc.body.dir = getSelectValue(f, 'langdir');\r
+       topDoc.body.style.cssText = f.style.value;\r
+\r
+       topDoc.body.setAttribute('vLink', f.visited_color.value);\r
+       topDoc.body.setAttribute('link', f.link_color.value);\r
+       topDoc.body.setAttribute('text', f.textcolor.value);\r
+       topDoc.body.setAttribute('aLink', f.active_color.value);\r
+\r
+       topDoc.body.style.fontFamily = getSelectValue(f, 'fontface');\r
+       topDoc.body.style.fontSize = getSelectValue(f, 'fontsize');\r
+       topDoc.body.style.backgroundColor = f.bgcolor.value;\r
+\r
+       if (f.leftmargin.value != '')\r
+               topDoc.body.style.marginLeft = f.leftmargin.value + 'px';\r
+\r
+       if (f.rightmargin.value != '')\r
+               topDoc.body.style.marginRight = f.rightmargin.value + 'px';\r
+\r
+       if (f.bottommargin.value != '')\r
+               topDoc.body.style.marginBottom = f.bottommargin.value + 'px';\r
+\r
+       if (f.topmargin.value != '')\r
+               topDoc.body.style.marginTop = f.topmargin.value + 'px';\r
+\r
+       html = topDoc.getElementsByTagName('html')[0];\r
+       html.setAttribute('lang', f.langcode.value);\r
+       html.setAttribute('xml:lang', f.langcode.value);\r
+\r
+       if (f.bgimage.value != '')\r
+               topDoc.body.style.backgroundImage = "url('" + f.bgimage.value + "')";\r
+       else\r
+               topDoc.body.style.backgroundImage = '';\r
+\r
+       inst.cleanup.addRuleStr('-title,meta[http-equiv|name|content],base[href|target],link[href|rel|type|title|media],style[type],script[type|language|src],html[lang|xml:lang|xmlns],body[style|dir|vlink|link|text|alink],head');\r
+\r
+       h = inst.cleanup.serializeNodeAsHTML(topDoc.documentElement);\r
+\r
+       h = h.substring(0, h.lastIndexOf('</body>'));\r
+\r
+       if (h.indexOf('<title>') == -1)\r
+               h = h.replace(/<head.*?>/, '$&\n' + '<title>' + inst.cleanup.xmlEncode(f.metatitle.value) + '</title>');\r
+       else\r
+               h = h.replace(/<title>(.*?)<\/title>/, '<title>' + inst.cleanup.xmlEncode(f.metatitle.value) + '</title>');\r
+\r
+       if ((v = getSelectValue(f, 'doctypes')) != '')\r
+               h = v + '\n' + h;\r
+\r
+       if (f.xml_pi.checked) {\r
+               s = '<?xml version="1.0"';\r
+\r
+               if ((v = getSelectValue(f, 'docencoding')) != '')\r
+                       s += ' encoding="' + v + '"';\r
+\r
+               s += '?>\n';\r
+               h = s + h;\r
+       }\r
+\r
+       inst.fullpageTopContent = h;\r
+\r
+       tinyMCEPopup.execCommand('mceFullPageUpdate', false, '');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function setMeta(he, k, v) {\r
+       var nl, i, m;\r
+\r
+       nl = he.getElementsByTagName('meta');\r
+       for (i=0; i<nl.length; i++) {\r
+               if (k == 'Content-Type' && tinyMCE.getAttrib(nl[i], 'http-equiv') == k) {\r
+                       if (v == '')\r
+                               nl[i].parentNode.removeChild(nl[i]);\r
+                       else\r
+                               nl[i].setAttribute('content', "text/html; charset=" + v);\r
+\r
+                       return;\r
+               }\r
+\r
+               if (tinyMCE.getAttrib(nl[i], 'name') == k) {\r
+                       if (v == '')\r
+                               nl[i].parentNode.removeChild(nl[i]);\r
+                       else\r
+                               nl[i].setAttribute('content', v);\r
+                       return;\r
+               }\r
+       }\r
+\r
+       if (v == '')\r
+               return;\r
+\r
+       m = topDoc.createElement('meta');\r
+\r
+       if (k == 'Content-Type')\r
+               m.httpEquiv = k;\r
+       else\r
+               m.setAttribute('name', k);\r
+\r
+       m.setAttribute('content', v);\r
+       he.appendChild(m);\r
+}\r
+\r
+function parseStyleElement(e) {\r
+       var v = e.innerHTML;\r
+       var p, i, r;\r
+\r
+       v = v.replace(/<!--/gi, '');\r
+       v = v.replace(/-->/gi, '');\r
+       v = v.replace(/[\n\r]/gi, '');\r
+       v = v.replace(/\s+/gi, ' ');\r
+\r
+       r = new Array();\r
+       p = v.split(/{|}/);\r
+\r
+       for (i=0; i<p.length; i+=2) {\r
+               if (p[i] != "")\r
+                       r[r.length] = {rule : tinyMCE.trim(p[i]), data : tinyMCE.parseStyle(p[i+1])};\r
+       }\r
+\r
+       return r;\r
+}\r
+\r
+function serializeStyleElement(d) {\r
+       var i, s, st;\r
+\r
+       s = '<!--\n';\r
+\r
+       for (i=0; i<d.length; i++) {\r
+               s += d[i].rule + ' {\n';\r
+\r
+               st = tinyMCE.serializeStyle(d[i].data);\r
+\r
+               if (st != '')\r
+                       st += ';';\r
+\r
+               s += st.replace(/;/g, ';\n');\r
+               s += '}\n';\r
+\r
+               if (i != d.length - 1)\r
+                       s += '\n';\r
+       }\r
+\r
+       s += '\n-->';\r
+\r
+       return s;\r
+}\r
+\r
+function getReItem(r, s, i) {\r
+       var c = r.exec(s);\r
+\r
+       if (c && c.length > i)\r
+               return c[i];\r
+\r
+       return '';\r
+}\r
+\r
+function changedStyleField(field) {\r
+       //alert(field.id);\r
+}\r
+\r
+function showAddMenu() {\r
+       var re = document.getElementById('addbutton');\r
+\r
+       addMenuLayer.moveRelativeTo(re, 'tr');\r
+       if (addMenuLayer.isMSIE)\r
+               addMenuLayer.moveBy(2, 0);\r
+\r
+       addMenuLayer.show();\r
+       addMenuLayer.setAutoHide(true, hideAddMenu);\r
+       addMenuLayer.addCSSClass(re, 'selected');\r
+}\r
+\r
+function hideAddMenu(l, e, mx, my) {\r
+       var re = document.getElementById('addbutton');\r
+       addMenuLayer.removeCSSClass(re, 'selected');\r
+}\r
+\r
+function addHeadElm(type) {\r
+       var le = document.getElementById('headlist');\r
+       var re = document.getElementById('addbutton');\r
+       var te = document.getElementById(type + '_element');\r
+\r
+       if (lastElementType)\r
+               lastElementType.style.display = 'none';\r
+\r
+       te.style.display = 'block';\r
+\r
+       lastElementType = te;\r
+\r
+       addMenuLayer.hide();\r
+       addMenuLayer.removeCSSClass(re, 'selected');\r
+\r
+       document.getElementById(type + '_updateelement').value = tinyMCE.getLang('lang_insert', 'Insert', true);\r
+\r
+       le.size = 10;\r
+}\r
+\r
+function updateHeadElm(item) {\r
+       var type = item.substring(0, item.indexOf('_'));\r
+       var le = document.getElementById('headlist');\r
+       var re = document.getElementById('addbutton');\r
+       var te = document.getElementById(type + '_element');\r
+\r
+       if (lastElementType)\r
+               lastElementType.style.display = 'none';\r
+\r
+       te.style.display = 'block';\r
+\r
+       lastElementType = te;\r
+\r
+       addMenuLayer.hide();\r
+       addMenuLayer.removeCSSClass(re, 'selected');\r
+\r
+       document.getElementById(type + '_updateelement').value = tinyMCE.getLang('lang_update', 'Update', true);\r
+\r
+       le.size = 10;\r
+}\r
+\r
+function cancelElementUpdate() {\r
+       var le = document.getElementById('headlist');\r
+\r
+       if (lastElementType)\r
+               lastElementType.style.display = 'none';\r
+\r
+       le.size = 26;\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/fullpage/langs/en.js b/media/tiny_mce/plugins/fullpage/langs/en.js
new file mode 100755 (executable)
index 0000000..1864d3d
--- /dev/null
@@ -0,0 +1,92 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('fullpage',{\r
+       title : 'Document properties',\r
+       desc : 'Document properties',\r
+       meta_tab : 'General',\r
+       appearance_tab : 'Appearance',\r
+       advanced_tab : 'Advanced',\r
+       meta_props : 'Meta information',\r
+       langprops : 'Language and encoding',\r
+       meta_title : 'Title',\r
+       meta_keywords : 'Keywords',\r
+       meta_description : 'Description',\r
+       meta_robots : 'Robots',\r
+       doctypes : 'Doctype',\r
+       langcode : 'Language code',\r
+       langdir : 'Language direction',\r
+       ltr : 'Left to right',\r
+       rtl : 'Right to left',\r
+       xml_pi : 'XML declaration',\r
+       encoding : 'Character encoding',\r
+       appearance_bgprops : 'Background properties',\r
+       appearance_marginprops : 'Body margins',\r
+       appearance_linkprops : 'Link colors',\r
+       appearance_textprops : 'Text properties',\r
+       bgcolor : 'Background color',\r
+       bgimage : 'Background image',\r
+       left_margin : 'Left margin',\r
+       right_margin : 'Right margin',\r
+       top_margin : 'Top margin',\r
+       bottom_margin : 'Bottom margin',\r
+       text_color : 'Text color',\r
+       font_size : 'Font size',\r
+       font_face : 'Font face',\r
+       link_color : 'Link color',\r
+       hover_color : 'Hover color',\r
+       visited_color : 'Visited color',\r
+       active_color : 'Active color',\r
+       textcolor : 'Color',\r
+       fontsize : 'Font size',\r
+       fontface : 'Font family',\r
+       meta_index_follow : 'Index and follow the links',\r
+       meta_index_nofollow : 'Index and don\'t follow the links',\r
+       meta_noindex_follow : 'Do not index but follow the links',\r
+       meta_noindex_nofollow : 'Do not index and don\'t follow the links',\r
+       appearance_style : 'Stylesheet and style properties',\r
+       stylesheet : 'Stylesheet',\r
+       style : 'Style',\r
+       author : 'Author',\r
+       copyright : 'Copyright',\r
+       add : 'Add new element',\r
+       remove : 'Remove selected element',\r
+       moveup : 'Move selected element up',\r
+       movedown : 'Move selected element down',\r
+       head_elements : 'Head elements',\r
+       info : 'Information',\r
+       info_text : '',\r
+       add_title : 'Title element',\r
+       add_meta : 'Meta element',\r
+       add_script : 'Script element',\r
+       add_style : 'Style element',\r
+       add_link : 'Link element',\r
+       add_base : 'Base element',\r
+       add_comment : 'Comment node',\r
+       title_element : 'Title element',\r
+       script_element : 'Script element',\r
+       style_element : 'Style element',\r
+       base_element : 'Base element',\r
+       link_element : 'Link element',\r
+       meta_element : 'Meta element',\r
+       comment_element : 'Comment',\r
+       src : 'Src',\r
+       language : 'Language',\r
+       href : 'Href',\r
+       target : 'Target',\r
+       rel : 'Rel',\r
+       type : 'Type',\r
+       charset : 'Charset',\r
+       defer : 'Defer',\r
+       media : 'Media',\r
+       properties : 'Properties',\r
+       name : 'Name',\r
+       value : 'Value',\r
+       content : 'Content',\r
+       rel : 'Rel',\r
+       rev : 'Rev',\r
+       hreflang : 'Href lang',\r
+       general_props : 'General',\r
+       advanced_props : 'Advanced',\r
+       delta_width : 0,\r
+       delta_height : 0\r
+});\r
diff --git a/media/tiny_mce/plugins/fullscreen/css/page.css b/media/tiny_mce/plugins/fullscreen/css/page.css
new file mode 100755 (executable)
index 0000000..94f9deb
--- /dev/null
@@ -0,0 +1,21 @@
+/* This class restores all CSS properties to that absolute positioning of fullscreen mode is correct */\r
+.mceFullscreenPos {\r
+       display: block !important;\r
+       position: static !important;\r
+       left: 0 !important;\r
+       top: 0 !important;\r
+       bottom: auto !important;\r
+       right: auto !important;\r
+       width: auto !important;\r
+       height: auto !important;\r
+       margin: 0 !important;\r
+       padding: 0 !important;\r
+       border: 0 !important;\r
+       overflow: visible;\r
+       z-index: 1 !important;\r
+       clear: both;\r
+}\r
+\r
+body.mceFullscreen {\r
+       overflow: hidden !important;\r
+}\r
diff --git a/media/tiny_mce/plugins/fullscreen/editor_plugin.js b/media/tiny_mce/plugins/fullscreen/editor_plugin.js
new file mode 100755 (executable)
index 0000000..4adb57e
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('fullscreen');var TinyMCE_FullScreenPlugin={getInfo:function(){return{longname:'Fullscreen',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(!tinyMCE.settings['fullscreen_skip_plugin_css'])tinyMCE.importCSS(inst.getContainerWin().document,tinyMCE.baseURL+"/plugins/fullscreen/css/page.css")},getControlHTML:function(cn){switch(cn){case"fullscreen":return tinyMCE.getButtonHTML(cn,'lang_fullscreen_desc','{$pluginurl}/images/fullscreen.gif','mceFullScreen')}return""},execCommand:function(editor_id,element,command,user_interface,value){var inst;switch(command){case"mceFullScreen":inst=tinyMCE.getInstanceById(editor_id);if(tinyMCE.getParam('fullscreen_new_window'))this._toggleFullscreenWin(inst);else this._toggleFullscreen(inst);return true}return false},_toggleFullscreenWin:function(inst){if(tinyMCE.getParam('fullscreen_is_enabled')){window.opener.tinyMCE.execInstanceCommand(tinyMCE.getParam('fullscreen_editor_id'),'mceSetContent',false,tinyMCE.getContent(inst.editorId));top.close()}else{tinyMCE.setWindowArg('editor_id',inst.editorId);var win=window.open(tinyMCE.baseURL+"/plugins/fullscreen/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{win.resizeTo(screen.availWidth,screen.availHeight)}catch(e){}}},_toggleFullscreen:function(inst){var ds=inst.getData('fullscreen'),editorContainer,tableElm,iframe,vp,cw,cd,re,w,h,si,blo,delta=0,cell,row,fcml,bcml;cw=inst.getContainerWin();cd=cw.document;editorContainer=cd.getElementById(inst.editorId+'_parent');tableElm=editorContainer.firstChild;iframe=inst.iframeElement;re=cd.getElementById(inst.editorId+'_resize');blo=document.getElementById('mce_fullscreen_blocker');fcm=new TinyMCE_Layer(inst.editorId+'_fcMenu');fcml=new TinyMCE_Layer(inst.editorId+'_fcMenu');bcml=new TinyMCE_Layer(inst.editorId+'_bcMenu');if(fcml.exists()&&fcml.isVisible()){tinyMCE.switchClass(inst.editorId+'_forecolor','mceMenuButton');fcml.hide()}if(bcml.exists()&&bcml.isVisible()){tinyMCE.switchClass(inst.editorId+'_backcolor','mceMenuButton');bcml.hide()}if(!ds.enabled){if(inst.toolbarElement){delta+=inst.toolbarElement.offsetHeight;cell=tableElm.tBodies[0].insertRow(0).insertCell(-1);cell.className='mceToolbarTop';cell.nowrap=true;ds.oldToolbarParent=inst.toolbarElement.parentNode;ds.toolbarHolder=document.createTextNode('...');cell.appendChild(ds.oldToolbarParent.replaceChild(ds.toolbarHolder,inst.toolbarElement))}ds.parents=[];vp=tinyMCE.getViewPort(cw);ds.scrollX=vp.left;ds.scrollY=vp.top;if(!tinyMCE.isOpera)tinyMCE.addCSSClass(cd.body,'mceFullscreen');tinyMCE.getParentNode(tableElm.parentNode,function(n){if(n.nodeName=='BODY')return true;if(n.nodeType==1)tinyMCE.addCSSClass(n,'mceFullscreenPos');return false});if(re)re.style.display='none';vp=tinyMCE.getViewPort(cw);ds.oldWidth=iframe.style.width?iframe.style.width:iframe.offsetWidth;ds.oldHeight=iframe.style.height?iframe.style.height:iframe.offsetHeight;ds.oldTWidth=tableElm.style.width?tableElm.style.width:tableElm.offsetWidth;ds.oldTHeight=tableElm.style.height?tableElm.style.height:tableElm.offsetHeight;if(ds.oldWidth&&ds.oldWidth.indexOf)ds.oldTWidth=ds.oldWidth.indexOf('%')!=-1?ds.oldWidth:ds.oldTWidth;if(!blo&&tinyMCE.isRealIE){blo=tinyMCE.createTag(document,'iframe',{id:'mce_fullscreen_blocker',src:'about:blank',frameBorder:0,width:vp.width,height:vp.height,style:'display: block; position: absolute; left: 0; top: 0; z-index: 999; margin: 0; padding: 0;'});document.body.appendChild(blo)}tableElm.style.position='absolute';tableElm.style.zIndex=1000;tableElm.style.left=tableElm.style.top='0';tableElm.style.width=vp.width+'px';tableElm.style.height=vp.height+'px';if(tinyMCE.isRealIE){iframe.style.width=vp.width+'px';iframe.style.height=vp.height+'px';w=iframe.parentNode.clientWidth-(tableElm.offsetWidth-vp.width);h=iframe.parentNode.clientHeight-(tableElm.offsetHeight-vp.height)}else{w=iframe.parentNode.clientWidth;h=iframe.parentNode.clientHeight}iframe.style.width=w+"px";iframe.style.height=(h+delta)+"px";tinyMCE.switchClass(inst.editorId+'_fullscreen','mceButtonSelected');ds.enabled=true;inst.useCSS=false}else{if(inst.toolbarElement){row=inst.toolbarElement.parentNode.parentNode;row.parentNode.removeChild(row);ds.oldToolbarParent.replaceChild(inst.toolbarElement,ds.toolbarHolder);ds.oldToolbarParent=null;ds.toolbarHolder=null}if(blo)blo.parentNode.removeChild(blo);si=0;tinyMCE.getParentNode(tableElm.parentNode,function(n){if(n.nodeName=='BODY')return true;if(n.nodeType==1)tinyMCE.removeCSSClass(n,'mceFullscreenPos')});if(re&&tinyMCE.getParam("theme_advanced_resizing",false))re.style.display='block';tableElm.style.position='static';tableElm.style.zIndex='';tableElm.style.width='';tableElm.style.height='';tableElm.style.width=ds.oldTWidth?ds.oldTWidth:'';tableElm.style.height=ds.oldTHeight?ds.oldTHeight:'';iframe.style.width=ds.oldWidth?ds.oldWidth:'';iframe.style.height=ds.oldHeight?ds.oldHeight:'';tinyMCE.switchClass(inst.editorId+'_fullscreen','mceButtonNormal');ds.enabled=false;tinyMCE.removeCSSClass(cd.body,'mceFullscreen');cw.scrollTo(ds.scrollX,ds.scrollY);inst.useCSS=false}},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(tinyMCE.getParam('fullscreen_is_enabled'))tinyMCE.switchClass(editor_id+'_fullscreen','mceButtonSelected');return true}};tinyMCE.addPlugin("fullscreen",TinyMCE_FullScreenPlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/fullscreen/editor_plugin_src.js b/media/tiny_mce/plugins/fullscreen/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..0f8b83a
--- /dev/null
@@ -0,0 +1,230 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('fullscreen');\r
+\r
+var TinyMCE_FullScreenPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Fullscreen',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               if (!tinyMCE.settings['fullscreen_skip_plugin_css'])\r
+                       tinyMCE.importCSS(inst.getContainerWin().document, tinyMCE.baseURL + "/plugins/fullscreen/css/page.css");\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "fullscreen":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_fullscreen_desc', '{$pluginurl}/images/fullscreen.gif', 'mceFullScreen');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               var inst;\r
+\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceFullScreen":\r
+                               inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+                               if (tinyMCE.getParam('fullscreen_new_window'))\r
+                                       this._toggleFullscreenWin(inst);\r
+                               else\r
+                                       this._toggleFullscreen(inst);\r
+\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       },\r
+\r
+       _toggleFullscreenWin : function(inst) {\r
+               if (tinyMCE.getParam('fullscreen_is_enabled')) {\r
+                       // In fullscreen mode\r
+                       window.opener.tinyMCE.execInstanceCommand(tinyMCE.getParam('fullscreen_editor_id'), 'mceSetContent', false, tinyMCE.getContent(inst.editorId));\r
+                       top.close();\r
+               } else {\r
+                       tinyMCE.setWindowArg('editor_id', inst.editorId);\r
+\r
+                       var win = window.open(tinyMCE.baseURL + "/plugins/fullscreen/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight);\r
+                       try { win.resizeTo(screen.availWidth, screen.availHeight); } catch (e) {}\r
+               }\r
+       },\r
+\r
+       _toggleFullscreen : function(inst) {\r
+               var ds = inst.getData('fullscreen'), editorContainer, tableElm, iframe, vp, cw, cd, re, w, h, si, blo, delta = 0, cell, row, fcml, bcml;\r
+\r
+               cw = inst.getContainerWin();\r
+               cd = cw.document;\r
+               editorContainer = cd.getElementById(inst.editorId + '_parent');\r
+               tableElm = editorContainer.firstChild;\r
+               iframe = inst.iframeElement;\r
+               re = cd.getElementById(inst.editorId + '_resize');\r
+               blo = document.getElementById('mce_fullscreen_blocker');\r
+               fcm = new TinyMCE_Layer(inst.editorId + '_fcMenu');\r
+               fcml = new TinyMCE_Layer(inst.editorId + '_fcMenu');\r
+               bcml = new TinyMCE_Layer(inst.editorId + '_bcMenu');\r
+\r
+               if (fcml.exists() && fcml.isVisible()) {\r
+                       tinyMCE.switchClass(inst.editorId + '_forecolor', 'mceMenuButton');\r
+                       fcml.hide();\r
+               }\r
+\r
+               if (bcml.exists() && bcml.isVisible()) {\r
+                       tinyMCE.switchClass(inst.editorId + '_backcolor', 'mceMenuButton');\r
+                       bcml.hide();\r
+               }\r
+\r
+               if (!ds.enabled) {\r
+                       // Handle External Toolbar\r
+                       if (inst.toolbarElement) {\r
+                               delta += inst.toolbarElement.offsetHeight;\r
+\r
+                               cell = tableElm.tBodies[0].insertRow(0).insertCell(-1);\r
+                               cell.className = 'mceToolbarTop';\r
+                               cell.nowrap = true;\r
+\r
+                               ds.oldToolbarParent = inst.toolbarElement.parentNode;\r
+                               ds.toolbarHolder = document.createTextNode('...');\r
+\r
+                               cell.appendChild(ds.oldToolbarParent.replaceChild(ds.toolbarHolder, inst.toolbarElement));\r
+                       }\r
+\r
+                       ds.parents = [];\r
+\r
+                       vp = tinyMCE.getViewPort(cw);\r
+                       ds.scrollX = vp.left;\r
+                       ds.scrollY = vp.top;\r
+\r
+                       // Opera has a bug restoring scrollbars\r
+                       if (!tinyMCE.isOpera)\r
+                               tinyMCE.addCSSClass(cd.body, 'mceFullscreen');\r
+\r
+                       tinyMCE.getParentNode(tableElm.parentNode, function (n) {\r
+                               if (n.nodeName == 'BODY')\r
+                                       return true;\r
+\r
+                               if (n.nodeType == 1)\r
+                                       tinyMCE.addCSSClass(n, 'mceFullscreenPos');\r
+\r
+                               return false;\r
+                       });\r
+\r
+                       if (re)\r
+                               re.style.display = 'none';\r
+\r
+                       vp = tinyMCE.getViewPort(cw);\r
+\r
+                       ds.oldWidth = iframe.style.width ? iframe.style.width : iframe.offsetWidth;\r
+                       ds.oldHeight = iframe.style.height ? iframe.style.height : iframe.offsetHeight;\r
+                       ds.oldTWidth = tableElm.style.width ? tableElm.style.width : tableElm.offsetWidth;\r
+                       ds.oldTHeight = tableElm.style.height ? tableElm.style.height : tableElm.offsetHeight;\r
+\r
+                       // Handle % width\r
+                       if (ds.oldWidth && ds.oldWidth.indexOf)\r
+                               ds.oldTWidth = ds.oldWidth.indexOf('%') != -1 ? ds.oldWidth : ds.oldTWidth;\r
+\r
+                       if (!blo && tinyMCE.isRealIE) {\r
+                               blo = tinyMCE.createTag(document, 'iframe', {id : 'mce_fullscreen_blocker', src : 'about:blank', frameBorder : 0, width : vp.width, height : vp.height, style : 'display: block; position: absolute; left: 0; top: 0; z-index: 999; margin: 0; padding: 0;'});\r
+                               document.body.appendChild(blo);\r
+                       }\r
+\r
+                       tableElm.style.position = 'absolute';\r
+                       tableElm.style.zIndex = 1000;\r
+                       tableElm.style.left = tableElm.style.top = '0';\r
+\r
+                       tableElm.style.width = vp.width + 'px';\r
+                       tableElm.style.height = vp.height + 'px';\r
+\r
+                       if (tinyMCE.isRealIE) {\r
+                               iframe.style.width = vp.width + 'px';\r
+                               iframe.style.height = vp.height + 'px';\r
+\r
+                               // Calc new width/height based on overflow\r
+                               w = iframe.parentNode.clientWidth - (tableElm.offsetWidth - vp.width);\r
+                               h = iframe.parentNode.clientHeight - (tableElm.offsetHeight - vp.height);\r
+                       } else {\r
+                               w = iframe.parentNode.clientWidth;\r
+                               h = iframe.parentNode.clientHeight;\r
+                       }\r
+\r
+                       iframe.style.width = w + "px";\r
+                       iframe.style.height = (h+delta) + "px";\r
+\r
+                       tinyMCE.switchClass(inst.editorId + '_fullscreen', 'mceButtonSelected');\r
+                       ds.enabled = true;\r
+\r
+                       inst.useCSS = false;\r
+               } else {\r
+                       // Handle External Toolbar\r
+                       if (inst.toolbarElement) {\r
+                               row = inst.toolbarElement.parentNode.parentNode;\r
+\r
+                               row.parentNode.removeChild(row);\r
+\r
+                               ds.oldToolbarParent.replaceChild(inst.toolbarElement, ds.toolbarHolder);\r
+\r
+                               ds.oldToolbarParent = null;\r
+                               ds.toolbarHolder = null;\r
+                       }\r
+\r
+                       if (blo)\r
+                               blo.parentNode.removeChild(blo);\r
+\r
+                       si = 0;\r
+                       tinyMCE.getParentNode(tableElm.parentNode, function (n) {\r
+                               if (n.nodeName == 'BODY')\r
+                                       return true;\r
+\r
+                               if (n.nodeType == 1)\r
+                                       tinyMCE.removeCSSClass(n, 'mceFullscreenPos');\r
+                       });\r
+\r
+                       if (re && tinyMCE.getParam("theme_advanced_resizing", false))\r
+                               re.style.display = 'block';\r
+\r
+                       tableElm.style.position = 'static';\r
+                       tableElm.style.zIndex = '';\r
+                       tableElm.style.width = '';\r
+                       tableElm.style.height = '';\r
+\r
+                       tableElm.style.width = ds.oldTWidth ? ds.oldTWidth : '';\r
+                       tableElm.style.height = ds.oldTHeight ? ds.oldTHeight : '';\r
+\r
+                       iframe.style.width = ds.oldWidth ? ds.oldWidth : '';\r
+                       iframe.style.height = ds.oldHeight ? ds.oldHeight : '';\r
+\r
+                       tinyMCE.switchClass(inst.editorId + '_fullscreen', 'mceButtonNormal');\r
+                       ds.enabled = false;\r
+\r
+                       tinyMCE.removeCSSClass(cd.body, 'mceFullscreen');\r
+                       cw.scrollTo(ds.scrollX, ds.scrollY);\r
+\r
+                       inst.useCSS = false;\r
+               }\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               if (tinyMCE.getParam('fullscreen_is_enabled'))\r
+                       tinyMCE.switchClass(editor_id + '_fullscreen', 'mceButtonSelected');\r
+\r
+               return true;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("fullscreen", TinyMCE_FullScreenPlugin);\r
diff --git a/media/tiny_mce/plugins/fullscreen/fullscreen.htm b/media/tiny_mce/plugins/fullscreen/fullscreen.htm
new file mode 100755 (executable)
index 0000000..5e455cd
--- /dev/null
@@ -0,0 +1,91 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_fullscreen_title}</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce.js"></script>\r
+       <script language="javascript" type="text/javascript">\r
+               function patchCallback(settings, key) {\r
+                       if (settings[key])\r
+                               settings[key] = "window.opener." + settings[key];\r
+               }\r
+\r
+               var settings = new Array();\r
+\r
+               // Clone array\r
+               for (var name in window.opener.tinyMCE.settings)\r
+                       settings[name] = window.opener.tinyMCE.settings[name];\r
+\r
+               // Override options for fullscreen\r
+               for (var name in window.opener.tinyMCE.settings.fullscreen_settings)\r
+                       settings[name] = window.opener.tinyMCE.settings.fullscreen_settings[name];\r
+\r
+               // Patch callbacks, make them point to window.opener\r
+               patchCallback(settings, 'urlconverter_callback');\r
+               patchCallback(settings, 'insertlink_callback');\r
+               patchCallback(settings, 'insertimage_callback');\r
+               patchCallback(settings, 'setupcontent_callback');\r
+               patchCallback(settings, 'save_callback');\r
+               patchCallback(settings, 'onchange_callback');\r
+               patchCallback(settings, 'init_instance_callback');\r
+               patchCallback(settings, 'file_browser_callback');\r
+               patchCallback(settings, 'cleanup_callback');\r
+               patchCallback(settings, 'execcommand_callback');\r
+               patchCallback(settings, 'oninit');\r
+\r
+               // Set options\r
+               settings['mode'] = 'exact';\r
+               settings['elements'] = 'fullscreenarea';\r
+               settings['ask'] = false;\r
+               settings['setupcontent_callback'] = 'setupContent';\r
+               settings['fullscreen_is_enabled'] = true;\r
+               settings['fullscreen_editor_id'] = window.opener.tinyMCE.getWindowArg("editor_id");\r
+               settings['theme_advanced_resizing'] = false;\r
+\r
+               // Init\r
+               tinyMCE.init(settings);\r
+               tinyMCE.documentBasePath = window.opener.tinyMCE.documentBasePath;\r
+\r
+               function setupContent(editor_id, body, doc) {\r
+                       var inst = tinyMCE.getInstanceById(editor_id);\r
+                       var content = window.opener.tinyMCE.getContent(tinyMCE.getParam('fullscreen_editor_id'));\r
+\r
+                       // Setup title\r
+                       var divElm = document.createElement("div");\r
+                       divElm.innerHTML = tinyMCELang['lang_fullscreen_title'];\r
+                       document.title = divElm.innerHTML;\r
+\r
+                       // Get content\r
+                       inst.execCommand('mceSetContent', false, content);\r
+               }\r
+\r
+               function unloadHandler(e) {\r
+                       moveContent();\r
+               }\r
+\r
+               function moveContent() {\r
+                       var doc = tinyMCE.isMSIE ? window.frames['mce_editor_0'].window.document : document.getElementById('mce_editor_0').contentDocument;\r
+                       window.opener.tinyMCE.setInnerHTML(window.opener.tinyMCE.selectedInstance.getBody(), doc.body.innerHTML);\r
+               }\r
+\r
+               // Add onunload\r
+               tinyMCE.addEvent(window, "beforeunload", unloadHandler);\r
+\r
+               function doParentSubmit() {\r
+                       moveContent();\r
+\r
+                       if (window.opener.tinyMCE.selectedInstance.formElement.form)\r
+                               window.opener.tinyMCE.selectedInstance.formElement.form.submit();\r
+\r
+                       window.close();\r
+\r
+                       return false;\r
+               }\r
+       </script>\r
+       <base target="_self" />\r
+</head>\r
+<body style="margin: 0; overflow: hidden; height: 100%" scrolling="no" scroll="no">\r
+<form onsubmit="doParentSubmit();" style="height: 100%">\r
+<textarea id="fullscreenarea" style="width: 100%; height: 100%"></textarea>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/fullscreen/images/fullscreen.gif b/media/tiny_mce/plugins/fullscreen/images/fullscreen.gif
new file mode 100755 (executable)
index 0000000..66fa6d9
Binary files /dev/null and b/media/tiny_mce/plugins/fullscreen/images/fullscreen.gif differ
diff --git a/media/tiny_mce/plugins/fullscreen/langs/en.js b/media/tiny_mce/plugins/fullscreen/langs/en.js
new file mode 100755 (executable)
index 0000000..c5ad4ca
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+fullscreen_desc : 'Toggle fullscreen mode'\r
+});\r
diff --git a/media/tiny_mce/plugins/fullscreen/readme.txt b/media/tiny_mce/plugins/fullscreen/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/iespell/editor_plugin.js b/media/tiny_mce/plugins/iespell/editor_plugin.js
new file mode 100755 (executable)
index 0000000..b19625b
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('iespell');var TinyMCE_IESpellPlugin={getInfo:function(){return{longname:'IESpell (MSIE Only)',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){if(cn=="iespell"&&(tinyMCE.isMSIE&&!tinyMCE.isOpera))return tinyMCE.getButtonHTML(cn,'lang_iespell_desc','{$pluginurl}/images/iespell.gif','mceIESpell');return""},execCommand:function(editor_id,element,command,user_interface,value){if(command=="mceIESpell"){try{var ieSpell=new ActiveXObject("ieSpell.ieSpellExtension");ieSpell.CheckDocumentNode(tinyMCE.getInstanceById(editor_id).contentDocument.documentElement)}catch(e){if(e.number==-2146827859){if(confirm(tinyMCE.getLang("lang_iespell_download","",true)))window.open('http://www.iespell.com/download.php','ieSpellDownload','')}else alert("Error Loading ieSpell: Exception "+e.number)}return true}return false}};tinyMCE.addPlugin("iespell",TinyMCE_IESpellPlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/iespell/editor_plugin_src.js b/media/tiny_mce/plugins/iespell/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..353db1c
--- /dev/null
@@ -0,0 +1,58 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('iespell');\r
+\r
+var TinyMCE_IESpellPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'IESpell (MSIE Only)',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       /**\r
+        * Returns the HTML contents of the iespell control.\r
+        */\r
+       getControlHTML : function(cn) {\r
+               // Is it the iespell control and is the brower MSIE.\r
+               if (cn == "iespell" && (tinyMCE.isMSIE && !tinyMCE.isOpera))\r
+                       return tinyMCE.getButtonHTML(cn, 'lang_iespell_desc', '{$pluginurl}/images/iespell.gif', 'mceIESpell');\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes the mceIESpell command.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle ieSpellCommand\r
+               if (command == "mceIESpell") {\r
+                       try {\r
+                               var ieSpell = new ActiveXObject("ieSpell.ieSpellExtension");\r
+                               ieSpell.CheckDocumentNode(tinyMCE.getInstanceById(editor_id).contentDocument.documentElement);\r
+                       } catch (e) {\r
+                               if (e.number == -2146827859) {\r
+                                       if (confirm(tinyMCE.getLang("lang_iespell_download", "", true)))\r
+                                               window.open('http://www.iespell.com/download.php', 'ieSpellDownload', '');\r
+                               } else\r
+                                       alert("Error Loading ieSpell: Exception " + e.number);\r
+                       }\r
+\r
+                       return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("iespell", TinyMCE_IESpellPlugin);\r
diff --git a/media/tiny_mce/plugins/iespell/images/iespell.gif b/media/tiny_mce/plugins/iespell/images/iespell.gif
new file mode 100755 (executable)
index 0000000..a9a2891
Binary files /dev/null and b/media/tiny_mce/plugins/iespell/images/iespell.gif differ
diff --git a/media/tiny_mce/plugins/iespell/langs/en.js b/media/tiny_mce/plugins/iespell/langs/en.js
new file mode 100755 (executable)
index 0000000..c3688e9
--- /dev/null
@@ -0,0 +1,7 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+iespell_desc : 'Run spell checking',\r
+iespell_download : "ieSpell not detected. Click OK to go to download page."\r
+});\r
+\r
diff --git a/media/tiny_mce/plugins/iespell/readme.txt b/media/tiny_mce/plugins/iespell/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/inlinepopups/css/inlinepopup.css b/media/tiny_mce/plugins/inlinepopups/css/inlinepopup.css
new file mode 100755 (executable)
index 0000000..43be823
--- /dev/null
@@ -0,0 +1,69 @@
+/* Window classes */\r
+\r
+.mceWindow {\r
+       position: absolute;\r
+       left: 0;\r
+       top: 0;\r
+       border: 1px solid black;\r
+       background-color: #D4D0C8;\r
+}\r
+\r
+.mceWindowHead {\r
+       background-color: #334F8D;\r
+       width: 100%;\r
+       height: 18px;\r
+       cursor: move;\r
+       overflow: hidden;\r
+}\r
+\r
+.mceWindowBody {\r
+       clear: both;\r
+       background-color: white;\r
+}\r
+\r
+.mceWindowStatusbar {\r
+       background-color: #D4D0C8;\r
+       height: 12px;\r
+       border-top: 1px solid black;\r
+}\r
+\r
+.mceWindowTitle {\r
+       float: left;\r
+       font-family: "MS Sans Serif";\r
+       font-size: 9pt;\r
+       font-weight: bold;\r
+       line-height: 18px;\r
+       color: white;\r
+       margin-left: 2px;\r
+       overflow: hidden;\r
+}\r
+\r
+.mceWindowHeadTools {\r
+       margin-right: 2px;\r
+}\r
+\r
+.mceWindowClose, .mceWindowMinimize, .mceWindowMaximize {\r
+       display: block;\r
+       float: right;\r
+       overflow: hidden;\r
+       margin-top: 2px;\r
+}\r
+\r
+.mceWindowClose {\r
+       margin-left: 2px;\r
+}\r
+\r
+.mceWindowMinimize {\r
+}\r
+\r
+.mceWindowMaximize {\r
+}\r
+\r
+.mceWindowResize {\r
+       display: block;\r
+       float: right;\r
+       overflow: hidden;\r
+       cursor: se-resize;\r
+       width: 12px;\r
+       height: 12px;\r
+}\r
diff --git a/media/tiny_mce/plugins/inlinepopups/editor_plugin.js b/media/tiny_mce/plugins/inlinepopups/editor_plugin.js
new file mode 100755 (executable)
index 0000000..be3e3ab
--- /dev/null
@@ -0,0 +1 @@
+var TinyMCE_InlinePopupsPlugin={getInfo:function(){return{longname:'Inline Popups',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}}};tinyMCE.addPlugin("inlinepopups",TinyMCE_InlinePopupsPlugin);TinyMCE_Engine.prototype.orgOpenWindow=TinyMCE_Engine.prototype.openWindow;TinyMCE_Engine.prototype.orgCloseWindow=TinyMCE_Engine.prototype.closeWindow;TinyMCE_Engine.prototype.openWindow=function(template,args){if(args['inline']!="yes"||tinyMCE.isOpera||tinyMCE.getParam("plugins").indexOf('inlinepopups')==-1){mcWindows.selectedWindow=null;args['mce_inside_iframe']=false;this.orgOpenWindow(template,args);return}var url,resizable,scrollbars;args['mce_inside_iframe']=true;tinyMCE.windowArgs=args;if(template['file'].charAt(0)!='/'&&template['file'].indexOf('://')==-1)url=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/"+template['file'];else url=template['file'];if(!(width=parseInt(template['width'])))width=320;if(!(height=parseInt(template['height'])))height=200;if(!(minWidth=parseInt(template['minWidth'])))minWidth=100;if(!(minHeight=parseInt(template['minHeight'])))minHeight=100;resizable=(args&&args['resizable'])?args['resizable']:"no";scrollbars=(args&&args['scrollbars'])?args['scrollbars']:"no";height+=18;for(var name in args){if(typeof(args[name])=='function')continue;url=tinyMCE.replaceVar(url,name,escape(args[name]))}var elm=document.getElementById(this.selectedInstance.editorId+'_parent');if(tinyMCE.hasPlugin('fullscreen')&&this.selectedInstance.getData('fullscreen').enabled)pos={absLeft:0,absTop:0};else pos=tinyMCE.getAbsPosition(elm);pos.absLeft+=Math.round((elm.firstChild.clientWidth/ 2) - (width /2));pos.absTop+=Math.round((elm.firstChild.clientHeight/ 2) - (height /2));mcWindows.open(url,mcWindows.idCounter++,"modal=yes,width="+width+",height="+height+",resizable="+resizable+",scrollbars="+scrollbars+",statusbar="+resizable+",left="+pos.absLeft+",top="+pos.absTop+",minWidth="+minWidth+",minHeight="+minHeight)};TinyMCE_Engine.prototype.closeWindow=function(win){var gotit=false,n,w;for(n in mcWindows.windows){w=mcWindows.windows[n];if(typeof(w)=='function')continue;if(win.name==w.id+'_iframe'){w.close();gotit=true}}if(!gotit)this.orgCloseWindow(win);tinyMCE.selectedInstance.getWin().focus()};TinyMCE_Engine.prototype.setWindowTitle=function(win_ref,title){for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(typeof(win)=='function')continue;if(win_ref.name==win.id+"_iframe")window.frames[win.id+"_iframe"].document.getElementById(win.id+'_title').innerHTML=title}};function TinyMCE_Windows(){this.settings=new Array();this.windows=new Array();this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.isGecko=navigator.userAgent.indexOf('Gecko')!=-1;this.isSafari=navigator.userAgent.indexOf('Safari')!=-1;this.isMac=navigator.userAgent.indexOf('Mac')!=-1;this.isMSIE5_0=this.isMSIE&&(navigator.userAgent.indexOf('MSIE 5.0')!=-1);this.action="none";this.selectedWindow=null;this.lastSelectedWindow=null;this.zindex=1001;this.mouseDownScreenX=0;this.mouseDownScreenY=0;this.mouseDownLayerX=0;this.mouseDownLayerY=0;this.mouseDownWidth=0;this.mouseDownHeight=0;this.idCounter=0};TinyMCE_Windows.prototype.init=function(settings){this.settings=settings;if(this.isMSIE)this.addEvent(document,"mousemove",mcWindows.eventDispatcher);else this.addEvent(window,"mousemove",mcWindows.eventDispatcher);this.addEvent(document,"mouseup",mcWindows.eventDispatcher);this.addEvent(window,"resize",mcWindows.eventDispatcher);this.addEvent(document,"scroll",mcWindows.eventDispatcher);this.doc=document};TinyMCE_Windows.prototype.getBounds=function(){if(!this.bounds){var vp=tinyMCE.getViewPort(window);var top,left,bottom,right,docEl=this.doc.documentElement;top=vp.top;left=vp.left;bottom=vp.height+top-2;right=vp.width+left-22;this.bounds=[left,top,right,bottom]}return this.bounds};TinyMCE_Windows.prototype.clampBoxPosition=function(x,y,w,h,minW,minH){var bounds=this.getBounds();x=Math.max(bounds[0],Math.min(bounds[2],x+w)-w);y=Math.max(bounds[1],Math.min(bounds[3],y+h)-h);return this.clampBoxSize(x,y,w,h,minW,minH)};TinyMCE_Windows.prototype.clampBoxSize=function(x,y,w,h,minW,minH){var bounds=this.getBounds();return[x,y,Math.max(minW,Math.min(bounds[2],x+w)-x),Math.max(minH,Math.min(bounds[3],y+h)-y)]};TinyMCE_Windows.prototype.getParam=function(name,default_value){var value=null;value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");return value};TinyMCE_Windows.prototype.eventDispatcher=function(e){e=typeof(e)=="undefined"?window.event:e;if(mcWindows.selectedWindow==null)return;if(mcWindows.isGecko&&e.type=="mousedown"){var elm=e.currentTarget;for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(win.headElement==elm||win.resizeElement==elm){win.focus();break}}}switch(e.type){case"mousemove":mcWindows.selectedWindow.onMouseMove(e);break;case"mouseup":mcWindows.selectedWindow.onMouseUp(e);break;case"mousedown":mcWindows.selectedWindow.onMouseDown(e);break;case"focus":mcWindows.selectedWindow.onFocus(e);break;case"scroll":case"resize":if(mcWindows.clampUpdateTimeout)clearTimeout(mcWindows.clampUpdateTimeout);mcWindows.clampEventType=e.type;mcWindows.clampUpdateTimeout=setTimeout(function(){mcWindows.updateClamping()},100);break}};TinyMCE_Windows.prototype.updateClamping=function(){var clamp,oversize,etype=mcWindows.clampEventType;this.bounds=null;this.clampUpdateTimeout=null;for(var n in this.windows){win=this.windows[n];if(typeof(win)=='function'||!win.winElement)continue;clamp=mcWindows.clampBoxPosition(win.left,win.top,win.winElement.scrollWidth,win.winElement.scrollHeight,win.features.minWidth,win.features.minHeight);oversize=(clamp[2]!=win.winElement.scrollWidth||clamp[3]!=win.winElement.scrollHeight)?true:false;if(!oversize||win.features.resizable=="yes"||etype!="scroll")win.moveTo(clamp[0],clamp[1]);if(oversize&&win.features.resizable=="yes")win.resizeTo(clamp[2],clamp[3])}};TinyMCE_Windows.prototype.addEvent=function(obj,name,handler){if(this.isMSIE)obj.attachEvent("on"+name,handler);else obj.addEventListener(name,handler,false)};TinyMCE_Windows.prototype.cancelEvent=function(e){if(this.isMSIE){e.returnValue=false;e.cancelBubble=true}else e.preventDefault()};TinyMCE_Windows.prototype.parseFeatures=function(opts){opts=opts.toLowerCase();opts=opts.replace(/;/g,",");opts=opts.replace(/[^0-9a-z=,]/g,"");var optionChunks=opts.split(',');var options=new Array();options['left']="10";options['top']="10";options['width']="300";options['height']="300";options['minwidth']="100";options['minheight']="100";options['resizable']="yes";options['minimizable']="yes";options['maximizable']="yes";options['close']="yes";options['movable']="yes";options['statusbar']="yes";options['scrollbars']="auto";options['modal']="no";if(opts=="")return options;for(var i=0;i<optionChunks.length;i++){var parts=optionChunks[i].split('=');if(parts.length==2)options[parts[0]]=parts[1]}options['left']=parseInt(options['left']);options['top']=parseInt(options['top']);options['width']=parseInt(options['width']);options['height']=parseInt(options['height']);options['minWidth']=parseInt(options['minwidth']);options['minHeight']=parseInt(options['minheight']);return options};TinyMCE_Windows.prototype.open=function(url,name,features){this.lastSelectedWindow=this.selectedWindow;var win=new TinyMCE_Window();var winDiv,html="",id;var imgPath=this.getParam("images_path");features=this.parseFeatures(features);var clamp=mcWindows.clampBoxPosition(features['left'],features['top'],features['width'],features['height'],features['minWidth'],features['minHeight']);features['left']=clamp[0];features['top']=clamp[1];if(features['resizable']=="yes"){features['width']=clamp[2];features['height']=clamp[3]}id="mcWindow_"+name;win.deltaHeight=18;if(features['statusbar']=="yes"){win.deltaHeight+=13;if(this.isMSIE)win.deltaHeight+=1}width=parseInt(features['width']);height=parseInt(features['height'])-win.deltaHeight;if(this.isMSIE)width-=2;win.id=id;win.url=url;win.name=name;win.features=features;this.windows[name]=win;iframeWidth=width;iframeHeight=height;html+='<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';html+='<html>';html+='<head>';html+='<title>Wrapper iframe</title>';html+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';html+='<link href="'+this.getParam("css_file")+'" rel="stylesheet" type="text/css" />';html+='</head>';html+='<body onload="parent.mcWindows.onLoad(\''+name+'\');">';html+='<div id="'+id+'_container" class="mceWindow">';html+='<div id="'+id+'_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\''+name+'\'].focus();">';html+='  <div id="'+id+'_title" class="mceWindowTitle"';html+='  onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;"></div>';html+='    <div class="mceWindowHeadTools">';html+='      <a href="javascript:parent.mcWindows.windows[\''+name+'\'].close();" target="_self" onmousedown="return false;" class="mceWindowClose"><img border="0" src="'+imgPath+'/window_close.gif" /></a>';if(features['resizable']=="yes"&&features['maximizable']=="yes")html+='      <a href="javascript:parent.mcWindows.windows[\''+name+'\'].maximize();" target="_self" onmousedown="return false;" class="mceWindowMaximize"><img border="0" src="'+imgPath+'/window_maximize.gif" /></a>';html+='    </div>';html+='</div><div id="'+id+'_body" class="mceWindowBody" style="width: '+width+'px; height: '+height+'px;">';html+='<iframe id="'+id+'_iframe" name="'+id+'_iframe" frameborder="0" width="'+iframeWidth+'" height="'+iframeHeight+'" src="'+url+'" class="mceWindowBodyIframe" scrolling="'+features['scrollbars']+'"></iframe></div>';if(features['statusbar']=="yes"){html+='<div id="'+id+'_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\''+name+'\'].focus();">';if(features['resizable']=="yes"){if(this.isGecko)html+='<div id="'+id+'_resize" class="mceWindowResize"><div style="background-image: url(\''+imgPath+'/window_resize.gif\'); width: 12px; height: 12px;"></div></div>';else html+='<div id="'+id+'_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\''+name+'\'].focus();" border="0" src="'+imgPath+'/window_resize.gif" /></div>'}html+='</div>'}html+='</div>';html+='</body>';html+='</html>';this.createFloatingIFrame(id,features['left'],features['top'],features['width'],features['height'],html)};TinyMCE_Windows.prototype.setDocumentLock=function(state){var elm=document.getElementById('mcWindowEventBlocker');if(state){if(elm==null){elm=document.createElement("div");elm.id="mcWindowEventBlocker";elm.style.position="absolute";elm.style.left="0";elm.style.top="0";document.body.appendChild(elm)}elm.style.display="none";var imgPath=this.getParam("images_path");var width=document.body.clientWidth;var height=document.body.clientHeight;elm.style.width=width;elm.style.height=height;elm.innerHTML='<img src="'+imgPath+'/spacer.gif" width="'+width+'" height="'+height+'" />';elm.style.zIndex=mcWindows.zindex-1;elm.style.display="block"}else if(elm!=null){if(mcWindows.windows.length==0)elm.parentNode.removeChild(elm);else elm.style.zIndex=mcWindows.zindex-1}};TinyMCE_Windows.prototype.onLoad=function(name){var win=mcWindows.windows[name];var id="mcWindow_"+name;var wrapperIframe=window.frames[id+"_iframe"].frames[0];var wrapperDoc=window.frames[id+"_iframe"].document;var doc=window.frames[id+"_iframe"].document;var winDiv=document.getElementById("mcWindow_"+name+"_div");var realIframe=window.frames[id+"_iframe"].frames[0];win.id="mcWindow_"+name;win.winElement=winDiv;win.bodyElement=doc.getElementById(id+'_body');win.iframeElement=doc.getElementById(id+'_iframe');win.headElement=doc.getElementById(id+'_head');win.titleElement=doc.getElementById(id+'_title');win.resizeElement=doc.getElementById(id+'_resize');win.containerElement=doc.getElementById(id+'_container');win.left=win.features['left'];win.top=win.features['top'];win.frame=window.frames[id+'_iframe'].frames[0];win.wrapperFrame=window.frames[id+'_iframe'];win.wrapperIFrameElement=document.getElementById(id+"_iframe");mcWindows.addEvent(win.headElement,"mousedown",mcWindows.eventDispatcher);if(win.resizeElement!=null)mcWindows.addEvent(win.resizeElement,"mousedown",mcWindows.eventDispatcher);if(mcWindows.isMSIE){mcWindows.addEvent(realIframe.document,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(realIframe.document,"mouseup",mcWindows.eventDispatcher)}else{mcWindows.addEvent(realIframe,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(realIframe,"mouseup",mcWindows.eventDispatcher);mcWindows.addEvent(realIframe,"focus",mcWindows.eventDispatcher)}for(var i=0;i<window.frames.length;i++){if(!window.frames[i]._hasMouseHandlers){if(mcWindows.isMSIE){mcWindows.addEvent(window.frames[i].document,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(window.frames[i].document,"mouseup",mcWindows.eventDispatcher)}else{mcWindows.addEvent(window.frames[i],"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(window.frames[i],"mouseup",mcWindows.eventDispatcher)}window.frames[i]._hasMouseHandlers=true}}if(mcWindows.isMSIE){mcWindows.addEvent(win.frame.document,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(win.frame.document,"mouseup",mcWindows.eventDispatcher)}else{mcWindows.addEvent(win.frame,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(win.frame,"mouseup",mcWindows.eventDispatcher);mcWindows.addEvent(win.frame,"focus",mcWindows.eventDispatcher)}var func=this.getParam("on_open_window","");if(func!="")eval(func+"(win);");win.focus();if(win.features['modal']=="yes")mcWindows.setDocumentLock(true)};TinyMCE_Windows.prototype.createFloatingIFrame=function(id_prefix,left,top,width,height,html){var iframe=document.createElement("iframe");var div=document.createElement("div"),doc;width=parseInt(width);height=parseInt(height)+1;div.setAttribute("id",id_prefix+"_div");div.setAttribute("width",width);div.setAttribute("height",(height));div.style.position="absolute";div.style.left=left+"px";div.style.top=top+"px";div.style.width=width+"px";div.style.height=(height)+"px";div.style.backgroundColor="white";div.style.display="none";if(this.isGecko){iframeWidth=width+2;iframeHeight=height+2}else{iframeWidth=width;iframeHeight=height+1}iframe.setAttribute("id",id_prefix+"_iframe");iframe.setAttribute("name",id_prefix+"_iframe");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",iframeWidth);iframe.setAttribute("height",iframeHeight);iframe.setAttribute("scrolling","no");iframe.style.width=iframeWidth+"px";iframe.style.height=iframeHeight+"px";iframe.style.backgroundColor="white";div.appendChild(iframe);document.body.appendChild(div);div.innerHTML=div.innerHTML;if(this.isSafari){window.setTimeout(function(){var doc=window.frames[id_prefix+'_iframe'].document;doc.open();doc.write(html);doc.close()},10)}else{doc=window.frames[id_prefix+'_iframe'].window.document;doc.open();doc.write(html);doc.close()}div.style.display="block";return div};function TinyMCE_Window(){};TinyMCE_Window.prototype.focus=function(){if(this!=mcWindows.selectedWindow){this.winElement.style.zIndex=++mcWindows.zindex;mcWindows.lastSelectedWindow=mcWindows.selectedWindow;mcWindows.selectedWindow=this}};TinyMCE_Window.prototype.minimize=function(){};TinyMCE_Window.prototype.maximize=function(){if(this.restoreSize){this.moveTo(this.restoreSize[0],this.restoreSize[1]);this.resizeTo(this.restoreSize[2],this.restoreSize[3]);this.updateClamping();this.restoreSize=null}else{var bounds=mcWindows.getBounds();this.restoreSize=[this.left,this.top,this.winElement.scrollWidth,this.winElement.scrollHeight];this.moveTo(bounds[0],bounds[1]);this.resizeTo(bounds[2]-bounds[0],bounds[3]-bounds[1])}};TinyMCE_Window.prototype.startResize=function(){mcWindows.action="resize"};TinyMCE_Window.prototype.startMove=function(e){mcWindows.action="move"};TinyMCE_Window.prototype.close=function(){if(this.frame&&this.frame['tinyMCEPopup'])this.frame['tinyMCEPopup'].restoreSelection();if(mcWindows.lastSelectedWindow!=null)mcWindows.lastSelectedWindow.focus();var mcWindowsNew=new Array();for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(typeof(win)=='function')continue;if(win.name!=this.name)mcWindowsNew[n]=win}mcWindows.windows=mcWindowsNew;var e=mcWindows.doc.getElementById(this.id+"_iframe");e.parentNode.removeChild(e);var e=mcWindows.doc.getElementById(this.id+"_div");e.parentNode.removeChild(e);mcWindows.setDocumentLock(false)};TinyMCE_Window.prototype.onMouseMove=function(e){var clamp;var dx=e.screenX-mcWindows.mouseDownScreenX;var dy=e.screenY-mcWindows.mouseDownScreenY;switch(mcWindows.action){case"resize":clamp=mcWindows.clampBoxSize(this.left,this.top,mcWindows.mouseDownWidth+(e.screenX-mcWindows.mouseDownScreenX),mcWindows.mouseDownHeight+(e.screenY-mcWindows.mouseDownScreenY),this.features.minWidth,this.features.minHeight);this.resizeTo(clamp[2],clamp[3]);mcWindows.cancelEvent(e);break;case"move":this.left=mcWindows.mouseDownLayerX+(e.screenX-mcWindows.mouseDownScreenX);this.top=mcWindows.mouseDownLayerY+(e.screenY-mcWindows.mouseDownScreenY);this.updateClamping();mcWindows.cancelEvent(e);break}};TinyMCE_Window.prototype.moveTo=function(x,y){this.left=x;this.top=y;this.winElement.style.left=this.left+"px";this.winElement.style.top=this.top+"px"};TinyMCE_Window.prototype.resizeTo=function(width,height){this.wrapperIFrameElement.style.width=(width+2)+'px';this.wrapperIFrameElement.style.height=(height+2)+'px';this.wrapperIFrameElement.width=width+2;this.wrapperIFrameElement.height=height+2;this.winElement.style.width=width+'px';this.winElement.style.height=height+'px';height=height-this.deltaHeight;this.containerElement.style.width=width+'px';this.iframeElement.style.width=width+'px';this.iframeElement.style.height=height+'px';this.bodyElement.style.width=width+'px';this.bodyElement.style.height=height+'px';this.headElement.style.width=width+'px';};TinyMCE_Window.prototype.updateClamping=function(){var clamp,oversize;clamp=mcWindows.clampBoxPosition(this.left,this.top,this.winElement.scrollWidth,this.winElement.scrollHeight,this.features.minWidth,this.features.minHeight);oversize=(clamp[2]!=this.winElement.scrollWidth||clamp[3]!=this.winElement.scrollHeight)?true:false;this.moveTo(clamp[0],clamp[1]);if(this.features.resizable=="yes"&&oversize)this.resizeTo(clamp[2],clamp[3])};function debug(msg){document.getElementById('debug').value+=msg+"\n"}TinyMCE_Window.prototype.onMouseUp=function(e){mcWindows.action="none"};TinyMCE_Window.prototype.onFocus=function(e){var winRef=e.currentTarget;for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(typeof(win)=='function')continue;if(winRef.name==win.id+"_iframe"){win.focus();return}}};TinyMCE_Window.prototype.onMouseDown=function(e){var elm=mcWindows.isMSIE?this.wrapperFrame.event.srcElement:e.target;mcWindows.mouseDownScreenX=e.screenX;mcWindows.mouseDownScreenY=e.screenY;mcWindows.mouseDownLayerX=this.left;mcWindows.mouseDownLayerY=this.top;mcWindows.mouseDownWidth=parseInt(this.winElement.style.width);mcWindows.mouseDownHeight=parseInt(this.winElement.style.height);if(this.resizeElement!=null&&elm==this.resizeElement.firstChild)this.startResize(e);else this.startMove(e);mcWindows.cancelEvent(e)};var mcWindows=new TinyMCE_Windows();mcWindows.init({images_path:tinyMCE.baseURL+"/plugins/inlinepopups/images",css_file:tinyMCE.baseURL+"/plugins/inlinepopups/css/inlinepopup.css"});
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/inlinepopups/editor_plugin_src.js b/media/tiny_mce/plugins/inlinepopups/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..41a6124
--- /dev/null
@@ -0,0 +1,819 @@
+/**
+ * $Id: editor_plugin_src.js 268 2007-04-28 15:52:59Z spocke $
+ *
+ * Moxiecode DHTML Windows script.
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+// Patch openWindow, closeWindow TinyMCE functions
+
+var TinyMCE_InlinePopupsPlugin = {
+       getInfo : function() {
+               return {
+                       longname : 'Inline Popups',
+                       author : 'Moxiecode Systems AB',
+                       authorurl : 'http://tinymce.moxiecode.com',
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+               };
+       }
+};
+
+tinyMCE.addPlugin("inlinepopups", TinyMCE_InlinePopupsPlugin);
+
+// Patch openWindow, closeWindow TinyMCE functions
+
+TinyMCE_Engine.prototype.orgOpenWindow = TinyMCE_Engine.prototype.openWindow;
+TinyMCE_Engine.prototype.orgCloseWindow = TinyMCE_Engine.prototype.closeWindow;
+
+TinyMCE_Engine.prototype.openWindow = function(template, args) {
+       // Does the caller support inline
+       if (args['inline'] != "yes" || tinyMCE.isOpera || tinyMCE.getParam("plugins").indexOf('inlinepopups') == -1) {
+               mcWindows.selectedWindow = null;
+               args['mce_inside_iframe'] = false;
+               this.orgOpenWindow(template, args);
+               return;
+       }
+
+       var url, resizable, scrollbars;
+
+       args['mce_inside_iframe'] = true;
+       tinyMCE.windowArgs = args;
+
+       if (template['file'].charAt(0) != '/' && template['file'].indexOf('://') == -1)
+               url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template['file'];
+       else
+               url = template['file'];
+
+       if (!(width = parseInt(template['width'])))
+               width = 320;
+
+       if (!(height = parseInt(template['height'])))
+               height = 200;
+
+       if (!(minWidth = parseInt(template['minWidth'])))
+               minWidth = 100;
+
+       if (!(minHeight = parseInt(template['minHeight'])))
+               minHeight = 100;
+
+       resizable = (args && args['resizable']) ? args['resizable'] : "no";
+       scrollbars = (args && args['scrollbars']) ? args['scrollbars'] : "no";
+
+       height += 18;
+
+       // Replace all args as variables in URL
+       for (var name in args) {
+               if (typeof(args[name]) == 'function')
+                       continue;
+
+               url = tinyMCE.replaceVar(url, name, escape(args[name]));
+       }
+
+       var elm = document.getElementById(this.selectedInstance.editorId + '_parent');
+
+       if (tinyMCE.hasPlugin('fullscreen') && this.selectedInstance.getData('fullscreen').enabled)
+               pos = { absLeft: 0, absTop: 0 };
+       else
+               pos = tinyMCE.getAbsPosition(elm);
+
+       // Center div in editor area
+       pos.absLeft += Math.round((elm.firstChild.clientWidth / 2) - (width / 2));
+       pos.absTop += Math.round((elm.firstChild.clientHeight / 2) - (height / 2));
+
+       mcWindows.open(url, mcWindows.idCounter++, "modal=yes,width=" + width+ ",height=" + height + ",resizable=" + resizable + ",scrollbars=" + scrollbars + ",statusbar=" + resizable + ",left=" + pos.absLeft + ",top=" + pos.absTop + ",minWidth=" + minWidth + ",minHeight=" + minHeight );
+};
+
+TinyMCE_Engine.prototype.closeWindow = function(win) {
+       var gotit = false, n, w;
+
+       for (n in mcWindows.windows) {
+               w = mcWindows.windows[n];
+
+               if (typeof(w) == 'function')
+                       continue;
+
+               if (win.name == w.id + '_iframe') {
+                       w.close();
+                       gotit = true;
+               }
+       }
+
+       if (!gotit)
+               this.orgCloseWindow(win);
+
+       tinyMCE.selectedInstance.getWin().focus(); 
+};
+
+TinyMCE_Engine.prototype.setWindowTitle = function(win_ref, title) {
+       for (var n in mcWindows.windows) {
+               var win = mcWindows.windows[n];
+               if (typeof(win) == 'function')
+                       continue;
+
+               if (win_ref.name == win.id + "_iframe")
+                       window.frames[win.id + "_iframe"].document.getElementById(win.id + '_title').innerHTML = title;
+       }
+};
+
+// * * * * * TinyMCE_Windows classes below
+
+// Windows handler
+function TinyMCE_Windows() {
+       this.settings = new Array();
+       this.windows = new Array();
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
+       this.isGecko = navigator.userAgent.indexOf('Gecko') != -1;
+       this.isSafari = navigator.userAgent.indexOf('Safari') != -1;
+       this.isMac = navigator.userAgent.indexOf('Mac') != -1;
+       this.isMSIE5_0 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5.0') != -1);
+       this.action = "none";
+       this.selectedWindow = null;
+       this.lastSelectedWindow = null;
+       this.zindex = 1001;
+       this.mouseDownScreenX = 0;
+       this.mouseDownScreenY = 0;
+       this.mouseDownLayerX = 0;
+       this.mouseDownLayerY = 0;
+       this.mouseDownWidth = 0;
+       this.mouseDownHeight = 0;
+       this.idCounter = 0;
+};
+
+TinyMCE_Windows.prototype.init = function(settings) {
+       this.settings = settings;
+
+       if (this.isMSIE)
+               this.addEvent(document, "mousemove", mcWindows.eventDispatcher);
+       else
+               this.addEvent(window, "mousemove", mcWindows.eventDispatcher);
+
+       this.addEvent(document, "mouseup", mcWindows.eventDispatcher);
+
+       this.addEvent(window, "resize", mcWindows.eventDispatcher);
+       this.addEvent(document, "scroll", mcWindows.eventDispatcher);
+
+       this.doc = document;
+};
+
+TinyMCE_Windows.prototype.getBounds = function() {
+       if (!this.bounds) {
+               var vp = tinyMCE.getViewPort(window);
+               var top, left, bottom, right, docEl = this.doc.documentElement;
+
+               top    = vp.top;
+               left   = vp.left;
+               bottom = vp.height + top - 2;
+               right  = vp.width  + left - 22; // TODO this number is platform dependant
+               // x1, y1, x2, y2
+               this.bounds = [left, top, right, bottom];
+       }
+       return this.bounds;
+};
+
+TinyMCE_Windows.prototype.clampBoxPosition = function(x, y, w, h, minW, minH) {
+       var bounds = this.getBounds();
+
+       x = Math.max(bounds[0], Math.min(bounds[2], x + w) - w);
+       y = Math.max(bounds[1], Math.min(bounds[3], y + h) - h);
+
+       return this.clampBoxSize(x, y, w, h, minW, minH);
+};
+
+TinyMCE_Windows.prototype.clampBoxSize = function(x, y, w, h, minW, minH) {
+       var bounds = this.getBounds();
+
+       return [
+               x, y,
+               Math.max(minW, Math.min(bounds[2], x + w) - x),
+               Math.max(minH, Math.min(bounds[3], y + h) - y)
+       ];
+};
+
+TinyMCE_Windows.prototype.getParam = function(name, default_value) {
+       var value = null;
+
+       value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];
+
+       // Fix bool values
+       if (value == "true" || value == "false")
+               return (value == "true");
+
+       return value;
+};
+
+TinyMCE_Windows.prototype.eventDispatcher = function(e) {
+       e = typeof(e) == "undefined" ? window.event : e;
+
+       if (mcWindows.selectedWindow == null)
+               return;
+
+       // Switch focus
+       if (mcWindows.isGecko && e.type == "mousedown") {
+               var elm = e.currentTarget;
+
+               for (var n in mcWindows.windows) {
+                       var win = mcWindows.windows[n];
+
+                       if (win.headElement == elm || win.resizeElement == elm) {
+                               win.focus();
+                               break;
+                       }
+               }
+       }
+
+       switch (e.type) {
+               case "mousemove":
+                       mcWindows.selectedWindow.onMouseMove(e);
+                       break;
+
+               case "mouseup":
+                       mcWindows.selectedWindow.onMouseUp(e);
+                       break;
+
+               case "mousedown":
+                       mcWindows.selectedWindow.onMouseDown(e);
+                       break;
+
+               case "focus":
+                       mcWindows.selectedWindow.onFocus(e);
+                       break;
+               case "scroll":
+               case "resize":
+                       if (mcWindows.clampUpdateTimeout)
+                               clearTimeout(mcWindows.clampUpdateTimeout);
+                       mcWindows.clampEventType = e.type;
+                       mcWindows.clampUpdateTimeout =
+                               setTimeout(function () {mcWindows.updateClamping()}, 100);
+                       break;
+       }
+};
+
+TinyMCE_Windows.prototype.updateClamping = function () {
+       var clamp, oversize, etype = mcWindows.clampEventType;
+
+       this.bounds = null; // Recalc window bounds on resize/scroll
+       this.clampUpdateTimeout = null;
+
+       for (var n in this.windows) {
+               win = this.windows[n];
+               if (typeof(win) == 'function' || ! win.winElement) continue;
+
+               clamp = mcWindows.clampBoxPosition(
+                       win.left, win.top,
+                       win.winElement.scrollWidth,
+                       win.winElement.scrollHeight,
+                       win.features.minWidth,
+                       win.features.minHeight
+               );
+               oversize = (
+                       clamp[2] != win.winElement.scrollWidth ||
+                       clamp[3] != win.winElement.scrollHeight
+               ) ? true : false;
+
+               if (!oversize || win.features.resizable == "yes" || etype != "scroll")
+                       win.moveTo(clamp[0], clamp[1]);
+               if (oversize && win.features.resizable == "yes")
+                       win.resizeTo(clamp[2], clamp[3]);
+       }
+};
+
+TinyMCE_Windows.prototype.addEvent = function(obj, name, handler) {
+       if (this.isMSIE)
+               obj.attachEvent("on" + name, handler);
+       else
+               obj.addEventListener(name, handler, false);
+};
+
+TinyMCE_Windows.prototype.cancelEvent = function(e) {
+       if (this.isMSIE) {
+               e.returnValue = false;
+               e.cancelBubble = true;
+       } else
+               e.preventDefault();
+};
+
+TinyMCE_Windows.prototype.parseFeatures = function(opts) {
+       // Cleanup the options
+       opts = opts.toLowerCase();
+       opts = opts.replace(/;/g, ",");
+       opts = opts.replace(/[^0-9a-z=,]/g, "");
+
+       var optionChunks = opts.split(',');
+       var options = new Array();
+
+       options['left'] = "10";
+       options['top'] = "10";
+       options['width'] = "300";
+       options['height'] = "300";
+       options['minwidth'] = "100";
+       options['minheight'] = "100";
+       options['resizable'] = "yes";
+       options['minimizable'] = "yes";
+       options['maximizable'] = "yes";
+       options['close'] = "yes";
+       options['movable'] = "yes";
+       options['statusbar'] = "yes";
+       options['scrollbars'] = "auto";
+       options['modal'] = "no";
+
+       if (opts == "")
+               return options;
+
+       for (var i=0; i<optionChunks.length; i++) {
+               var parts = optionChunks[i].split('=');
+
+               if (parts.length == 2)
+                       options[parts[0]] = parts[1];
+       }
+
+       options['left'] = parseInt(options['left']);
+       options['top'] = parseInt(options['top']);
+       options['width'] = parseInt(options['width']);
+       options['height'] = parseInt(options['height']);
+       options['minWidth'] = parseInt(options['minwidth']);
+       options['minHeight'] = parseInt(options['minheight']);
+
+       return options;
+};
+
+TinyMCE_Windows.prototype.open = function(url, name, features) {
+       this.lastSelectedWindow = this.selectedWindow;
+
+       var win = new TinyMCE_Window();
+       var winDiv, html = "", id;
+       var imgPath = this.getParam("images_path");
+
+       features = this.parseFeatures(features);
+
+       // Clamp specified dimensions
+       var clamp = mcWindows.clampBoxPosition(
+               features['left'], features['top'],
+               features['width'], features['height'],
+               features['minWidth'], features['minHeight']
+       );
+
+       features['left'] = clamp[0];
+       features['top'] = clamp[1];
+
+       if (features['resizable'] == "yes") {
+               features['width'] = clamp[2];
+               features['height'] = clamp[3];
+       }
+
+       // Create div
+       id = "mcWindow_" + name;
+       win.deltaHeight = 18;
+
+       if (features['statusbar'] == "yes") {
+               win.deltaHeight += 13;
+
+               if (this.isMSIE)
+                       win.deltaHeight += 1;
+       }
+
+       width = parseInt(features['width']);
+       height = parseInt(features['height'])-win.deltaHeight;
+
+       if (this.isMSIE)
+               width -= 2;
+
+       // Setup first part of window
+       win.id = id;
+       win.url = url;
+       win.name = name;
+       win.features = features;
+       this.windows[name] = win;
+
+       iframeWidth = width;
+       iframeHeight = height;
+
+       // Create inner content
+       html += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
+       html += '<html>';
+       html += '<head>';
+       html += '<title>Wrapper iframe</title>';
+       html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
+       html += '<link href="' + this.getParam("css_file") + '" rel="stylesheet" type="text/css" />';
+       html += '</head>';
+       html += '<body onload="parent.mcWindows.onLoad(\'' + name + '\');">';
+
+       html += '<div id="' + id + '_container" class="mceWindow">';
+       html += '<div id="' + id + '_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';
+       html += '  <div id="' + id + '_title" class="mceWindowTitle"';
+       html += '  onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;"></div>';
+       html += '    <div class="mceWindowHeadTools">';
+       html += '      <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].close();" target="_self" onmousedown="return false;" class="mceWindowClose"><img border="0" src="' + imgPath + '/window_close.gif" /></a>';
+       if (features['resizable'] == "yes" && features['maximizable'] == "yes")
+               html += '      <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].maximize();" target="_self" onmousedown="return false;" class="mceWindowMaximize"><img border="0" src="' + imgPath + '/window_maximize.gif" /></a>';
+       // html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].minimize();" target="_self" onmousedown="return false;" class="mceWindowMinimize"></a>';
+       html += '    </div>';
+       html += '</div><div id="' + id + '_body" class="mceWindowBody" style="width: ' + width + 'px; height: ' + height + 'px;">';
+       html += '<iframe id="' + id + '_iframe" name="' + id + '_iframe" frameborder="0" width="' + iframeWidth + '" height="' + iframeHeight + '" src="' + url + '" class="mceWindowBodyIframe" scrolling="' + features['scrollbars'] + '"></iframe></div>';
+
+       if (features['statusbar'] == "yes") {
+               html += '<div id="' + id + '_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';
+
+               if (features['resizable'] == "yes") {
+                       if (this.isGecko)
+                               html += '<div id="' + id + '_resize" class="mceWindowResize"><div style="background-image: url(\'' + imgPath + '/window_resize.gif\'); width: 12px; height: 12px;"></div></div>';
+                       else
+                               html += '<div id="' + id + '_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();" border="0" src="' + imgPath + '/window_resize.gif" /></div>';
+               }
+
+               html += '</div>';
+       }
+
+       html += '</div>';
+
+       html += '</body>';
+       html += '</html>';
+
+       // Create iframe
+       this.createFloatingIFrame(id, features['left'], features['top'], features['width'], features['height'], html);
+};
+
+// Blocks the document events by placing a image over the whole document
+TinyMCE_Windows.prototype.setDocumentLock = function(state) {
+       var elm = document.getElementById('mcWindowEventBlocker');
+
+       if (state) {
+               if (elm == null) {
+                       elm = document.createElement("div");
+
+                       elm.id = "mcWindowEventBlocker";
+                       elm.style.position = "absolute";
+                       elm.style.left = "0";
+                       elm.style.top = "0";
+
+                       document.body.appendChild(elm);
+               }
+
+               elm.style.display = "none";
+
+               var imgPath = this.getParam("images_path");
+               var width = document.body.clientWidth;
+               var height = document.body.clientHeight;
+
+               elm.style.width = width;
+               elm.style.height = height;
+               elm.innerHTML = '<img src="' + imgPath + '/spacer.gif" width="' + width + '" height="' + height + '" />';
+
+               elm.style.zIndex = mcWindows.zindex-1;
+               elm.style.display = "block";
+       } else if (elm != null) {
+               if (mcWindows.windows.length == 0)
+                       elm.parentNode.removeChild(elm);
+               else
+                       elm.style.zIndex = mcWindows.zindex-1;
+       }
+};
+
+// Gets called when wrapper iframe is initialized
+TinyMCE_Windows.prototype.onLoad = function(name) {
+       var win = mcWindows.windows[name];
+       var id = "mcWindow_" + name;
+       var wrapperIframe = window.frames[id + "_iframe"].frames[0];
+       var wrapperDoc = window.frames[id + "_iframe"].document;
+       var doc = window.frames[id + "_iframe"].document;
+       var winDiv = document.getElementById("mcWindow_" + name + "_div");
+       var realIframe = window.frames[id + "_iframe"].frames[0];
+
+       // Set window data
+       win.id = "mcWindow_" + name;
+       win.winElement = winDiv;
+       win.bodyElement = doc.getElementById(id + '_body');
+       win.iframeElement = doc.getElementById(id + '_iframe');
+       win.headElement = doc.getElementById(id + '_head');
+       win.titleElement = doc.getElementById(id + '_title');
+       win.resizeElement = doc.getElementById(id + '_resize');
+       win.containerElement = doc.getElementById(id + '_container');
+       win.left = win.features['left'];
+       win.top = win.features['top'];
+       win.frame = window.frames[id + '_iframe'].frames[0];
+       win.wrapperFrame = window.frames[id + '_iframe'];
+       win.wrapperIFrameElement = document.getElementById(id + "_iframe");
+
+       // Add event handlers
+       mcWindows.addEvent(win.headElement, "mousedown", mcWindows.eventDispatcher);
+
+       if (win.resizeElement != null)
+               mcWindows.addEvent(win.resizeElement, "mousedown", mcWindows.eventDispatcher);
+
+       if (mcWindows.isMSIE) {
+               mcWindows.addEvent(realIframe.document, "mousemove", mcWindows.eventDispatcher);
+               mcWindows.addEvent(realIframe.document, "mouseup", mcWindows.eventDispatcher);
+       } else {
+               mcWindows.addEvent(realIframe, "mousemove", mcWindows.eventDispatcher);
+               mcWindows.addEvent(realIframe, "mouseup", mcWindows.eventDispatcher);
+               mcWindows.addEvent(realIframe, "focus", mcWindows.eventDispatcher);
+       }
+
+       for (var i=0; i<window.frames.length; i++) {
+               if (!window.frames[i]._hasMouseHandlers) {
+                       if (mcWindows.isMSIE) {
+                               mcWindows.addEvent(window.frames[i].document, "mousemove", mcWindows.eventDispatcher);
+                               mcWindows.addEvent(window.frames[i].document, "mouseup", mcWindows.eventDispatcher);
+                       } else {
+                               mcWindows.addEvent(window.frames[i], "mousemove", mcWindows.eventDispatcher);
+                               mcWindows.addEvent(window.frames[i], "mouseup", mcWindows.eventDispatcher);
+                       }
+
+                       window.frames[i]._hasMouseHandlers = true;
+               }
+       }
+
+       if (mcWindows.isMSIE) {
+               mcWindows.addEvent(win.frame.document, "mousemove", mcWindows.eventDispatcher);
+               mcWindows.addEvent(win.frame.document, "mouseup", mcWindows.eventDispatcher);
+       } else {
+               mcWindows.addEvent(win.frame, "mousemove", mcWindows.eventDispatcher);
+               mcWindows.addEvent(win.frame, "mouseup", mcWindows.eventDispatcher);
+               mcWindows.addEvent(win.frame, "focus", mcWindows.eventDispatcher);
+       }
+
+       // Dispatch open window event
+       var func = this.getParam("on_open_window", "");
+       if (func != "")
+               eval(func + "(win);");
+
+       win.focus();
+
+       if (win.features['modal'] == "yes")
+               mcWindows.setDocumentLock(true);
+};
+
+TinyMCE_Windows.prototype.createFloatingIFrame = function(id_prefix, left, top, width, height, html) {
+       var iframe = document.createElement("iframe");
+       var div = document.createElement("div"), doc;
+
+       width = parseInt(width);
+       height = parseInt(height)+1;
+
+       // Create wrapper div
+       div.setAttribute("id", id_prefix + "_div");
+       div.setAttribute("width", width);
+       div.setAttribute("height", (height));
+       div.style.position = "absolute";
+
+       div.style.left = left + "px";
+       div.style.top = top + "px";
+       div.style.width = width + "px";
+       div.style.height = (height) + "px";
+       div.style.backgroundColor = "white";
+       div.style.display = "none";
+
+       if (this.isGecko) {
+               iframeWidth = width + 2;
+               iframeHeight = height + 2;
+       } else {
+               iframeWidth = width;
+               iframeHeight = height + 1;
+       }
+
+       // Create iframe
+       iframe.setAttribute("id", id_prefix + "_iframe");
+       iframe.setAttribute("name", id_prefix + "_iframe");
+       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", iframeWidth);
+       iframe.setAttribute("height", iframeHeight);
+       // iframe.setAttribute("src", "../jscripts/tiny_mce/blank.htm");
+       // iframe.setAttribute("allowtransparency", "false");
+       iframe.setAttribute("scrolling", "no");
+       iframe.style.width = iframeWidth + "px";
+       iframe.style.height = iframeHeight + "px";
+       iframe.style.backgroundColor = "white";
+       div.appendChild(iframe);
+
+       document.body.appendChild(div);
+
+       // Fixed MSIE 5.0 issue
+       div.innerHTML = div.innerHTML;
+
+       if (this.isSafari) {
+               // Give Safari some time to setup
+               window.setTimeout(function() {
+                       var doc = window.frames[id_prefix + '_iframe'].document;
+                       doc.open();
+                       doc.write(html);
+                       doc.close();
+               }, 10);
+       } else {
+               doc = window.frames[id_prefix + '_iframe'].window.document;
+               doc.open();
+               doc.write(html);
+               doc.close();
+       }
+
+       div.style.display = "block";
+
+       return div;
+};
+
+// Window instance
+function TinyMCE_Window() {
+};
+
+TinyMCE_Window.prototype.focus = function() {
+       if (this != mcWindows.selectedWindow) {
+               this.winElement.style.zIndex = ++mcWindows.zindex;
+               mcWindows.lastSelectedWindow = mcWindows.selectedWindow;
+               mcWindows.selectedWindow = this;
+       }
+};
+
+TinyMCE_Window.prototype.minimize = function() {
+};
+
+TinyMCE_Window.prototype.maximize = function() {
+       if (this.restoreSize) {
+               this.moveTo(this.restoreSize[0], this.restoreSize[1]);
+               this.resizeTo(this.restoreSize[2], this.restoreSize[3]);
+               this.updateClamping();
+               this.restoreSize = null;
+       } else {
+               var bounds = mcWindows.getBounds();
+               this.restoreSize = [
+                       this.left, this.top,
+                       this.winElement.scrollWidth,
+                       this.winElement.scrollHeight
+               ];
+               this.moveTo(bounds[0], bounds[1]);
+               this.resizeTo(
+                       bounds[2] - bounds[0],
+                       bounds[3] - bounds[1]
+               );
+       }
+};
+
+TinyMCE_Window.prototype.startResize = function() {
+       mcWindows.action = "resize";
+};
+
+TinyMCE_Window.prototype.startMove = function(e) {
+       mcWindows.action = "move";
+};
+
+TinyMCE_Window.prototype.close = function() {
+       if (this.frame && this.frame['tinyMCEPopup'])
+               this.frame['tinyMCEPopup'].restoreSelection();
+
+       if (mcWindows.lastSelectedWindow != null)
+               mcWindows.lastSelectedWindow.focus();
+
+       var mcWindowsNew = new Array();
+       for (var n in mcWindows.windows) {
+               var win = mcWindows.windows[n];
+               if (typeof(win) == 'function')
+                       continue;
+
+               if (win.name != this.name)
+                       mcWindowsNew[n] = win;
+       }
+
+       mcWindows.windows = mcWindowsNew;
+
+       // alert(mcWindows.doc.getElementById(this.id + "_iframe"));
+
+       var e = mcWindows.doc.getElementById(this.id + "_iframe");
+       e.parentNode.removeChild(e);
+
+       var e = mcWindows.doc.getElementById(this.id + "_div");
+       e.parentNode.removeChild(e);
+
+       mcWindows.setDocumentLock(false);
+};
+
+TinyMCE_Window.prototype.onMouseMove = function(e) {
+       var clamp;
+       // Calculate real X, Y
+       var dx = e.screenX - mcWindows.mouseDownScreenX;
+       var dy = e.screenY - mcWindows.mouseDownScreenY;
+
+       switch (mcWindows.action) {
+               case "resize":
+                       clamp = mcWindows.clampBoxSize(
+                               this.left, this.top,
+                               mcWindows.mouseDownWidth + (e.screenX - mcWindows.mouseDownScreenX),
+                               mcWindows.mouseDownHeight + (e.screenY - mcWindows.mouseDownScreenY),
+                               this.features.minWidth, this.features.minHeight
+                       );
+
+                       this.resizeTo(clamp[2], clamp[3]);
+
+                       mcWindows.cancelEvent(e);
+                       break;
+
+               case "move":
+                       this.left = mcWindows.mouseDownLayerX + (e.screenX - mcWindows.mouseDownScreenX);
+                       this.top = mcWindows.mouseDownLayerY + (e.screenY - mcWindows.mouseDownScreenY);
+                       this.updateClamping();
+
+                       mcWindows.cancelEvent(e);
+                       break;
+       }
+};
+
+TinyMCE_Window.prototype.moveTo = function (x, y) {
+       this.left = x;
+       this.top = y;
+
+       this.winElement.style.left = this.left + "px";
+       this.winElement.style.top = this.top + "px";
+};
+
+TinyMCE_Window.prototype.resizeTo = function (width, height) {
+       this.wrapperIFrameElement.style.width = (width+2) + 'px';
+       this.wrapperIFrameElement.style.height = (height+2) + 'px';
+       this.wrapperIFrameElement.width = width+2;
+       this.wrapperIFrameElement.height = height+2;
+       this.winElement.style.width = width + 'px';
+       this.winElement.style.height = height + 'px';
+
+       height = height - this.deltaHeight;
+
+       this.containerElement.style.width = width + 'px';
+       this.iframeElement.style.width = width + 'px';
+       this.iframeElement.style.height = height + 'px';
+       this.bodyElement.style.width = width + 'px';
+       this.bodyElement.style.height = height + 'px';
+       this.headElement.style.width = width + 'px';
+       //this.statusElement.style.width = width + 'px';
+};
+
+TinyMCE_Window.prototype.updateClamping = function () {
+       var clamp, oversize;
+
+       clamp = mcWindows.clampBoxPosition(
+               this.left, this.top,
+               this.winElement.scrollWidth,
+               this.winElement.scrollHeight,
+               this.features.minWidth, this.features.minHeight
+       );
+       oversize = (
+               clamp[2] != this.winElement.scrollWidth ||
+               clamp[3] != this.winElement.scrollHeight
+       ) ? true : false;
+
+       this.moveTo(clamp[0], clamp[1]);
+       if (this.features.resizable == "yes" && oversize)
+               this.resizeTo(clamp[2], clamp[3]);
+};
+
+function debug(msg) {
+       document.getElementById('debug').value += msg + "\n";
+}
+
+TinyMCE_Window.prototype.onMouseUp = function(e) {
+       mcWindows.action = "none";
+};
+
+TinyMCE_Window.prototype.onFocus = function(e) {
+       // Gecko only handler
+       var winRef = e.currentTarget;
+
+       for (var n in mcWindows.windows) {
+               var win = mcWindows.windows[n];
+               if (typeof(win) == 'function')
+                       continue;
+
+               if (winRef.name == win.id + "_iframe") {
+                       win.focus();
+                       return;
+               }
+       }
+};
+
+TinyMCE_Window.prototype.onMouseDown = function(e) {
+       var elm = mcWindows.isMSIE ? this.wrapperFrame.event.srcElement : e.target;
+
+       mcWindows.mouseDownScreenX = e.screenX;
+       mcWindows.mouseDownScreenY = e.screenY;
+       mcWindows.mouseDownLayerX = this.left;
+       mcWindows.mouseDownLayerY = this.top;
+       mcWindows.mouseDownWidth = parseInt(this.winElement.style.width);
+       mcWindows.mouseDownHeight = parseInt(this.winElement.style.height);
+
+       if (this.resizeElement != null && elm == this.resizeElement.firstChild)
+               this.startResize(e);
+       else
+               this.startMove(e);
+
+       mcWindows.cancelEvent(e);
+};
+
+// Global instance
+var mcWindows = new TinyMCE_Windows();
+
+// Initialize windows
+mcWindows.init({
+       images_path : tinyMCE.baseURL + "/plugins/inlinepopups/images",
+       css_file : tinyMCE.baseURL + "/plugins/inlinepopups/css/inlinepopup.css"
+});
diff --git a/media/tiny_mce/plugins/inlinepopups/images/spacer.gif b/media/tiny_mce/plugins/inlinepopups/images/spacer.gif
new file mode 100755 (executable)
index 0000000..fc25609
Binary files /dev/null and b/media/tiny_mce/plugins/inlinepopups/images/spacer.gif differ
diff --git a/media/tiny_mce/plugins/inlinepopups/images/window_close.gif b/media/tiny_mce/plugins/inlinepopups/images/window_close.gif
new file mode 100755 (executable)
index 0000000..3469e5a
Binary files /dev/null and b/media/tiny_mce/plugins/inlinepopups/images/window_close.gif differ
diff --git a/media/tiny_mce/plugins/inlinepopups/images/window_maximize.gif b/media/tiny_mce/plugins/inlinepopups/images/window_maximize.gif
new file mode 100755 (executable)
index 0000000..fcae73e
Binary files /dev/null and b/media/tiny_mce/plugins/inlinepopups/images/window_maximize.gif differ
diff --git a/media/tiny_mce/plugins/inlinepopups/images/window_minimize.gif b/media/tiny_mce/plugins/inlinepopups/images/window_minimize.gif
new file mode 100755 (executable)
index 0000000..94f167a
Binary files /dev/null and b/media/tiny_mce/plugins/inlinepopups/images/window_minimize.gif differ
diff --git a/media/tiny_mce/plugins/inlinepopups/images/window_resize.gif b/media/tiny_mce/plugins/inlinepopups/images/window_resize.gif
new file mode 100755 (executable)
index 0000000..6c402d0
Binary files /dev/null and b/media/tiny_mce/plugins/inlinepopups/images/window_resize.gif differ
diff --git a/media/tiny_mce/plugins/inlinepopups/jscripts/mcwindows.js b/media/tiny_mce/plugins/inlinepopups/jscripts/mcwindows.js
new file mode 100755 (executable)
index 0000000..325d293
--- /dev/null
@@ -0,0 +1,453 @@
+/**\r
+ * $Id: mcwindows.js 18 2006-06-29 14:11:23Z spocke $\r
+ *\r
+ * Moxiecode DHTML Windows script.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+// Windows handler\r
+function MCWindows() {\r
+       this.settings = new Array();\r
+       this.windows = new Array();\r
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+       this.isGecko = navigator.userAgent.indexOf('Gecko') != -1;\r
+       this.isSafari = navigator.userAgent.indexOf('Safari') != -1;\r
+       this.isMac = navigator.userAgent.indexOf('Mac') != -1;\r
+       this.isMSIE5_0 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5.0') != -1);\r
+       this.action = "none";\r
+       this.selectedWindow = null;\r
+       this.zindex = 100;\r
+       this.mouseDownScreenX = 0;\r
+       this.mouseDownScreenY = 0;\r
+       this.mouseDownLayerX = 0;\r
+       this.mouseDownLayerY = 0;\r
+       this.mouseDownWidth = 0;\r
+       this.mouseDownHeight = 0;\r
+};\r
+\r
+MCWindows.prototype.init = function(settings) {\r
+       this.settings = settings;\r
+\r
+       if (this.isMSIE)\r
+               this.addEvent(document, "mousemove", mcWindows.eventDispatcher);\r
+       else\r
+               this.addEvent(window, "mousemove", mcWindows.eventDispatcher);\r
+\r
+       this.addEvent(document, "mouseup", mcWindows.eventDispatcher);\r
+};\r
+\r
+MCWindows.prototype.getParam = function(name, default_value) {\r
+       var value = null;\r
+\r
+       value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];\r
+\r
+       // Fix bool values\r
+       if (value == "true" || value == "false")\r
+               return (value == "true");\r
+\r
+       return value;\r
+};\r
+\r
+MCWindows.prototype.eventDispatcher = function(e) {\r
+       e = typeof(e) == "undefined" ? window.event : e;\r
+\r
+       if (mcWindows.selectedWindow == null)\r
+               return;\r
+\r
+       // Switch focus\r
+       if (mcWindows.isGecko && e.type == "mousedown") {\r
+               var elm = e.currentTarget;\r
+\r
+               for (var n in mcWindows.windows) {\r
+                       var win = mcWindows.windows[n];\r
+                       if (typeof(win) == 'function')\r
+                               continue;\r
+\r
+                       if (win.headElement == elm || win.resizeElement == elm) {\r
+                               win.focus();\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+\r
+       switch (e.type) {\r
+               case "mousemove":\r
+                       mcWindows.selectedWindow.onMouseMove(e);\r
+                       break;\r
+\r
+               case "mouseup":\r
+                       mcWindows.selectedWindow.onMouseUp(e);\r
+                       break;\r
+\r
+               case "mousedown":\r
+                       mcWindows.selectedWindow.onMouseDown(e);\r
+                       break;\r
+\r
+               case "focus":\r
+                       mcWindows.selectedWindow.onFocus(e);\r
+                       break;\r
+       }\r
+}\r
+\r
+MCWindows.prototype.addEvent = function(obj, name, handler) {\r
+       if (this.isMSIE)\r
+               obj.attachEvent("on" + name, handler);\r
+       else\r
+               obj.addEventListener(name, handler, true);\r
+};\r
+\r
+MCWindows.prototype.cancelEvent = function(e) {\r
+       if (this.isMSIE) {\r
+               e.returnValue = false;\r
+               e.cancelBubble = true;\r
+       } else\r
+               e.preventDefault();\r
+};\r
+\r
+MCWindows.prototype.parseFeatures = function(opts) {\r
+       // Cleanup the options\r
+       opts = opts.toLowerCase();\r
+       opts = opts.replace(/;/g, ",");\r
+       opts = opts.replace(/[^0-9a-z=,]/g, "");\r
+\r
+       var optionChunks = opts.split(',');\r
+       var options = new Array();\r
+\r
+       options['left'] = 10;\r
+       options['top'] = 10;\r
+       options['width'] = 300;\r
+       options['height'] = 300;\r
+       options['resizable'] = true;\r
+       options['minimizable'] = true;\r
+       options['maximizable'] = true;\r
+       options['close'] = true;\r
+       options['movable'] = true;\r
+\r
+       if (opts == "")\r
+               return options;\r
+\r
+       for (var i=0; i<optionChunks.length; i++) {\r
+               var parts = optionChunks[i].split('=');\r
+\r
+               if (parts.length == 2)\r
+                       options[parts[0]] = parts[1];\r
+       }\r
+\r
+       return options;\r
+};\r
+\r
+MCWindows.prototype.open = function(url, name, features) {\r
+       var win = new MCWindow();\r
+       var winDiv, html = "", id;\r
+\r
+       features = this.parseFeatures(features);\r
+\r
+       // Create div\r
+       id = "mcWindow_" + name;\r
+\r
+       width = parseInt(features['width']);\r
+       height = parseInt(features['height'])-12-19;\r
+\r
+       if (this.isMSIE)\r
+               width -= 2;\r
+\r
+       // Setup first part of window\r
+       win.id = id;\r
+       win.url = url;\r
+       win.name = name;\r
+       win.features = features;\r
+       this.windows[name] = win;\r
+\r
+       iframeWidth = width;\r
+       iframeHeight = height;\r
+\r
+       // Create inner content\r
+       html += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';\r
+       html += '<html>';\r
+       html += '<head>';\r
+       html += '<title>Wrapper iframe</title>';\r
+       html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';\r
+       html += '<link href="../jscripts/tiny_mce/themes/advanced/css/editor_ui.css" rel="stylesheet" type="text/css" />';\r
+       html += '</head>';\r
+       html += '<body onload="parent.mcWindows.onLoad(\'' + name + '\');">';\r
+\r
+       html += '<div id="' + id + '_container" class="mceWindow">';\r
+       html += '<div id="' + id + '_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';\r
+       html += '  <div id="' + id + '_title" class="mceWindowTitle"';\r
+       html += '  onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;">No name window</div>';\r
+       html += '    <div class="mceWindowHeadTools">';\r
+       html += '      <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].close();" onmousedown="return false;" class="mceWindowClose"><img border="0" src="../jscripts/tiny_mce/themes/advanced/images/window_close.gif" /></a>';\r
+//     html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].maximize();" onmousedown="return false;" class="mceWindowMaximize"></a>';\r
+//     html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].minimize();" onmousedown="return false;" class="mceWindowMinimize"></a>';\r
+       html += '    </div>';\r
+       html += '</div><div id="' + id + '_body" class="mceWindowBody" style="width: ' + width + 'px; height: ' + height + 'px;">';\r
+       html += '<iframe id="' + id + '_iframe" name="' + id + '_iframe" onfocus="parent.mcWindows.windows[\'' + name + '\'].focus();" frameborder="0" width="' + iframeWidth + '" height="' + iframeHeight + '" src="' + url + '" class="mceWindowBodyIframe"></iframe></div>';\r
+       html += '<div id="' + id + '_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';\r
+       html += '<div id="' + id + '_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();" border="0" src="../jscripts/tiny_mce/themes/advanced/images/window_resize.gif" /></div>';\r
+       html += '</div>';\r
+       html += '</div>';\r
+\r
+       html += '</body>';\r
+       html += '</html>';\r
+\r
+       // Create iframe\r
+       this.createFloatingIFrame(id, features['left'], features['top'], features['width'], features['height'], html);\r
+};\r
+\r
+// Gets called when wrapper iframe is initialized\r
+MCWindows.prototype.onLoad = function(name) {\r
+       var win = mcWindows.windows[name];\r
+       var id = "mcWindow_" + name;\r
+       var wrapperIframe = window.frames[id + "_iframe"].frames[0];\r
+       var wrapperDoc = window.frames[id + "_iframe"].document;\r
+       var doc = window.frames[id + "_iframe"].document;\r
+       var winDiv = document.getElementById("mcWindow_" + name + "_div");\r
+       var realIframe = window.frames[id + "_iframe"].frames[0];\r
+\r
+       // Set window data\r
+       win.id = "mcWindow_" + name + "_iframe";\r
+       win.winElement = winDiv;\r
+       win.bodyElement = doc.getElementById(id + '_body');\r
+       win.iframeElement = doc.getElementById(id + '_iframe');\r
+       win.headElement = doc.getElementById(id + '_head');\r
+       win.titleElement = doc.getElementById(id + '_title');\r
+       win.resizeElement = doc.getElementById(id + '_resize');\r
+       win.containerElement = doc.getElementById(id + '_container');\r
+       win.left = win.features['left'];\r
+       win.top = win.features['top'];\r
+       win.frame = window.frames[id + '_iframe'].frames[0];\r
+       win.wrapperFrame = window.frames[id + '_iframe'];\r
+       win.wrapperIFrameElement = document.getElementById(id + "_iframe");\r
+\r
+       // Add event handlers\r
+       mcWindows.addEvent(win.headElement, "mousedown", mcWindows.eventDispatcher);\r
+       mcWindows.addEvent(win.resizeElement, "mousedown", mcWindows.eventDispatcher);\r
+\r
+       if (mcWindows.isMSIE) {\r
+               mcWindows.addEvent(realIframe.document, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(realIframe.document, "mouseup", mcWindows.eventDispatcher);\r
+       } else {\r
+               mcWindows.addEvent(realIframe, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(realIframe, "mouseup", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(realIframe, "focus", mcWindows.eventDispatcher);\r
+       }\r
+\r
+       for (var i=0; i<window.frames.length; i++) {\r
+               if (!window.frames[i]._hasMouseHandlers) {\r
+                       if (mcWindows.isMSIE) {\r
+                               mcWindows.addEvent(window.frames[i].document, "mousemove", mcWindows.eventDispatcher);\r
+                               mcWindows.addEvent(window.frames[i].document, "mouseup", mcWindows.eventDispatcher);\r
+                       } else {\r
+                               mcWindows.addEvent(window.frames[i], "mousemove", mcWindows.eventDispatcher);\r
+                               mcWindows.addEvent(window.frames[i], "mouseup", mcWindows.eventDispatcher);\r
+                       }\r
+\r
+                       window.frames[i]._hasMouseHandlers = true;\r
+               }\r
+       }\r
+\r
+       if (mcWindows.isMSIE) {\r
+               mcWindows.addEvent(win.frame.document, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(win.frame.document, "mouseup", mcWindows.eventDispatcher);\r
+       } else {\r
+               mcWindows.addEvent(win.frame, "mousemove", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(win.frame, "mouseup", mcWindows.eventDispatcher);\r
+               mcWindows.addEvent(win.frame, "focus", mcWindows.eventDispatcher);\r
+       }\r
+\r
+       this.selectedWindow = win;\r
+};\r
+\r
+MCWindows.prototype.createFloatingIFrame = function(id_prefix, left, top, width, height, html) {\r
+       var iframe = document.createElement("iframe");\r
+       var div = document.createElement("div");\r
+\r
+       width = parseInt(width);\r
+       height = parseInt(height)+1;\r
+\r
+       // Create wrapper div\r
+       div.setAttribute("id", id_prefix + "_div");\r
+       div.setAttribute("width", width);\r
+       div.setAttribute("height", (height));\r
+       div.style.position = "absolute";\r
+       div.style.left = left + "px";\r
+       div.style.top = top + "px";\r
+       div.style.width = width + "px";\r
+       div.style.height = (height) + "px";\r
+       div.style.backgroundColor = "white";\r
+       div.style.display = "none";\r
+\r
+       if (this.isGecko) {\r
+               iframeWidth = width + 2;\r
+               iframeHeight = height + 2;\r
+       } else {\r
+               iframeWidth = width;\r
+               iframeHeight = height + 1;\r
+       }\r
+\r
+       // Create iframe\r
+       iframe.setAttribute("id", id_prefix + "_iframe");\r
+       iframe.setAttribute("name", id_prefix + "_iframe");\r
+       iframe.setAttribute("border", "0");\r
+       iframe.setAttribute("frameBorder", "0");\r
+       iframe.setAttribute("marginWidth", "0");\r
+       iframe.setAttribute("marginHeight", "0");\r
+       iframe.setAttribute("leftMargin", "0");\r
+       iframe.setAttribute("topMargin", "0");\r
+       iframe.setAttribute("width", iframeWidth);\r
+       iframe.setAttribute("height", iframeHeight);\r
+//     iframe.setAttribute("src", "../jscripts/tiny_mce/blank.htm");\r
+       // iframe.setAttribute("allowtransparency", "false");\r
+       iframe.setAttribute("scrolling", "no");\r
+       iframe.style.width = iframeWidth + "px";\r
+       iframe.style.height = iframeHeight + "px";\r
+       iframe.style.backgroundColor = "white";\r
+       div.appendChild(iframe);\r
+\r
+       document.body.appendChild(div);\r
+\r
+       // Fixed MSIE 5.0 issue\r
+       div.innerHTML = div.innerHTML;\r
+\r
+       if (this.isSafari) {\r
+               // Give Safari some time to setup\r
+               window.setTimeout(function() {\r
+                       doc = window.frames[id_prefix + '_iframe'].document;\r
+                       doc.open();\r
+                       doc.write(html);\r
+                       doc.close();\r
+               }, 10);\r
+       } else {\r
+               doc = window.frames[id_prefix + '_iframe'].window.document\r
+               doc.open();\r
+               doc.write(html);\r
+               doc.close();\r
+       }\r
+\r
+       div.style.display = "block";\r
+\r
+       return div;\r
+};\r
+\r
+// Window instance\r
+function MCWindow() {\r
+};\r
+\r
+MCWindow.prototype.focus = function() {\r
+       this.winElement.style.zIndex = mcWindows.zindex++;\r
+       mcWindows.selectedWindow = this;\r
+};\r
+\r
+MCWindow.prototype.minimize = function() {\r
+};\r
+\r
+MCWindow.prototype.maximize = function() {\r
+       \r
+};\r
+\r
+MCWindow.prototype.startResize = function() {\r
+       mcWindows.action = "resize";\r
+};\r
+\r
+MCWindow.prototype.startMove = function(e) {\r
+       mcWindows.action = "move";\r
+};\r
+\r
+MCWindow.prototype.close = function() {\r
+       document.body.removeChild(this.winElement);\r
+       mcWindows.windows[this.name] = null;\r
+};\r
+\r
+MCWindow.prototype.onMouseMove = function(e) {\r
+       var scrollX = 0;//this.doc.body.scrollLeft;\r
+       var scrollY = 0;//this.doc.body.scrollTop;\r
+\r
+       // Calculate real X, Y\r
+       var dx = e.screenX - mcWindows.mouseDownScreenX;\r
+       var dy = e.screenY - mcWindows.mouseDownScreenY;\r
+\r
+       switch (mcWindows.action) {\r
+               case "resize":\r
+                       width = mcWindows.mouseDownWidth + (e.screenX - mcWindows.mouseDownScreenX);\r
+                       height = mcWindows.mouseDownHeight + (e.screenY - mcWindows.mouseDownScreenY);\r
+\r
+                       width = width < 100 ? 100 : width;\r
+                       height = height < 100 ? 100 : height;\r
+\r
+                       this.wrapperIFrameElement.style.width = width+2;\r
+                       this.wrapperIFrameElement.style.height = height+2;\r
+                       this.wrapperIFrameElement.width = width+2;\r
+                       this.wrapperIFrameElement.height = height+2;\r
+                       this.winElement.style.width = width;\r
+                       this.winElement.style.height = height;\r
+\r
+                       height = height-12-19;\r
+\r
+                       this.containerElement.style.width = width;\r
+\r
+                       this.iframeElement.style.width = width;\r
+                       this.iframeElement.style.height = height;\r
+                       this.bodyElement.style.width = width;\r
+                       this.bodyElement.style.height = height;\r
+                       this.headElement.style.width = width;\r
+                       //this.statusElement.style.width = width;\r
+\r
+                       mcWindows.cancelEvent(e);\r
+                       break;\r
+\r
+               case "move":\r
+                       this.left = mcWindows.mouseDownLayerX + (e.screenX - mcWindows.mouseDownScreenX);\r
+                       this.top = mcWindows.mouseDownLayerY + (e.screenY - mcWindows.mouseDownScreenY);\r
+                       this.winElement.style.left = this.left + "px";\r
+                       this.winElement.style.top = this.top + "px";\r
+\r
+                       mcWindows.cancelEvent(e);\r
+                       break;\r
+       }\r
+};\r
+\r
+MCWindow.prototype.onMouseUp = function(e) {\r
+       mcWindows.action = "none";\r
+};\r
+\r
+MCWindow.prototype.onFocus = function(e) {\r
+       // Gecko only handler\r
+       var winRef = e.currentTarget;\r
+\r
+       for (var n in mcWindows.windows) {\r
+               var win = mcWindows.windows[n];\r
+               if (typeof(win) == 'function')\r
+                       continue;\r
+\r
+               if (winRef.name == win.id) {\r
+                       win.focus();\r
+                       return;\r
+               }\r
+       }\r
+};\r
+\r
+MCWindow.prototype.onMouseDown = function(e) {\r
+       var elm = mcWindows.isMSIE ? this.wrapperFrame.event.srcElement : e.target;\r
+\r
+       var scrollX = 0;//this.doc.body.scrollLeft;\r
+       var scrollY = 0;//this.doc.body.scrollTop;\r
+\r
+       mcWindows.mouseDownScreenX = e.screenX;\r
+       mcWindows.mouseDownScreenY = e.screenY;\r
+       mcWindows.mouseDownLayerX = this.left;\r
+       mcWindows.mouseDownLayerY = this.top;\r
+       mcWindows.mouseDownWidth = parseInt(this.winElement.style.width);\r
+       mcWindows.mouseDownHeight = parseInt(this.winElement.style.height);\r
+\r
+       if (elm == this.resizeElement.firstChild)\r
+               this.startResize(e);\r
+       else\r
+               this.startMove(e);\r
+\r
+       mcWindows.cancelEvent(e);\r
+};\r
+\r
+// Global instance\r
+var mcWindows = new MCWindows();\r
diff --git a/media/tiny_mce/plugins/inlinepopups/readme.txt b/media/tiny_mce/plugins/inlinepopups/readme.txt
new file mode 100755 (executable)
index 0000000..e69de29
diff --git a/media/tiny_mce/plugins/insertdatetime/editor_plugin.js b/media/tiny_mce/plugins/insertdatetime/editor_plugin.js
new file mode 100755 (executable)
index 0000000..8ad58e7
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('insertdatetime');var TinyMCE_InsertDateTimePlugin={getInfo:function(){return{longname:'Insert date/time',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"insertdate":return tinyMCE.getButtonHTML(cn,'lang_insertdate_desc','{$pluginurl}/images/insertdate.gif','mceInsertDate');case"inserttime":return tinyMCE.getButtonHTML(cn,'lang_inserttime_desc','{$pluginurl}/images/inserttime.gif','mceInsertTime')}return""},execCommand:function(editor_id,element,command,user_interface,value){function addZeros(value,len){value=""+value;if(value.length<len){for(var i=0;i<(len-value.length);i++)value="0"+value}return value}function getDateTime(d,fmt){fmt=fmt.replace("%D","%m/%d/%y");fmt=fmt.replace("%r","%I:%M:%S %p");fmt=fmt.replace("%Y",""+d.getFullYear());fmt=fmt.replace("%y",""+d.getYear());fmt=fmt.replace("%m",addZeros(d.getMonth()+1,2));fmt=fmt.replace("%d",addZeros(d.getDate(),2));fmt=fmt.replace("%H",""+addZeros(d.getHours(),2));fmt=fmt.replace("%M",""+addZeros(d.getMinutes(),2));fmt=fmt.replace("%S",""+addZeros(d.getSeconds(),2));fmt=fmt.replace("%I",""+((d.getHours()+11)%12+1));fmt=fmt.replace("%p",""+(d.getHours()<12?"AM":"PM"));fmt=fmt.replace("%B",""+tinyMCE.getLang("lang_inserttime_months_long")[d.getMonth()]);fmt=fmt.replace("%b",""+tinyMCE.getLang("lang_inserttime_months_short")[d.getMonth()]);fmt=fmt.replace("%A",""+tinyMCE.getLang("lang_inserttime_day_long")[d.getDay()]);fmt=fmt.replace("%a",""+tinyMCE.getLang("lang_inserttime_day_short")[d.getDay()]);fmt=fmt.replace("%%","%");return fmt}switch(command){case"mceInsertDate":tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,getDateTime(new Date(),tinyMCE.getParam("plugin_insertdate_dateFormat",tinyMCE.getLang('lang_insertdate_def_fmt'))));return true;case"mceInsertTime":tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,getDateTime(new Date(),tinyMCE.getParam("plugin_insertdate_timeFormat",tinyMCE.getLang('lang_inserttime_def_fmt'))));return true}return false}};tinyMCE.addPlugin("insertdatetime",TinyMCE_InsertDateTimePlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/insertdatetime/editor_plugin_src.js b/media/tiny_mce/plugins/insertdatetime/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..7772cce
--- /dev/null
@@ -0,0 +1,90 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('insertdatetime');\r
+\r
+var TinyMCE_InsertDateTimePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Insert date/time',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       /**\r
+        * Returns the HTML contents of the insertdate, inserttime controls.\r
+        */\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "insertdate":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_insertdate_desc', '{$pluginurl}/images/insertdate.gif', 'mceInsertDate');\r
+\r
+                       case "inserttime":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_inserttime_desc', '{$pluginurl}/images/inserttime.gif', 'mceInsertTime');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes the mceInsertDate command.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               /* Adds zeros infront of value */\r
+               function addZeros(value, len) {\r
+                       value = "" + value;\r
+\r
+                       if (value.length < len) {\r
+                               for (var i=0; i<(len-value.length); i++)\r
+                                       value = "0" + value;\r
+                       }\r
+\r
+                       return value;\r
+               }\r
+\r
+               function getDateTime(d, fmt) {\r
+                       fmt = fmt.replace("%D", "%m/%d/%y");\r
+                       fmt = fmt.replace("%r", "%I:%M:%S %p");\r
+                       fmt = fmt.replace("%Y", "" + d.getFullYear());\r
+                       fmt = fmt.replace("%y", "" + d.getYear());\r
+                       fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));\r
+                       fmt = fmt.replace("%d", addZeros(d.getDate(), 2));\r
+                       fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));\r
+                       fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));\r
+                       fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));\r
+                       fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));\r
+                       fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));\r
+                       fmt = fmt.replace("%B", "" + tinyMCE.getLang("lang_inserttime_months_long")[d.getMonth()]);\r
+                       fmt = fmt.replace("%b", "" + tinyMCE.getLang("lang_inserttime_months_short")[d.getMonth()]);\r
+                       fmt = fmt.replace("%A", "" + tinyMCE.getLang("lang_inserttime_day_long")[d.getDay()]);\r
+                       fmt = fmt.replace("%a", "" + tinyMCE.getLang("lang_inserttime_day_short")[d.getDay()]);\r
+                       fmt = fmt.replace("%%", "%");\r
+\r
+                       return fmt;\r
+               }\r
+\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceInsertDate":\r
+                               tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, getDateTime(new Date(), tinyMCE.getParam("plugin_insertdate_dateFormat", tinyMCE.getLang('lang_insertdate_def_fmt'))));\r
+                               return true;\r
+\r
+                       case "mceInsertTime":\r
+                               tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, getDateTime(new Date(), tinyMCE.getParam("plugin_insertdate_timeFormat", tinyMCE.getLang('lang_inserttime_def_fmt'))));\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("insertdatetime", TinyMCE_InsertDateTimePlugin);\r
diff --git a/media/tiny_mce/plugins/insertdatetime/images/insertdate.gif b/media/tiny_mce/plugins/insertdatetime/images/insertdate.gif
new file mode 100755 (executable)
index 0000000..8ad424d
Binary files /dev/null and b/media/tiny_mce/plugins/insertdatetime/images/insertdate.gif differ
diff --git a/media/tiny_mce/plugins/insertdatetime/images/inserttime.gif b/media/tiny_mce/plugins/insertdatetime/images/inserttime.gif
new file mode 100755 (executable)
index 0000000..6dad3b3
Binary files /dev/null and b/media/tiny_mce/plugins/insertdatetime/images/inserttime.gif differ
diff --git a/media/tiny_mce/plugins/insertdatetime/langs/en.js b/media/tiny_mce/plugins/insertdatetime/langs/en.js
new file mode 100755 (executable)
index 0000000..c3ec02b
--- /dev/null
@@ -0,0 +1,12 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+insertdate_def_fmt : '%Y-%m-%d',\r
+inserttime_def_fmt : '%H:%M:%S',\r
+insertdate_desc : 'Insert date',\r
+inserttime_desc : 'Insert time',\r
+inserttime_months_long : new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"),\r
+inserttime_months_short : new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),\r
+inserttime_day_long : new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"),\r
+inserttime_day_short : new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")\r
+});\r
diff --git a/media/tiny_mce/plugins/insertdatetime/readme.txt b/media/tiny_mce/plugins/insertdatetime/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/layer/editor_plugin.js b/media/tiny_mce/plugins/layer/editor_plugin.js
new file mode 100755 (executable)
index 0000000..a40b42d
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('layer');var TinyMCE_LayerPlugin={getInfo:function(){return{longname:'Layer',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(tinyMCE.isMSIE&&!tinyMCE.isOpera)inst.getDoc().execCommand('2D-Position')},handleEvent:function(e){var inst=tinyMCE.selectedInstance;var w=inst.getWin(),le=inst._lastStyleElm,e;if(tinyMCE.isGecko){e=this._getParentLayer(inst.getFocusElement());if(e){if(!inst._lastStyleElm){e.style.overflow='auto';inst._lastStyleElm=e}}else if(le){le=inst._lastStyleElm;le.style.width=le.scrollWidth+'px';le.style.height=le.scrollHeight+'px';le.style.overflow='';inst._lastStyleElm=null}}return true},handleVisualAid:function(el,deep,state,inst){var nl=inst.getDoc().getElementsByTagName("div"),i;for(i=0;i<nl.length;i++){if(new RegExp('absolute|relative|static','gi').test(nl[i].style.position)){if(state)tinyMCE.addCSSClass(nl[i],'mceVisualAid');else tinyMCE.removeCSSClass(nl[i],'mceVisualAid')}}},getControlHTML:function(cn){switch(cn){case"moveforward":return tinyMCE.getButtonHTML(cn,'lang_layer_forward_desc','{$pluginurl}/images/moveforward.gif','mceMoveForward',true);case"movebackward":return tinyMCE.getButtonHTML(cn,'lang_layer_backward_desc','{$pluginurl}/images/movebackward.gif','mceMoveBackward',true);case"absolute":return tinyMCE.getButtonHTML(cn,'lang_layer_absolute_desc','{$pluginurl}/images/absolute.gif','mceMakeAbsolute',true);case"insertlayer":return tinyMCE.getButtonHTML(cn,'lang_layer_insertlayer_desc','{$pluginurl}/images/insertlayer.gif','mceInsertLayer',true)}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceInsertLayer":this._insertLayer();return true;case"mceMoveForward":this._move(1);return true;case"mceMoveBackward":this._move(-1);return true;case"mceMakeAbsolute":this._toggleAbsolute();return true}return false},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var inst=tinyMCE.getInstanceById(editor_id);var le=this._getParentLayer(inst.getFocusElement());var p=tinyMCE.getParentElement(inst.getFocusElement(),'div,p,img');tinyMCE.switchClass(editor_id+'_absolute','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_moveforward','mceButtonDisabled');tinyMCE.switchClass(editor_id+'_movebackward','mceButtonDisabled');if(p)tinyMCE.switchClass(editor_id+'_absolute','mceButtonNormal');if(le&&le.style.position.toLowerCase()=="absolute"){tinyMCE.switchClass(editor_id+'_absolute','mceButtonSelected');tinyMCE.switchClass(editor_id+'_moveforward','mceButtonNormal');tinyMCE.switchClass(editor_id+'_movebackward','mceButtonNormal')}},_move:function(d){var inst=tinyMCE.selectedInstance,i,z=new Array();var le=this._getParentLayer(inst.getFocusElement()),ci=-1,fi=-1;var nl=tinyMCE.selectNodes(inst.getBody(),function(n){return n.nodeType==1&&new RegExp('absolute|relative|static','gi').test(n.style.position)});for(i=0;i<nl.length;i++){z[i]=nl[i].style.zIndex?parseInt(nl[i].style.zIndex):0;if(ci<0&&nl[i]==le)ci=i}if(d<0){for(i=0;i<z.length;i++){if(z[i]<z[ci]){fi=i;break}}if(fi>-1){nl[ci].style.zIndex=z[fi];nl[fi].style.zIndex=z[ci]}else{if(z[ci]>0)nl[ci].style.zIndex=z[ci]-1}}else{for(i=0;i<z.length;i++){if(z[i]>z[ci]){fi=i;break}}if(fi>-1){nl[ci].style.zIndex=z[fi];nl[fi].style.zIndex=z[ci]}else nl[ci].style.zIndex=z[ci]+1}inst.repaint()},_getParentLayer:function(n){return tinyMCE.getParentNode(n,function(n){return n.nodeType==1&&new RegExp('absolute|relative|static','gi').test(n.style.position)})},_insertLayer:function(){var inst=tinyMCE.selectedInstance;var e=tinyMCE.getParentElement(inst.getFocusElement());var p=tinyMCE.getAbsPosition(e);var d=inst.getDoc();var ne=d.createElement('div');var h=inst.selection.getSelectedHTML();ne.style.position='absolute';ne.style.left=p.absLeft+'px';ne.style.top=(p.absTop>20?p.absTop:20)+'px';ne.style.width='100px';ne.style.height='100px';ne.className='mceVisualAid';if(!h)h=tinyMCE.getLang('lang_layer_content');ne.innerHTML=h;d.body.appendChild(ne)},_toggleAbsolute:function(){var inst=tinyMCE.selectedInstance;var le=this._getParentLayer(inst.getFocusElement());if(le==null)le=tinyMCE.getParentElement(inst.getFocusElement(),'div,p,img');if(le){if(le.style.position.toLowerCase()=="absolute"){le.style.position="";le.style.left="";le.style.top=""}else{le.style.position="absolute";if(le.style.left=="")le.style.left=20+'px';if(le.style.top=="")le.style.top=20+'px';if(le.style.width=="")le.style.width=le.width?(le.width+'px'):'100px';if(le.style.height=="")le.style.height=le.height?(le.height+'px'):'100px';tinyMCE.handleVisualAid(inst.getBody(),true,inst.visualAid,inst)}inst.repaint();tinyMCE.triggerNodeChange()}}};tinyMCE.addPlugin("layer",TinyMCE_LayerPlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/layer/editor_plugin_src.js b/media/tiny_mce/plugins/layer/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..28feff2
--- /dev/null
@@ -0,0 +1,248 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('layer');\r
+\r
+var TinyMCE_LayerPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Layer',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               if (tinyMCE.isMSIE && !tinyMCE.isOpera)\r
+                       inst.getDoc().execCommand('2D-Position');\r
+       },\r
+\r
+       handleEvent : function(e) {\r
+               var inst = tinyMCE.selectedInstance;\r
+               var w = inst.getWin(), le = inst._lastStyleElm, e;\r
+\r
+               if (tinyMCE.isGecko) {\r
+                       e = this._getParentLayer(inst.getFocusElement());\r
+\r
+                       if (e) {\r
+                               if (!inst._lastStyleElm) {\r
+                                       e.style.overflow = 'auto';\r
+                                       inst._lastStyleElm = e;\r
+                               }\r
+                       } else if (le) {\r
+                               le = inst._lastStyleElm;\r
+                               le.style.width = le.scrollWidth + 'px';\r
+                               le.style.height = le.scrollHeight + 'px';\r
+                               le.style.overflow = '';\r
+                               inst._lastStyleElm = null;\r
+                       }\r
+               }\r
+\r
+               return true;\r
+       },\r
+\r
+       handleVisualAid : function(el, deep, state, inst) {\r
+               var nl = inst.getDoc().getElementsByTagName("div"), i;\r
+\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (new RegExp('absolute|relative|static', 'gi').test(nl[i].style.position)) {\r
+                               if (state)\r
+                                       tinyMCE.addCSSClass(nl[i], 'mceVisualAid');\r
+                               else\r
+                                       tinyMCE.removeCSSClass(nl[i], 'mceVisualAid');                                  \r
+                       }\r
+               }\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "moveforward":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_layer_forward_desc', '{$pluginurl}/images/moveforward.gif', 'mceMoveForward', true);\r
+\r
+                       case "movebackward":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_layer_backward_desc', '{$pluginurl}/images/movebackward.gif', 'mceMoveBackward', true);\r
+\r
+                       case "absolute":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_layer_absolute_desc', '{$pluginurl}/images/absolute.gif', 'mceMakeAbsolute', true);\r
+\r
+                       case "insertlayer":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_layer_insertlayer_desc', '{$pluginurl}/images/insertlayer.gif', 'mceInsertLayer', true);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceInsertLayer":\r
+                               this._insertLayer();\r
+                               return true;\r
+\r
+                       case "mceMoveForward":\r
+                               this._move(1);\r
+                               return true;\r
+\r
+                       case "mceMoveBackward":\r
+                               this._move(-1);\r
+                               return true;\r
+\r
+                       case "mceMakeAbsolute":\r
+                               this._toggleAbsolute();\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+               var le = this._getParentLayer(inst.getFocusElement());\r
+               var p = tinyMCE.getParentElement(inst.getFocusElement(), 'div,p,img');\r
+\r
+               tinyMCE.switchClass(editor_id + '_absolute', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_moveforward', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_movebackward', 'mceButtonDisabled');\r
+\r
+               if (p)\r
+                       tinyMCE.switchClass(editor_id + '_absolute', 'mceButtonNormal');\r
+\r
+               if (le && le.style.position.toLowerCase() == "absolute") {\r
+                       tinyMCE.switchClass(editor_id + '_absolute', 'mceButtonSelected');\r
+                       tinyMCE.switchClass(editor_id + '_moveforward', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_movebackward', 'mceButtonNormal');\r
+               }\r
+       },\r
+\r
+       // Private plugin specific methods\r
+\r
+       _move : function(d) {\r
+               var inst = tinyMCE.selectedInstance, i, z = new Array();\r
+               var le = this._getParentLayer(inst.getFocusElement()), ci = -1, fi = -1;\r
+               var nl = tinyMCE.selectNodes(inst.getBody(), function(n) {\r
+                       return n.nodeType == 1 && new RegExp('absolute|relative|static', 'gi').test(n.style.position);\r
+               });\r
+\r
+               // Find z-indexes\r
+               for (i=0; i<nl.length; i++) {\r
+                       z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex) : 0;\r
+\r
+                       if (ci < 0 && nl[i] == le)\r
+                               ci = i;\r
+               }\r
+\r
+               if (d < 0) {\r
+                       // Move back\r
+\r
+                       // Try find a lower one\r
+                       for (i=0; i<z.length; i++) {\r
+                               if (z[i] < z[ci]) {\r
+                                       fi = i;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if (fi > -1) {\r
+                               nl[ci].style.zIndex = z[fi];\r
+                               nl[fi].style.zIndex = z[ci];\r
+                       } else {\r
+                               if (z[ci] > 0)\r
+                                       nl[ci].style.zIndex = z[ci] - 1;\r
+                       }\r
+               } else {\r
+                       // Move forward\r
+\r
+                       // Try find a higher one\r
+                       for (i=0; i<z.length; i++) {\r
+                               if (z[i] > z[ci]) {\r
+                                       fi = i;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if (fi > -1) {\r
+                               nl[ci].style.zIndex = z[fi];\r
+                               nl[fi].style.zIndex = z[ci];\r
+                       } else\r
+                               nl[ci].style.zIndex = z[ci] + 1;\r
+               }\r
+\r
+               inst.repaint();\r
+       },\r
+\r
+       _getParentLayer : function(n) {\r
+               return tinyMCE.getParentNode(n, function(n) {\r
+                       return n.nodeType == 1 && new RegExp('absolute|relative|static', 'gi').test(n.style.position);\r
+               });\r
+       },\r
+\r
+       _insertLayer : function() {\r
+               var inst = tinyMCE.selectedInstance;\r
+               var e = tinyMCE.getParentElement(inst.getFocusElement());\r
+               var p = tinyMCE.getAbsPosition(e);\r
+               var d = inst.getDoc();\r
+               var ne = d.createElement('div');\r
+               var h = inst.selection.getSelectedHTML();\r
+\r
+               // Move div\r
+               ne.style.position = 'absolute';\r
+               ne.style.left = p.absLeft + 'px';\r
+               ne.style.top = (p.absTop > 20 ? p.absTop : 20) + 'px';\r
+               ne.style.width = '100px';\r
+               ne.style.height = '100px';\r
+               ne.className = 'mceVisualAid';\r
+\r
+               if (!h)\r
+                       h = tinyMCE.getLang('lang_layer_content');\r
+\r
+               ne.innerHTML = h;\r
+\r
+               // Add it\r
+               d.body.appendChild(ne);\r
+       },\r
+\r
+       _toggleAbsolute : function() {\r
+               var inst = tinyMCE.selectedInstance;\r
+               var le = this._getParentLayer(inst.getFocusElement());\r
+\r
+               if (le == null)\r
+                       le = tinyMCE.getParentElement(inst.getFocusElement(), 'div,p,img');\r
+\r
+               if (le) {\r
+                       if (le.style.position.toLowerCase() == "absolute") {\r
+                               le.style.position = "";\r
+                               le.style.left = "";\r
+                               le.style.top = "";\r
+                       } else {\r
+                               le.style.position = "absolute";\r
+\r
+                               if (le.style.left == "")\r
+                                       le.style.left = 20 + 'px';\r
+\r
+                               if (le.style.top == "")\r
+                                       le.style.top = 20 + 'px';\r
+\r
+                               if (le.style.width == "")\r
+                                       le.style.width = le.width ? (le.width + 'px') : '100px';\r
+\r
+                               if (le.style.height == "")\r
+                                       le.style.height = le.height ? (le.height + 'px') : '100px';\r
+\r
+                               tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+                       }\r
+\r
+                       inst.repaint();\r
+                       tinyMCE.triggerNodeChange();\r
+               }\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("layer", TinyMCE_LayerPlugin);\r
diff --git a/media/tiny_mce/plugins/layer/images/absolute.gif b/media/tiny_mce/plugins/layer/images/absolute.gif
new file mode 100755 (executable)
index 0000000..72cffdd
Binary files /dev/null and b/media/tiny_mce/plugins/layer/images/absolute.gif differ
diff --git a/media/tiny_mce/plugins/layer/images/backward.gif b/media/tiny_mce/plugins/layer/images/backward.gif
new file mode 100755 (executable)
index 0000000..466b158
Binary files /dev/null and b/media/tiny_mce/plugins/layer/images/backward.gif differ
diff --git a/media/tiny_mce/plugins/layer/images/forward.gif b/media/tiny_mce/plugins/layer/images/forward.gif
new file mode 100755 (executable)
index 0000000..e8b7a5a
Binary files /dev/null and b/media/tiny_mce/plugins/layer/images/forward.gif differ
diff --git a/media/tiny_mce/plugins/layer/images/insert_layer.gif b/media/tiny_mce/plugins/layer/images/insert_layer.gif
new file mode 100755 (executable)
index 0000000..bc29af0
Binary files /dev/null and b/media/tiny_mce/plugins/layer/images/insert_layer.gif differ
diff --git a/media/tiny_mce/plugins/layer/images/insertlayer.gif b/media/tiny_mce/plugins/layer/images/insertlayer.gif
new file mode 100755 (executable)
index 0000000..bc29af0
Binary files /dev/null and b/media/tiny_mce/plugins/layer/images/insertlayer.gif differ
diff --git a/media/tiny_mce/plugins/layer/images/movebackward.gif b/media/tiny_mce/plugins/layer/images/movebackward.gif
new file mode 100755 (executable)
index 0000000..466b158
Binary files /dev/null and b/media/tiny_mce/plugins/layer/images/movebackward.gif differ
diff --git a/media/tiny_mce/plugins/layer/images/moveforward.gif b/media/tiny_mce/plugins/layer/images/moveforward.gif
new file mode 100755 (executable)
index 0000000..e8b7a5a
Binary files /dev/null and b/media/tiny_mce/plugins/layer/images/moveforward.gif differ
diff --git a/media/tiny_mce/plugins/layer/langs/en.js b/media/tiny_mce/plugins/layer/langs/en.js
new file mode 100755 (executable)
index 0000000..cdd8c22
--- /dev/null
@@ -0,0 +1,9 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('layer',{\r
+insertlayer_desc : 'Insert new layer',\r
+forward_desc : 'Move forward',\r
+backward_desc : 'Move backward',\r
+absolute_desc : 'Toggle absolute positioning',\r
+content : 'New layer...'\r
+});\r
diff --git a/media/tiny_mce/plugins/layer/readme.txt b/media/tiny_mce/plugins/layer/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/media/css/content.css b/media/tiny_mce/plugins/media/css/content.css
new file mode 100755 (executable)
index 0000000..1f667e6
--- /dev/null
@@ -0,0 +1,26 @@
+.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {\r
+       border: 1px dotted #cc0000;\r
+       background-position: center;\r
+       background-repeat: no-repeat;\r
+       background-color: #ffffcc;\r
+}\r
+\r
+.mceItemShockWave {\r
+       background-image: url('../images/shockwave.gif');\r
+}\r
+\r
+.mceItemFlash {\r
+       background-image: url('../images/flash.gif');\r
+}\r
+\r
+.mceItemQuickTime {\r
+       background-image: url('../images/quicktime.gif');\r
+}\r
+\r
+.mceItemWindowsMedia {\r
+       background-image: url('../images/windowsmedia.gif');\r
+}\r
+\r
+.mceItemRealMedia {\r
+       background-image: url('../images/realmedia.gif');\r
+}\r
diff --git a/media/tiny_mce/plugins/media/css/media.css b/media/tiny_mce/plugins/media/css/media.css
new file mode 100755 (executable)
index 0000000..89c6bd5
--- /dev/null
@@ -0,0 +1,68 @@
+#id, #name, #hspace, #vspace, #class_name, #align {\r
+       width: 100px;\r
+}\r
+\r
+#hspace, #vspace {\r
+       width: 50px;\r
+}\r
+\r
+#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode {\r
+       width: 100px;\r
+}\r
+\r
+#flash_base, #flash_flashvars {\r
+       width: 240px;\r
+}\r
+\r
+#width, #height {\r
+       width: 40px;\r
+}\r
+\r
+#src, #media_type {\r
+       width: 250px;\r
+}\r
+\r
+#class {\r
+       width: 120px;\r
+}\r
+\r
+#prev {\r
+       margin: 0;\r
+       border: 1px solid black;\r
+       width: 99%;\r
+       height: 230px;\r
+       overflow: auto;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 390px;\r
+       overflow: auto;\r
+}\r
+\r
+#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options {\r
+       display: none;\r
+}\r
+\r
+.mceAddSelectValue {\r
+       background-color: #DDDDDD;\r
+}\r
+\r
+#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume {\r
+       width: 70px;\r
+}\r
+\r
+#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume {\r
+       width: 70px;\r
+}\r
+\r
+#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks {\r
+       width: 70px;\r
+}\r
+\r
+#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle {\r
+       width: 90px;\r
+}\r
+\r
+#qt_qtsrc {\r
+       width: 200px;\r
+}\r
diff --git a/media/tiny_mce/plugins/media/editor_plugin.js b/media/tiny_mce/plugins/media/editor_plugin.js
new file mode 100755 (executable)
index 0000000..d431986
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('media');var TinyMCE_MediaPlugin={getInfo:function(){return{longname:'Media',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(inst.hasPlugin('flash')&&!tinyMCE.flashWarn){alert('Flash plugin is deprecated and should not be used together with the media plugin.');tinyMCE.flashWarn=true}if(!tinyMCE.settings['media_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/media/css/content.css")},getControlHTML:function(cn){switch(cn){case"media":return tinyMCE.getButtonHTML(cn,'lang_media_desc','{$pluginurl}/images/media.gif','mceMedia')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceMedia":tinyMCE.openWindow({file:'../../plugins/media/media.htm',width:430+tinyMCE.getLang('lang_media_delta_width',0),height:470+tinyMCE.getLang('lang_media_delta_height',0)},{editor_id:editor_id,inline:"yes"});return true}return false},cleanup:function(type,content,inst){var nl,img,i,ne,d,s,ci;switch(type){case"insert_to_editor":img=tinyMCE.getParam("theme_href")+'/images/spacer.gif';content=content.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,'<img class="mceItem$1" title="$2" src="'+img+'" />');content=content.replace(/<object([^>]*)>/gi,'<div class="mceItemObject" $1>');content=content.replace(/<embed([^>]*)>/gi,'<div class="mceItemObjectEmbed" $1>');content=content.replace(/<\/(object|embed)([^>]*)>/gi,'</div>');content=content.replace(/<param([^>]*)>/gi,'<div $1 class="mceItemParam"></div>');content=content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>','gi'),'class="mceItemParam"></div>');break;case"insert_to_editor_dom":d=inst.getDoc();nl=content.getElementsByTagName("img");for(i=0;i<nl.length;i++){if(/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(nl[i].className)){nl[i].width=nl[i].title.replace(/.*width:[^0-9]?([0-9]+)%?.*/g,'$1');nl[i].height=nl[i].title.replace(/.*height:[^0-9]?([0-9]+)%?.*/g,'$1');}}nl=tinyMCE.selectElements(content,'DIV',function(n){return tinyMCE.hasCSSClass(n,'mceItemObject')});for(i=0;i<nl.length;i++){ci=tinyMCE.getAttrib(nl[i],"classid").toLowerCase().replace(/\s+/g,'');switch(ci){case'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemFlash',d,nl[i]),nl[i]);break;case'clsid:166b1bca-3f9c-11cf-8075-444553540000':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemShockWave',d,nl[i]),nl[i]);break;case'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':case'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':case'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemWindowsMedia',d,nl[i]),nl[i]);break;case'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemQuickTime',d,nl[i]),nl[i]);break;case'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemRealMedia',d,nl[i]),nl[i]);break}}nl=tinyMCE.selectNodes(content,function(n){return n.className=='mceItemObjectEmbed'});for(i=0;i<nl.length;i++){switch(tinyMCE.getAttrib(nl[i],'type')){case'application/x-shockwave-flash':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemFlash');break;case'application/x-director':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemShockWave');break;case'application/x-mplayer2':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemWindowsMedia');break;case'video/quicktime':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemQuickTime');break;case'audio/x-pn-realaudio-plugin':TinyMCE_MediaPlugin._createImgFromEmbed(nl[i],d,'mceItemRealMedia');break}}break;case"get_from_editor":var startPos=-1,endPos,attribs,chunkBefore,chunkAfter,embedHTML,at,pl,cb,mt,ex;while((startPos=content.indexOf('<img',startPos+1))!=-1){endPos=content.indexOf('/>',startPos);attribs=TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos+4,endPos));if(!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))continue;endPos+=2;at=attribs['title'];if(at){at=at.replace(/&(#39|apos);/g,"'");at=at.replace(/&#quot;/g,'"');try{pl=eval('x={'+at+'};')}catch(ex){pl={}}}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}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{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+"'");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='<script type="text/javascript">'+s+'({'+at+'});</script>'}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<at.length;i++){if(at[i].specified&&at[i].nodeValue){an=at[i].nodeName.toLowerCase();if(an=='src')continue;if(an=='mce_src')an='src';if(an.indexOf('mce_')==-1&&!new RegExp('^(class|type)$').test(an))ti+=an.toLowerCase()+':\''+at[i].nodeValue+"',"}}ti=ti.length>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<nl.length;i++){av=tinyMCE.getAttrib(nl[i],'value');av=av.replace(new RegExp('\\\\','g'),'\\\\');av=av.replace(new RegExp('"','g'),'\\"');av=av.replace(new RegExp("'",'g'),"\\'");an=tinyMCE.getAttrib(nl[i],'name');al[an]=av}if(al.movie){al.src=al.movie;al.movie=null}for(an in al){if(al[an]!=null&&typeof(al[an])!="function"&&al[an]!='')ti+=an.toLowerCase()+':\''+al[an]+"',"}ti=ti.length>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+='<object classid="clsid:'+cls+'" codebase="'+cb+'"';h+=typeof(p.id)!="undefined"?' id="'+p.id+'"':'';h+=typeof(p.name)!="undefined"?' name="'+p.name+'"':'';h+=typeof(p.width)!="undefined"?' width="'+p.width+'"':'';h+=typeof(p.height)!="undefined"?' height="'+p.height+'"':'';h+=typeof(p.align)!="undefined"?' align="'+p.align+'"':'';h+='>';for(n in p){if(typeof(p[n])!="undefined"&&typeof(p[n])!="function"){h+='<param name="'+n+'" value="'+p[n]+'" />';if(n=='src'&&p[n].indexOf('://')!=-1&&mt=='application/x-mplayer2')h+='<param name="url" value="'+p[n]+'" />'}}h+='<embed type="'+mt+'"';for(n in p){if(typeof(p[n])=="function")continue;if(!(n=='url'&&mt=='application/x-mplayer2'))h+=' '+n+'="'+p[n]+'"'}h+='></embed></object>';return h},_parseAttributes:function(attribute_string){var attributeName="",endChr='"';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<attribute_string.length;i++){var chr=attribute_string.charAt(i);if((chr=='"'||chr=="'")&&!withInValue){withInValue=true;endChr=chr}else if(chr==endChr&&withInValue){withInValue=false;var pos=attributeName.lastIndexOf(' ');if(pos!=-1)attributeName=attributeName.substring(pos+1);attributes[attributeName.toLowerCase()]=attributeValue.substring(1);attributeName="";attributeValue=""}else if(!whiteSpaceRegExp.test(chr)&&!withInName&&!withInValue)withInName=true;if(chr=='='&&withInName)withInName=false;if(withInName)attributeName+=chr;if(withInValue)attributeValue+=chr}return attributes}};tinyMCE.addPlugin("media",TinyMCE_MediaPlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/media/editor_plugin_src.js b/media/tiny_mce/plugins/media/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..4478ebb
--- /dev/null
@@ -0,0 +1,435 @@
+/**\r
+ * $Id: editor_plugin_src.js 275 2007-05-01 15:35:08Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('media');\r
+\r
+var TinyMCE_MediaPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Media',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               // Warn if user has flash plugin and media plugin at the same time\r
+               if (inst.hasPlugin('flash') && !tinyMCE.flashWarn) {\r
+                       alert('Flash plugin is deprecated and should not be used together with the media plugin.');\r
+                       tinyMCE.flashWarn = true;\r
+               }\r
+\r
+               if (!tinyMCE.settings['media_skip_plugin_css'])\r
+                       tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/media/css/content.css");\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "media":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_media_desc', '{$pluginurl}/images/media.gif', 'mceMedia');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceMedia":\r
+                               tinyMCE.openWindow({\r
+                                               file : '../../plugins/media/media.htm',\r
+                                               width : 430 + tinyMCE.getLang('lang_media_delta_width', 0),\r
+                                               height : 470 + tinyMCE.getLang('lang_media_delta_height', 0)\r
+                                       }, {\r
+                                               editor_id : editor_id,\r
+                                               inline : "yes"\r
+                               });\r
+\r
+                               return true;\r
+          }\r
+\r
+          // Pass to next handler in chain\r
+          return false;\r
+       },\r
+\r
+       cleanup : function(type, content, inst) {\r
+               var nl, img, i, ne, d, s, ci;\r
+\r
+               switch (type) {\r
+                       case "insert_to_editor":\r
+                               img = tinyMCE.getParam("theme_href") + '/images/spacer.gif';\r
+                               content = content.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, '<img class="mceItem$1" title="$2" src="' + img + '" />');\r
+                               content = content.replace(/<object([^>]*)>/gi, '<div class="mceItemObject" $1>');\r
+                               content = content.replace(/<embed([^>]*)>/gi, '<div class="mceItemObjectEmbed" $1>');\r
+                               content = content.replace(/<\/(object|embed)([^>]*)>/gi, '</div>');\r
+                               content = content.replace(/<param([^>]*)>/gi, '<div $1 class="mceItemParam"></div>');\r
+                               content = content.replace(new RegExp('\\/ class="mceItemParam"><\\/div>', 'gi'), 'class="mceItemParam"></div>');\r
+                               break;\r
+\r
+                       case "insert_to_editor_dom":\r
+                               d = inst.getDoc();\r
+                               nl = content.getElementsByTagName("img");\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(nl[i].className)) {\r
+                                               nl[i].width = nl[i].title.replace(/.*width:[^0-9]?([0-9]+)%?.*/g, '$1');\r
+                                               nl[i].height = nl[i].title.replace(/.*height:[^0-9]?([0-9]+)%?.*/g, '$1');\r
+                                               //nl[i].align = nl[i].title.replace(/.*align:([a-z]+).*/gi, '$1');\r
+                                       }\r
+                               }\r
+\r
+                               nl = tinyMCE.selectElements(content, 'DIV', function (n) {return tinyMCE.hasCSSClass(n, 'mceItemObject');});\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       ci = tinyMCE.getAttrib(nl[i], "classid").toLowerCase().replace(/\s+/g, '');\r
+\r
+                                       switch (ci) {\r
+                                               case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemFlash', d, nl[i]), nl[i]);\r
+                                                       break;\r
+\r
+                                               case 'clsid:166b1bca-3f9c-11cf-8075-444553540000':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemShockWave', d, nl[i]), nl[i]);\r
+                                                       break;\r
+\r
+                                               case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':\r
+                                               case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':\r
+                                               case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemWindowsMedia', d, nl[i]), nl[i]);\r
+                                                       break;\r
+\r
+                                               case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemQuickTime', d, nl[i]), nl[i]);\r
+                                                       break;\r
+\r
+                                               case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':\r
+                                                       nl[i].parentNode.replaceChild(TinyMCE_MediaPlugin._createImg('mceItemRealMedia', d, nl[i]), nl[i]);\r
+                                                       break;\r
+                                       }\r
+                               }\r
+\r
+                               // Handle embed (if any)\r
+                               nl = tinyMCE.selectNodes(content, function (n) {return n.className == 'mceItemObjectEmbed';});\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       switch (tinyMCE.getAttrib(nl[i], 'type')) {\r
+                                               case 'application/x-shockwave-flash':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemFlash');\r
+                                                       break;\r
+\r
+                                               case 'application/x-director':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemShockWave');\r
+                                                       break;\r
+\r
+                                               case 'application/x-mplayer2':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemWindowsMedia');\r
+                                                       break;\r
+\r
+                                               case 'video/quicktime':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemQuickTime');\r
+                                                       break;\r
+\r
+                                               case 'audio/x-pn-realaudio-plugin':\r
+                                                       TinyMCE_MediaPlugin._createImgFromEmbed(nl[i], d, 'mceItemRealMedia');\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                               break;\r
+\r
+                       case "get_from_editor":\r
+                               var startPos = -1, endPos, attribs, chunkBefore, chunkAfter, embedHTML, at, pl, cb, mt, ex;\r
+\r
+                               while ((startPos = content.indexOf('<img', startPos+1)) != -1) {\r
+                                       endPos = content.indexOf('/>', startPos);\r
+                                       attribs = TinyMCE_MediaPlugin._parseAttributes(content.substring(startPos + 4, endPos));\r
+\r
+                                       // Is not flash, skip it\r
+                                       if (!/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(attribs['class']))\r
+                                               continue;\r
+\r
+                                       endPos += 2;\r
+\r
+                                       // Parse attributes\r
+                                       at = attribs['title'];\r
+                                       if (at) {\r
+                                               at = at.replace(/&(#39|apos);/g, "'");\r
+                                               at = at.replace(/&#quot;/g, '"');\r
+\r
+                                               try {\r
+                                                       pl = eval('x={' + at + '};');\r
+                                               } catch (ex) {\r
+                                                       pl = {};\r
+                                               }\r
+                                       }\r
+\r
+                                       // Use object/embed\r
+                                       if (!tinyMCE.getParam('media_use_script', false)) {\r
+                                               switch (attribs['class']) {\r
+                                                       case 'mceItemFlash':\r
+                                                               ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000';\r
+                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
+                                                               mt = 'application/x-shockwave-flash';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemShockWave':\r
+                                                               ci = '166B1BCA-3F9C-11CF-8075-444553540000';\r
+                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';\r
+                                                               mt = 'application/x-director';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemWindowsMedia':\r
+                                                               ci = tinyMCE.getParam('media_wmp6_compatible') ? '05589FA1-C356-11CE-BF01-00AA0055595A' : '6BF52A52-394A-11D3-B153-00C04F79FAA6';\r
+                                                               cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
+                                                               mt = 'application/x-mplayer2';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemQuickTime':\r
+                                                               ci = '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';\r
+                                                               cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';\r
+                                                               mt = 'video/quicktime';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemRealMedia':\r
+                                                               ci = 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';\r
+                                                               cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
+                                                               mt = 'audio/x-pn-realaudio-plugin';\r
+                                                               break;\r
+                                               }\r
+\r
+                                               // Force absolute URL\r
+                                               if (!tinyMCE.getParam("relative_urls"))\r
+                                                       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);\r
+\r
+                                               embedHTML = TinyMCE_MediaPlugin._getEmbed(ci, cb, mt, pl, attribs);\r
+                                       } else {\r
+                                               // Use script version\r
+                                               switch (attribs['class']) {\r
+                                                       case 'mceItemFlash':\r
+                                                               s = 'writeFlash';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemShockWave':\r
+                                                               s = 'writeShockWave';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemWindowsMedia':\r
+                                                               s = 'writeWindowsMedia';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemQuickTime':\r
+                                                               s = 'writeQuickTime';\r
+                                                               break;\r
+\r
+                                                       case 'mceItemRealMedia':\r
+                                                               s = 'writeRealMedia';\r
+                                                               break;\r
+                                               }\r
+\r
+                                               if (attribs.width)\r
+                                                       at = at.replace(/width:[^0-9]?[0-9]+%?[^0-9]?/g, "width:'" + attribs.width + "'");\r
+\r
+                                               if (attribs.height)\r
+                                                       at = at.replace(/height:[^0-9]?[0-9]+%?[^0-9]?/g, "height:'" + attribs.height + "'");\r
+\r
+                                               // Force absolute URL\r
+                                               if (!tinyMCE.getParam("relative_urls")) {\r
+                                                       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);\r
+                                                       at = at.replace(new RegExp("src:'[^']*'", "g"), "src:'" + pl.src + "'");\r
+                                               }\r
+\r
+                                               embedHTML = '<script type="text/javascript">' + s + '({' + at + '});</script>';\r
+                                       }\r
+\r
+                                       // Insert embed/object chunk\r
+                                       chunkBefore = content.substring(0, startPos);\r
+                                       chunkAfter = content.substring(endPos);\r
+                                       content = chunkBefore + embedHTML + chunkAfter;\r
+                               }\r
+                               break;\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               if (node == null)\r
+                       return;\r
+\r
+               do {\r
+                       if (node.nodeName == "IMG" && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(node, 'class'))) {\r
+                               tinyMCE.switchClass(editor_id + '_media', 'mceButtonSelected');\r
+                               return true;\r
+                       }\r
+               } while ((node = node.parentNode));\r
+\r
+               tinyMCE.switchClass(editor_id + '_media', 'mceButtonNormal');\r
+\r
+               return true;\r
+       },\r
+\r
+       _createImgFromEmbed : function(n, d, cl) {\r
+               var ne, at, i, ti = '', an;\r
+\r
+               ne = d.createElement('img');\r
+               ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif';\r
+               ne.width = tinyMCE.getAttrib(n, 'width');\r
+               ne.height = tinyMCE.getAttrib(n, 'height');\r
+               ne.className = cl;\r
+\r
+               at = n.attributes;\r
+               for (i=0; i<at.length; i++) {\r
+                       if (at[i].specified && at[i].nodeValue) {\r
+                               an = at[i].nodeName.toLowerCase();\r
+\r
+                               if (an == 'src')\r
+                                       continue;\r
+\r
+                               if (an == 'mce_src')\r
+                                       an = 'src';\r
+\r
+                               if (an.indexOf('mce_') == -1 && !new RegExp('^(class|type)$').test(an))\r
+                                       ti += an.toLowerCase() + ':\'' + at[i].nodeValue + "',";\r
+                       }\r
+               }\r
+\r
+               ti = ti.length > 0 ? ti.substring(0, ti.length - 1) : ti;\r
+               ne.title = ti;\r
+\r
+               n.parentNode.replaceChild(ne, n);\r
+       },\r
+\r
+       _createImg : function(cl, d, n) {\r
+               var i, nl, ti = "", an, av, al = new Array();\r
+\r
+               ne = d.createElement('img');\r
+               ne.src = tinyMCE.getParam("theme_href") + '/images/spacer.gif';\r
+               ne.width = tinyMCE.getAttrib(n, 'width');\r
+               ne.height = tinyMCE.getAttrib(n, 'height');\r
+               ne.className = cl;\r
+\r
+               al.id = tinyMCE.getAttrib(n, 'id');\r
+               al.name = tinyMCE.getAttrib(n, 'name');\r
+               al.width = tinyMCE.getAttrib(n, 'width');\r
+               al.height = tinyMCE.getAttrib(n, 'height');\r
+               al.bgcolor = tinyMCE.getAttrib(n, 'bgcolor');\r
+               al.align = tinyMCE.getAttrib(n, 'align');\r
+               al.class_name = tinyMCE.getAttrib(n, 'mce_class');\r
+\r
+               nl = n.getElementsByTagName('div');\r
+               for (i=0; i<nl.length; i++) {\r
+                       av = tinyMCE.getAttrib(nl[i], 'value');\r
+                       av = av.replace(new RegExp('\\\\', 'g'), '\\\\');\r
+                       av = av.replace(new RegExp('"', 'g'), '\\"');\r
+                       av = av.replace(new RegExp("'", 'g'), "\\'");\r
+                       an = tinyMCE.getAttrib(nl[i], 'name');\r
+                       al[an] = av;\r
+               }\r
+\r
+               if (al.movie) {\r
+                       al.src = al.movie;\r
+                       al.movie = null;\r
+               }\r
+\r
+               for (an in al) {\r
+                       if (al[an] != null && typeof(al[an]) != "function" && al[an] != '')\r
+                               ti += an.toLowerCase() + ':\'' + al[an] + "',";\r
+               }\r
+\r
+               ti = ti.length > 0 ? ti.substring(0, ti.length - 1) : ti;\r
+               ne.title = ti;\r
+\r
+               return ne;\r
+       },\r
+\r
+       _getEmbed : function(cls, cb, mt, p, at) {\r
+               var h = '', n;\r
+\r
+               p.width = at.width ? at.width : p.width;\r
+               p.height = at.height ? at.height : p.height;\r
+\r
+               h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';\r
+               h += typeof(p.id) != "undefined" ? ' id="' + p.id + '"' : '';\r
+               h += typeof(p.name) != "undefined" ? ' name="' + p.name + '"' : '';\r
+               h += typeof(p.width) != "undefined" ? ' width="' + p.width + '"' : '';\r
+               h += typeof(p.height) != "undefined" ? ' height="' + p.height + '"' : '';\r
+               h += typeof(p.align) != "undefined" ? ' align="' + p.align + '"' : '';\r
+               h += '>';\r
+\r
+               for (n in p) {\r
+                       if (typeof(p[n]) != "undefined" && typeof(p[n]) != "function") {\r
+                               h += '<param name="' + n + '" value="' + p[n] + '" />';\r
+\r
+                               // Add extra url parameter if it's an absolute URL on WMP\r
+                               if (n == 'src' && p[n].indexOf('://') != -1 && mt == 'application/x-mplayer2')\r
+                                       h += '<param name="url" value="' + p[n] + '" />';\r
+                       }\r
+               }\r
+\r
+               h += '<embed type="' + mt + '"';\r
+\r
+               for (n in p) {\r
+                       if (typeof(p[n]) == "function")\r
+                               continue;\r
+\r
+                       // Skip url parameter for embed tag on WMP\r
+                       if (!(n == 'url' && mt == 'application/x-mplayer2'))\r
+                               h += ' ' + n + '="' + p[n] + '"';\r
+               }\r
+\r
+               h += '></embed></object>';\r
+\r
+               return h;\r
+       },\r
+\r
+       _parseAttributes : function(attribute_string) {\r
+               var attributeName = "", endChr = '"';\r
+               var attributeValue = "";\r
+               var withInName;\r
+               var withInValue;\r
+               var attributes = new Array();\r
+               var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');\r
+\r
+               if (attribute_string == null || attribute_string.length < 2)\r
+                       return null;\r
+\r
+               withInName = withInValue = false;\r
+\r
+               for (var i=0; i<attribute_string.length; i++) {\r
+                       var chr = attribute_string.charAt(i);\r
+\r
+                       if ((chr == '"' || chr == "'") && !withInValue) {\r
+                               withInValue = true;\r
+                               endChr = chr;\r
+                       } else if (chr == endChr && withInValue) {\r
+                               withInValue = false;\r
+\r
+                               var pos = attributeName.lastIndexOf(' ');\r
+                               if (pos != -1)\r
+                                       attributeName = attributeName.substring(pos+1);\r
+\r
+                               attributes[attributeName.toLowerCase()] = attributeValue.substring(1);\r
+\r
+                               attributeName = "";\r
+                               attributeValue = "";\r
+                       } else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)\r
+                               withInName = true;\r
+\r
+                       if (chr == '=' && withInName)\r
+                               withInName = false;\r
+\r
+                       if (withInName)\r
+                               attributeName += chr;\r
+\r
+                       if (withInValue)\r
+                               attributeValue += chr;\r
+               }\r
+\r
+               return attributes;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("media", TinyMCE_MediaPlugin);\r
diff --git a/media/tiny_mce/plugins/media/images/flash.gif b/media/tiny_mce/plugins/media/images/flash.gif
new file mode 100755 (executable)
index 0000000..cb192e6
Binary files /dev/null and b/media/tiny_mce/plugins/media/images/flash.gif differ
diff --git a/media/tiny_mce/plugins/media/images/media.gif b/media/tiny_mce/plugins/media/images/media.gif
new file mode 100755 (executable)
index 0000000..856df52
Binary files /dev/null and b/media/tiny_mce/plugins/media/images/media.gif differ
diff --git a/media/tiny_mce/plugins/media/images/quicktime.gif b/media/tiny_mce/plugins/media/images/quicktime.gif
new file mode 100755 (executable)
index 0000000..3b04991
Binary files /dev/null and b/media/tiny_mce/plugins/media/images/quicktime.gif differ
diff --git a/media/tiny_mce/plugins/media/images/realmedia.gif b/media/tiny_mce/plugins/media/images/realmedia.gif
new file mode 100755 (executable)
index 0000000..fdfe0b9
Binary files /dev/null and b/media/tiny_mce/plugins/media/images/realmedia.gif differ
diff --git a/media/tiny_mce/plugins/media/images/shockwave.gif b/media/tiny_mce/plugins/media/images/shockwave.gif
new file mode 100755 (executable)
index 0000000..5f235df
Binary files /dev/null and b/media/tiny_mce/plugins/media/images/shockwave.gif differ
diff --git a/media/tiny_mce/plugins/media/images/windowsmedia.gif b/media/tiny_mce/plugins/media/images/windowsmedia.gif
new file mode 100755 (executable)
index 0000000..ab50f2d
Binary files /dev/null and b/media/tiny_mce/plugins/media/images/windowsmedia.gif differ
diff --git a/media/tiny_mce/plugins/media/jscripts/embed.js b/media/tiny_mce/plugins/media/jscripts/embed.js
new file mode 100755 (executable)
index 0000000..f8dc810
--- /dev/null
@@ -0,0 +1,73 @@
+/**\r
+ * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.\r
+ */\r
+\r
+function writeFlash(p) {\r
+       writeEmbed(\r
+               'D27CDB6E-AE6D-11cf-96B8-444553540000',\r
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
+               'application/x-shockwave-flash',\r
+               p\r
+       );\r
+}\r
+\r
+function writeShockWave(p) {\r
+       writeEmbed(\r
+       '166B1BCA-3F9C-11CF-8075-444553540000',\r
+       'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',\r
+       'application/x-director',\r
+               p\r
+       );\r
+}\r
+\r
+function writeQuickTime(p) {\r
+       writeEmbed(\r
+               '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',\r
+               'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',\r
+               'video/quicktime',\r
+               p\r
+       );\r
+}\r
+\r
+function writeRealMedia(p) {\r
+       writeEmbed(\r
+               'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',\r
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
+               'audio/x-pn-realaudio-plugin',\r
+               p\r
+       );\r
+}\r
+\r
+function writeWindowsMedia(p) {\r
+       p.url = p.src;\r
+       writeEmbed(\r
+               '6BF52A52-394A-11D3-B153-00C04F79FAA6',\r
+               'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',\r
+               'application/x-mplayer2',\r
+               p\r
+       );\r
+}\r
+\r
+function writeEmbed(cls, cb, mt, p) {\r
+       var h = '', n;\r
+\r
+       h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';\r
+       h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';\r
+       h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';\r
+       h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';\r
+       h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';\r
+       h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';\r
+       h += '>';\r
+\r
+       for (n in p)\r
+               h += '<param name="' + n + '" value="' + p[n] + '">';\r
+\r
+       h += '<embed type="' + mt + '"';\r
+\r
+       for (n in p)\r
+               h += n + '="' + p[n] + '" ';\r
+\r
+       h += '></embed></object>';\r
+\r
+       document.write(h);\r
+}\r
diff --git a/media/tiny_mce/plugins/media/jscripts/media.js b/media/tiny_mce/plugins/media/jscripts/media.js
new file mode 100755 (executable)
index 0000000..691a8bd
--- /dev/null
@@ -0,0 +1,590 @@
+var oldWidth, oldHeight;\r
+var url = tinyMCE.getParam("media_external_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function init() {\r
+       var pl = "", f, val;\r
+       var type = "flash", fe, i;\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       f = document.forms[0]\r
+\r
+       fe = tinyMCE.selectedInstance.getFocusElement();\r
+       if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {\r
+               pl = "x={" + fe.title + "};";\r
+\r
+               switch (tinyMCE.getAttrib(fe, 'class')) {\r
+                       case 'mceItemFlash':\r
+                               type = 'flash';\r
+                               break;\r
+\r
+                       case 'mceItemShockWave':\r
+                               type = 'shockwave';\r
+                               break;\r
+\r
+                       case 'mceItemWindowsMedia':\r
+                               type = 'wmp';\r
+                               break;\r
+\r
+                       case 'mceItemQuickTime':\r
+                               type = 'qt';\r
+                               break;\r
+\r
+                       case 'mceItemRealMedia':\r
+                               type = 'rmp';\r
+                               break;\r
+               }\r
+\r
+               document.forms[0].insert.value = tinyMCE.getLang('lang_update', 'Insert', true); \r
+       }\r
+\r
+       document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');\r
+       document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+\r
+       var html = getMediaListHTML('filebrowser','src','media','media');\r
+       if (html == "")\r
+               document.getElementById("linklistrow").style.display = 'none';\r
+       else\r
+               document.getElementById("linklistcontainer").innerHTML = html;\r
+\r
+       // Resize some elements\r
+       if (isVisible('filebrowsercontainer'))\r
+               document.getElementById('src').style.width = '230px';\r
+\r
+       // Setup form\r
+       if (pl != "") {\r
+               pl = eval(pl);\r
+\r
+               switch (type) {\r
+                       case "flash":\r
+                               setBool(pl, 'flash', 'play');\r
+                               setBool(pl, 'flash', 'loop');\r
+                               setBool(pl, 'flash', 'menu');\r
+                               setBool(pl, 'flash', 'swliveconnect');\r
+                               setStr(pl, 'flash', 'quality');\r
+                               setStr(pl, 'flash', 'scale');\r
+                               setStr(pl, 'flash', 'salign');\r
+                               setStr(pl, 'flash', 'wmode');\r
+                               setStr(pl, 'flash', 'base');\r
+                               setStr(pl, 'flash', 'flashvars');\r
+                       break;\r
+\r
+                       case "qt":\r
+                               setBool(pl, 'qt', 'loop');\r
+                               setBool(pl, 'qt', 'autoplay');\r
+                               setBool(pl, 'qt', 'cache');\r
+                               setBool(pl, 'qt', 'controller');\r
+                               setBool(pl, 'qt', 'correction');\r
+                               setBool(pl, 'qt', 'enablejavascript');\r
+                               setBool(pl, 'qt', 'kioskmode');\r
+                               setBool(pl, 'qt', 'autohref');\r
+                               setBool(pl, 'qt', 'playeveryframe');\r
+                               setBool(pl, 'qt', 'tarsetcache');\r
+                               setStr(pl, 'qt', 'scale');\r
+                               setStr(pl, 'qt', 'starttime');\r
+                               setStr(pl, 'qt', 'endtime');\r
+                               setStr(pl, 'qt', 'tarset');\r
+                               setStr(pl, 'qt', 'qtsrcchokespeed');\r
+                               setStr(pl, 'qt', 'volume');\r
+                               setStr(pl, 'qt', 'qtsrc');\r
+                       break;\r
+\r
+                       case "shockwave":\r
+                               setBool(pl, 'shockwave', 'sound');\r
+                               setBool(pl, 'shockwave', 'progress');\r
+                               setBool(pl, 'shockwave', 'autostart');\r
+                               setBool(pl, 'shockwave', 'swliveconnect');\r
+                               setStr(pl, 'shockwave', 'swvolume');\r
+                               setStr(pl, 'shockwave', 'swstretchstyle');\r
+                               setStr(pl, 'shockwave', 'swstretchhalign');\r
+                               setStr(pl, 'shockwave', 'swstretchvalign');\r
+                       break;\r
+\r
+                       case "wmp":\r
+                               setBool(pl, 'wmp', 'autostart');\r
+                               setBool(pl, 'wmp', 'enabled');\r
+                               setBool(pl, 'wmp', 'enablecontextmenu');\r
+                               setBool(pl, 'wmp', 'fullscreen');\r
+                               setBool(pl, 'wmp', 'invokeurls');\r
+                               setBool(pl, 'wmp', 'mute');\r
+                               setBool(pl, 'wmp', 'stretchtofit');\r
+                               setBool(pl, 'wmp', 'windowlessvideo');\r
+                               setStr(pl, 'wmp', 'balance');\r
+                               setStr(pl, 'wmp', 'baseurl');\r
+                               setStr(pl, 'wmp', 'captioningid');\r
+                               setStr(pl, 'wmp', 'currentmarker');\r
+                               setStr(pl, 'wmp', 'currentposition');\r
+                               setStr(pl, 'wmp', 'defaultframe');\r
+                               setStr(pl, 'wmp', 'playcount');\r
+                               setStr(pl, 'wmp', 'rate');\r
+                               setStr(pl, 'wmp', 'uimode');\r
+                               setStr(pl, 'wmp', 'volume');\r
+                       break;\r
+\r
+                       case "rmp":\r
+                               setBool(pl, 'rmp', 'autostart');\r
+                               setBool(pl, 'rmp', 'loop');\r
+                               setBool(pl, 'rmp', 'autogotourl');\r
+                               setBool(pl, 'rmp', 'center');\r
+                               setBool(pl, 'rmp', 'imagestatus');\r
+                               setBool(pl, 'rmp', 'maintainaspect');\r
+                               setBool(pl, 'rmp', 'nojava');\r
+                               setBool(pl, 'rmp', 'prefetch');\r
+                               setBool(pl, 'rmp', 'shuffle');\r
+                               setStr(pl, 'rmp', 'console');\r
+                               setStr(pl, 'rmp', 'controls');\r
+                               setStr(pl, 'rmp', 'numloop');\r
+                               setStr(pl, 'rmp', 'scriptcallbacks');\r
+                       break;\r
+               }\r
+\r
+               setStr(pl, null, 'src');\r
+               setStr(pl, null, 'id');\r
+               setStr(pl, null, 'name');\r
+               setStr(pl, null, 'vspace');\r
+               setStr(pl, null, 'hspace');\r
+               setStr(pl, null, 'bgcolor');\r
+               setStr(pl, null, 'align');\r
+               setStr(pl, null, 'width');\r
+               setStr(pl, null, 'height');\r
+\r
+               if ((val = tinyMCE.getAttrib(fe, "width")) != "")\r
+                       pl.width = f.width.value = val;\r
+\r
+               if ((val = tinyMCE.getAttrib(fe, "height")) != "")\r
+                       pl.height = f.height.value = val;\r
+\r
+               oldWidth = pl.width ? parseInt(pl.width) : 0;\r
+               oldHeight = pl.height ? parseInt(pl.height) : 0;\r
+       } else\r
+               oldWidth = oldHeight = 0;\r
+\r
+       selectByValue(f, 'media_type', type);\r
+       changedType(type);\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+\r
+       TinyMCE_EditableSelects.init();\r
+       generatePreview();\r
+}\r
+\r
+function insertMedia() {\r
+       var fe, f = document.forms[0], h;\r
+\r
+       if (!AutoValidator.validate(f)) {\r
+               alert(tinyMCE.getLang('lang_invalid_data'));\r
+               return false;\r
+       }\r
+\r
+       f.width.value = f.width.value == "" ? 100 : f.width.value;\r
+       f.height.value = f.height.value == "" ? 100 : f.height.value;\r
+\r
+       fe = tinyMCE.selectedInstance.getFocusElement();\r
+       if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(tinyMCE.getAttrib(fe, 'class'))) {\r
+               switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
+                       case "flash":\r
+                               fe.className = "mceItemFlash";\r
+                               break;\r
+\r
+                       case "shockwave":\r
+                               fe.className = "mceItemShockWave";\r
+                               break;\r
+\r
+                       case "qt":\r
+                               fe.className = "mceItemQuickTime";\r
+                               break;\r
+\r
+                       case "wmp":\r
+                               fe.className = "mceItemWindowsMedia";\r
+                               break;\r
+\r
+                       case "rmp":\r
+                               fe.className = "mceItemRealMedia";\r
+                               break;\r
+               }\r
+\r
+               if (fe.width != f.width.value || fe.height != f.height.height)\r
+                       tinyMCE.selectedInstance.repaint();\r
+\r
+               fe.title = serializeParameters();\r
+               fe.width = f.width.value;\r
+               fe.height = f.height.value;\r
+               fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : '');\r
+               fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : '');\r
+               fe.align = f.align.options[f.align.selectedIndex].value;\r
+       } else {\r
+               h = '<img src="' + tinyMCE.getParam("theme_href") + '/images/spacer.gif"' ;\r
+\r
+               switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
+                       case "flash":\r
+                               h += ' class="mceItemFlash"';\r
+                               break;\r
+\r
+                       case "shockwave":\r
+                               h += ' class="mceItemShockWave"';\r
+                               break;\r
+\r
+                       case "qt":\r
+                               h += ' class="mceItemQuickTime"';\r
+                               break;\r
+\r
+                       case "wmp":\r
+                               h += ' class="mceItemWindowsMedia"';\r
+                               break;\r
+\r
+                       case "rmp":\r
+                               h += ' class="mceItemRealMedia"';\r
+                               break;\r
+               }\r
+\r
+               h += ' title="' + serializeParameters() + '"';\r
+               h += ' width="' + f.width.value + '"';\r
+               h += ' height="' + f.height.value + '"';\r
+               h += ' align="' + f.align.options[f.align.selectedIndex].value + '"';\r
+\r
+               h += ' />';\r
+\r
+               tinyMCE.selectedInstance.execCommand('mceInsertContent', false, h);\r
+       }\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function getMediaListHTML() {\r
+       if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {\r
+               var html = "";\r
+\r
+               html += '<select id="linklist" name="linklist" style="width: 250px" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.src.value=this.options[this.selectedIndex].value;">';\r
+               html += '<option value="">---</option>';\r
+\r
+               for (var i=0; i<tinyMCEMediaList.length; i++)\r
+                       html += '<option value="' + tinyMCEMediaList[i][1] + '">' + tinyMCEMediaList[i][0] + '</option>';\r
+\r
+               html += '</select>';\r
+\r
+               return html;\r
+       }\r
+\r
+       return "";\r
+}\r
+\r
+function getType(v) {\r
+       var fo, i, c, el, x, f = document.forms[0];\r
+\r
+       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(';');\r
+\r
+       // YouTube\r
+       if (v.indexOf('http://www.youtube.com/watch?v=') == 0) {\r
+               f.width.value = '425';\r
+               f.height.value = '350';\r
+               f.src.value = 'http://www.youtube.com/v/' + v.substring('http://www.youtube.com/watch?v='.length);\r
+               return 'flash';\r
+       }\r
+\r
+       // Google video\r
+       if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) {\r
+               f.width.value = '425';\r
+               f.height.value = '326';\r
+               f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en';\r
+               return 'flash';\r
+       }\r
+\r
+       for (i=0; i<fo.length; i++) {\r
+               c = fo[i].split('=');\r
+\r
+               el = c[1].split(',');\r
+               for (x=0; x<el.length; x++)\r
+               if (v.indexOf('.' + el[x]) != -1)\r
+                       return c[0];\r
+       }\r
+\r
+       return null;\r
+}\r
+\r
+function switchType(v) {\r
+       var t = getType(v), d = document, f = d.forms[0];\r
+\r
+       if (!t)\r
+               return;\r
+\r
+       selectByValue(d.forms[0], 'media_type', t);\r
+       changedType(t);\r
+\r
+       // Update qtsrc also\r
+       if (t == 'qt' && f.src.value.toLowerCase().indexOf('rtsp://') != -1) {\r
+               alert(tinyMCE.getLang("lang_media_qt_stream_warn"));\r
+\r
+               if (f.qt_qtsrc.value == '')\r
+                       f.qt_qtsrc.value = f.src.value;\r
+       }\r
+}\r
+\r
+function changedType(t) {\r
+       var d = document;\r
+\r
+       d.getElementById('flash_options').style.display = 'none';\r
+       d.getElementById('qt_options').style.display = 'none';\r
+       d.getElementById('shockwave_options').style.display = 'none';\r
+       d.getElementById('wmp_options').style.display = 'none';\r
+       d.getElementById('rmp_options').style.display = 'none';\r
+       d.getElementById(t + '_options').style.display = 'block';\r
+}\r
+\r
+function serializeParameters() {\r
+       var d = document, f = d.forms[0], s = '';\r
+\r
+       switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
+               case "flash":\r
+                       s += getBool('flash', 'play', true);\r
+                       s += getBool('flash', 'loop', true);\r
+                       s += getBool('flash', 'menu', true);\r
+                       s += getBool('flash', 'swliveconnect', false);\r
+                       s += getStr('flash', 'quality');\r
+                       s += getStr('flash', 'scale');\r
+                       s += getStr('flash', 'salign');\r
+                       s += getStr('flash', 'wmode');\r
+                       s += getStr('flash', 'base');\r
+                       s += getStr('flash', 'flashvars');\r
+               break;\r
+\r
+               case "qt":\r
+                       s += getBool('qt', 'loop', false);\r
+                       s += getBool('qt', 'autoplay', true);\r
+                       s += getBool('qt', 'cache', false);\r
+                       s += getBool('qt', 'controller', true);\r
+                       s += getBool('qt', 'correction', false, 'none', 'full');\r
+                       s += getBool('qt', 'enablejavascript', false);\r
+                       s += getBool('qt', 'kioskmode', false);\r
+                       s += getBool('qt', 'autohref', false);\r
+                       s += getBool('qt', 'playeveryframe', false);\r
+                       s += getBool('qt', 'targetcache', false);\r
+                       s += getStr('qt', 'scale');\r
+                       s += getStr('qt', 'starttime');\r
+                       s += getStr('qt', 'endtime');\r
+                       s += getStr('qt', 'target');\r
+                       s += getStr('qt', 'qtsrcchokespeed');\r
+                       s += getStr('qt', 'volume');\r
+                       s += getStr('qt', 'qtsrc');\r
+               break;\r
+\r
+               case "shockwave":\r
+                       s += getBool('shockwave', 'sound');\r
+                       s += getBool('shockwave', 'progress');\r
+                       s += getBool('shockwave', 'autostart');\r
+                       s += getBool('shockwave', 'swliveconnect');\r
+                       s += getStr('shockwave', 'swvolume');\r
+                       s += getStr('shockwave', 'swstretchstyle');\r
+                       s += getStr('shockwave', 'swstretchhalign');\r
+                       s += getStr('shockwave', 'swstretchvalign');\r
+               break;\r
+\r
+               case "wmp":\r
+                       s += getBool('wmp', 'autostart', true);\r
+                       s += getBool('wmp', 'enabled', false);\r
+                       s += getBool('wmp', 'enablecontextmenu', true);\r
+                       s += getBool('wmp', 'fullscreen', false);\r
+                       s += getBool('wmp', 'invokeurls', true);\r
+                       s += getBool('wmp', 'mute', false);\r
+                       s += getBool('wmp', 'stretchtofit', false);\r
+                       s += getBool('wmp', 'windowlessvideo', false);\r
+                       s += getStr('wmp', 'balance');\r
+                       s += getStr('wmp', 'baseurl');\r
+                       s += getStr('wmp', 'captioningid');\r
+                       s += getStr('wmp', 'currentmarker');\r
+                       s += getStr('wmp', 'currentposition');\r
+                       s += getStr('wmp', 'defaultframe');\r
+                       s += getStr('wmp', 'playcount');\r
+                       s += getStr('wmp', 'rate');\r
+                       s += getStr('wmp', 'uimode');\r
+                       s += getStr('wmp', 'volume');\r
+               break;\r
+\r
+               case "rmp":\r
+                       s += getBool('rmp', 'autostart', false);\r
+                       s += getBool('rmp', 'loop', false);\r
+                       s += getBool('rmp', 'autogotourl', true);\r
+                       s += getBool('rmp', 'center', false);\r
+                       s += getBool('rmp', 'imagestatus', true);\r
+                       s += getBool('rmp', 'maintainaspect', false);\r
+                       s += getBool('rmp', 'nojava', false);\r
+                       s += getBool('rmp', 'prefetch', false);\r
+                       s += getBool('rmp', 'shuffle', false);\r
+                       s += getStr('rmp', 'console');\r
+                       s += getStr('rmp', 'controls');\r
+                       s += getStr('rmp', 'numloop');\r
+                       s += getStr('rmp', 'scriptcallbacks');\r
+               break;\r
+       }\r
+\r
+       s += getStr(null, 'id');\r
+       s += getStr(null, 'name');\r
+       s += getStr(null, 'src');\r
+       s += getStr(null, 'align');\r
+       s += getStr(null, 'bgcolor');\r
+       s += getInt(null, 'vspace');\r
+       s += getInt(null, 'hspace');\r
+       s += getStr(null, 'width');\r
+       s += getStr(null, 'height');\r
+\r
+       s = s.length > 0 ? s.substring(0, s.length - 1) : s;\r
+\r
+       return s;\r
+}\r
+\r
+function setBool(pl, p, n) {\r
+       if (typeof(pl[n]) == "undefined")\r
+               return;\r
+\r
+       document.forms[0].elements[p + "_" + n].checked = pl[n];\r
+}\r
+\r
+function setStr(pl, p, n) {\r
+       var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n];\r
+\r
+       if (typeof(pl[n]) == "undefined")\r
+               return;\r
+\r
+       if (e.type == "text")\r
+               e.value = pl[n];\r
+       else\r
+               selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]);\r
+}\r
+\r
+function getBool(p, n, d, tv, fv) {\r
+       var v = document.forms[0].elements[p + "_" + n].checked;\r
+\r
+       tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'";\r
+       fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'";\r
+\r
+       return (v == d) ? '' : n + (v ? ':' + tv + ',' : ':' + fv + ',');\r
+}\r
+\r
+function getStr(p, n, d) {\r
+       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];\r
+       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;\r
+\r
+       return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',");\r
+}\r
+\r
+function getInt(p, n, d) {\r
+       var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];\r
+       var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;\r
+\r
+       return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ",");\r
+}\r
+\r
+function jsEncode(s) {\r
+       s = s.replace(new RegExp('\\\\', 'g'), '\\\\');\r
+       s = s.replace(new RegExp('"', 'g'), '\\"');\r
+       s = s.replace(new RegExp("'", 'g'), "\\'");\r
+\r
+       return s;\r
+}\r
+\r
+function generatePreview(c) {\r
+       var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh;\r
+\r
+       p.innerHTML = '<!-- x --->';\r
+\r
+       nw = parseInt(f.width.value);\r
+       nh = parseInt(f.height.value);\r
+\r
+       if (f.width.value != "" && f.height.value != "") {\r
+               if (f.constrain.checked) {\r
+                       if (c == 'width' && oldWidth != 0) {\r
+                               wp = nw / oldWidth;\r
+                               nh = Math.round(wp * nh);\r
+                               f.height.value = nh;\r
+                       } else if (c == 'height' && oldHeight != 0) {\r
+                               hp = nh / oldHeight;\r
+                               nw = Math.round(hp * nw);\r
+                               f.width.value = nw;\r
+                       }\r
+               }\r
+       }\r
+\r
+       if (f.width.value != "")\r
+               oldWidth = nw;\r
+\r
+       if (f.height.value != "")\r
+               oldHeight = nh;\r
+\r
+       // After constrain\r
+       pl = serializeParameters();\r
+\r
+       switch (f.media_type.options[f.media_type.selectedIndex].value) {\r
+               case "flash":\r
+                       cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';\r
+                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';\r
+                       type = 'application/x-shockwave-flash';\r
+                       break;\r
+\r
+               case "shockwave":\r
+                       cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000';\r
+                       codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';\r
+                       type = 'application/x-director';\r
+                       break;\r
+\r
+               case "qt":\r
+                       cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';\r
+                       codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';\r
+                       type = 'video/quicktime';\r
+                       break;\r
+\r
+               case "wmp":\r
+                       cls = tinyMCE.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6';\r
+                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
+                       type = 'application/x-mplayer2';\r
+                       break;\r
+\r
+               case "rmp":\r
+                       cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';\r
+                       codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';\r
+                       type = 'audio/x-pn-realaudio-plugin';\r
+                       break;\r
+       }\r
+\r
+       if (pl == '') {\r
+               p.innerHTML = '';\r
+               return;\r
+       }\r
+\r
+       pl = eval('x={' + pl + '};');\r
+\r
+       if (!pl.src) {\r
+               p.innerHTML = '';\r
+               return;\r
+       }\r
+\r
+       pl.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], pl.src);\r
+       pl.width = !pl.width ? 100 : pl.width;\r
+       pl.height = !pl.height ? 100 : pl.height;\r
+       pl.id = !pl.id ? 'obj' : pl.id;\r
+       pl.name = !pl.name ? 'eobj' : pl.name;\r
+       pl.align = !pl.align ? '' : pl.align;\r
+\r
+       h += '<object classid="clsid:' + cls + '" codebase="' + codebase + '" width="' + pl.width + '" height="' + pl.height + '" id="' + pl.id + '" name="' + pl.name + '" align="' + pl.align + '">';\r
+\r
+       for (n in pl) {\r
+               h += '<param name="' + n + '" value="' + pl[n] + '">';\r
+\r
+               // Add extra url parameter if it's an absolute URL\r
+               if (n == 'src' && pl[n].indexOf('://') != -1)\r
+                       h += '<param name="url" value="' + pl[n] + '" />';\r
+       }\r
+\r
+       h += '<embed type="' + type + '" ';\r
+\r
+       for (n in pl)\r
+               h += n + '="' + pl[n] + '" ';\r
+\r
+       h += '></embed></object>';\r
+\r
+       p.innerHTML = "<!-- x --->" + h;\r
+}\r
diff --git a/media/tiny_mce/plugins/media/langs/en.js b/media/tiny_mce/plugins/media/langs/en.js
new file mode 100755 (executable)
index 0000000..ced1967
--- /dev/null
@@ -0,0 +1,94 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('media',{\r
+title : 'Insert / edit embedded media',\r
+desc : 'Insert / edit embedded media',\r
+general : 'General',\r
+advanced : 'Advanced',\r
+file : 'File/URL',\r
+list : 'List',\r
+size : 'Dimensions',\r
+preview : 'Preview',\r
+constrain_proportions : 'Constrain proportions',\r
+type : 'Type',\r
+id : 'Id',\r
+name : 'Name',\r
+class_name : 'Class',\r
+vspace : 'V-Space',\r
+hspace : 'H-Space',\r
+play : 'Auto play',\r
+loop : 'Loop',\r
+menu : 'Show menu',\r
+quality : 'Quality',\r
+scale : 'Scale',\r
+align : 'Align',\r
+salign : 'SAlign',\r
+wmode : 'WMode',\r
+bgcolor : 'Background',\r
+base : 'Base',\r
+flashvars : 'Flashvars',\r
+liveconnect : 'SWLiveConnect',\r
+autohref : 'AutoHREF',\r
+cache : 'Cache',\r
+hidden : 'Hidden',\r
+controller : 'Controller',\r
+kioskmode : 'Kiosk mode',\r
+playeveryframe : 'Play every frame',\r
+targetcache : 'Target cache',\r
+correction : 'No correction',\r
+enablejavascript : 'Enable JavaScript',\r
+starttime : 'Start time',\r
+endtime : 'End time',\r
+href : 'Href',\r
+qtsrcchokespeed : 'Choke speed',\r
+target : 'Target',\r
+volume : 'Volume',\r
+autostart : 'Auto start',\r
+enabled : 'Enabled',\r
+fullscreen : 'Fullscreen',\r
+invokeurls : 'Invoke URLs',\r
+mute : 'Mute',\r
+stretchtofit : 'Stretch to fit',\r
+windowlessvideo : 'Windowless video',\r
+balance : 'Balance',\r
+baseurl : 'Base URL',\r
+captioningid : 'Captioning id',\r
+currentmarker : 'Current marker',\r
+currentposition : 'Current position',\r
+defaultframe : 'Default frame',\r
+playcount : 'Play count',\r
+rate : 'Rate',\r
+uimode : 'UI Mode',\r
+flash_options : 'Flash options',\r
+qt_options : 'Quicktime options',\r
+wmp_options : 'Windows media player options',\r
+rmp_options : 'Real media player options',\r
+shockwave_options : 'Shockwave options',\r
+autogotourl : 'Auto goto URL',\r
+center : 'Center',\r
+imagestatus : 'Image status',\r
+maintainaspect : 'Maintain aspect',\r
+nojava : 'No java',\r
+prefetch : 'Prefetch',\r
+shuffle : 'Shuffle',\r
+console : 'Console',\r
+numloop : 'Num loops',\r
+controls : 'Controls',\r
+scriptcallbacks : 'Script callbacks',\r
+swstretchstyle : 'Stretch style',\r
+swstretchhalign : 'Stretch H-Align',\r
+swstretchvalign : 'Stretch V-Align',\r
+sound : 'Sound',\r
+progress : 'Progress',\r
+qtsrc : 'QT Src',\r
+qt_stream_warn : 'Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..',\r
+align_top : 'Top',\r
+align_right : 'Right',\r
+align_bottom : 'Bottom',\r
+align_left : 'Left',\r
+align_center : 'Center',\r
+align_top_left : 'Top left',\r
+align_top_right : 'Top right',\r
+align_bottom_left : 'Bottom left',\r
+align_bottom_right : 'Bottom right'\r
+});
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/media/media.htm b/media/tiny_mce/plugins/media/media.htm
new file mode 100755 (executable)
index 0000000..97b7cdc
--- /dev/null
@@ -0,0 +1,723 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_media_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/media.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <link href="css/media.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+    <form onsubmit="insertMedia();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');generatePreview();" onmousedown="return false;">{$lang_media_general}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_media_advanced}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_media_general}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                                       <tr>\r
+                                                               <td><label for="media_type">{$lang_media_type}</label></td>\r
+                                                               <td>\r
+                                                                       <select id="media_type" name="media_type" onchange="changedType(this.value);generatePreview();">\r
+                                                                               <option value="flash">Flash</option>\r
+                                                                               <option value="qt">Quicktime</option>\r
+                                                                               <option value="shockwave">Shockware</option>\r
+                                                                               <option value="wmp">Windows Media</option>\r
+                                                                               <option value="rmp">Real Media</option>\r
+                                                                       </select>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                       <td><label for="src">{$lang_media_file}</label></td>\r
+                                                         <td>\r
+                                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                                         <tr>\r
+                                                                               <td><input id="src" name="src" type="text" value="" onchange="switchType(this.value);generatePreview();" /></td>\r
+                                                                               <td id="filebrowsercontainer">&nbsp;</td>\r
+                                                                         </tr>\r
+                                                                       </table>\r
+                                                               </td>\r
+                                                       </tr>\r
+                                                       <tr id="linklistrow">\r
+                                                               <td><label for="linklist">{$lang_media_list}</label></td>\r
+                                                               <td id="linklistcontainer">&nbsp;</td>\r
+                                                       </tr>\r
+                                                       <tr>\r
+                                                               <td><label for="width">{$lang_media_size}</label></td>\r
+                                                               <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="text" id="width" name="width" value="" class="size" onchange="generatePreview('width');" /> x <input type="text" id="height" name="height" value="" class="size"  onchange="generatePreview('height');" /></td>\r
+                                                                               <td>&nbsp;&nbsp;<input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td>\r
+                                                                               <td><label id="constrainlabel" for="constrain">{$lang_media_constrain_proportions}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset>\r
+                                       <legend>{$lang_media_preview}</legend>\r
+                                       <div id="prev"></div>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_media_advanced}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                               <tr>\r
+                                                       <td><label for="id">{$lang_media_id}</label></td>\r
+                                                       <td><input type="text" id="id" name="id" onchange="generatePreview();" /></td>\r
+                                                       <td><label for="name">{$lang_media_name}</label></td>\r
+                                                       <td><input type="text" id="name" name="name" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="align">{$lang_media_align}</label></td>\r
+                                                       <td>\r
+                                                               <select id="align" name="align" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="top">{$lang_media_align_top}</option>\r
+                                                                       <option value="right">{$lang_media_align_right}</option>\r
+                                                                       <option value="bottom">{$lang_media_align_bottom}</option>\r
+                                                                       <option value="left">{$lang_media_align_left}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="bgcolor">{$lang_media_bgcolor}</label></td>\r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');generatePreview();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="vspace">{$lang_media_vspace}</label></td>\r
+                                                       <td><input type="text" id="vspace" name="vspace" class="number" onchange="generatePreview();" /></td>\r
+                                                       <td><label for="hspace">{$lang_media_hspace}</label></td>\r
+                                                       <td><input type="text" id="hspace" name="hspace" class="number" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="flash_options">\r
+                                       <legend>{$lang_media_flash_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="flash_quality">{$lang_media_quality}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_quality" name="flash_quality" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="high">high</option>\r
+                                                                       <option value="low">low</option>\r
+                                                                       <option value="autolow">autolow</option>\r
+                                                                       <option value="autohigh">autohigh</option>\r
+                                                                       <option value="best">best</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="flash_scale">{$lang_media_scale}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_scale" name="flash_scale" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="showall">showall</option>\r
+                                                                       <option value="noborder">noborder</option>\r
+                                                                       <option value="exactfit">exactfit</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="flash_wmode">{$lang_media_wmode}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_wmode" name="flash_wmode" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="window">window</option>\r
+                                                                       <option value="opaque">opaque</option>\r
+                                                                       <option value="transparent">transparent</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="flash_salign">{$lang_media_salign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="flash_salign" name="flash_salign" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="l">{$lang_media_align_left}</option>\r
+                                                                       <option value="t">{$lang_media_align_top}</option>\r
+                                                                       <option value="r">{$lang_media_align_right}</option>\r
+                                                                       <option value="b">{$lang_media_align_bottom}</option>\r
+                                                                       <option value="tl">{$lang_media_align_top_left}</option>\r
+                                                                       <option value="tr">{$lang_media_align_top_right}</option>\r
+                                                                       <option value="bl">{$lang_media_align_bottom_left}</option>\r
+                                                                       <option value="br">{$lang_media_align_bottom_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_play" name="flash_play" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flash_play">{$lang_media_play}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_loop" name="flash_loop" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flash_loop">{$lang_media_loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_menu" name="flash_menu" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flash_menu">{$lang_media_menu}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="flash_swliveconnect" name="flash_swliveconnect" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="flash_swliveconnect">{$lang_media_liveconnect}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+\r
+                                       <table>\r
+                                               <tr>\r
+                                                       <td><label for="flash_base">{$lang_media_base}</label></td>\r
+                                                       <td><input type="text" id="flash_base" name="flash_base" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="flash_flashvars">{$lang_media_flashvars}</label></td>\r
+                                                       <td><input type="text" id="flash_flashvars" name="flash_flashvars" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="qt_options">\r
+                                       <legend>{$lang_media_qt_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_loop" name="qt_loop" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_loop">{$lang_media_loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_autoplay" name="qt_autoplay" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_autoplay">{$lang_media_play}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_cache" name="qt_cache" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_cache">{$lang_media_cache}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_controller" name="qt_controller" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_controller">{$lang_media_controller}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_correction" name="qt_correction" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_correction">{$lang_media_correction}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_enablejavascript" name="qt_enablejavascript" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_enablejavascript">{$lang_media_enablejavascript}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_kioskmode" name="qt_kioskmode" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_kioskmode">{$lang_media_kioskmode}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_autohref" name="qt_autohref" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_autohref">{$lang_media_autohref}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_playeveryframe" name="qt_playeveryframe" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_playeveryframe">{$lang_media_playeveryframe}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="qt_targetcache" name="qt_targetcache" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="qt_targetcache">{$lang_media_targetcache}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_scale">{$lang_media_scale}</label></td>\r
+                                                       <td><select id="qt_scale" name="qt_scale" class="mceEditableSelect" onchange="generatePreview();">\r
+                                                                       <option value="">{$lang_not_set}</option> \r
+                                                                       <option value="tofit">tofit</option>\r
+                                                                       <option value="aspect">aspect</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">&nbsp;</td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_starttime">{$lang_media_starttime}</label></td>\r
+                                                       <td><input type="text" id="qt_starttime" name="qt_starttime" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="qt_endtime">{$lang_media_endtime}</label></td>\r
+                                                       <td><input type="text" id="qt_endtime" name="qt_endtime" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_target">{$lang_media_target}</label></td>\r
+                                                       <td><input type="text" id="qt_target" name="qt_target" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="qt_href">{$lang_media_href}</label></td>\r
+                                                       <td><input type="text" id="qt_href" name="qt_href" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_qtsrcchokespeed">{$lang_media_qtsrcchokespeed}</label></td>\r
+                                                       <td><input type="text" id="qt_qtsrcchokespeed" name="qt_qtsrcchokespeed" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="qt_volume">{$lang_media_volume}</label></td>\r
+                                                       <td><input type="text" id="qt_volume" name="qt_volume" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="qt_qtsrc">{$lang_media_qtsrc}</label></td>\r
+                                                       <td colspan="4">\r
+                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                                 <tr>\r
+                                                                       <td><input type="text" id="qt_qtsrc" name="qt_qtsrc" onchange="generatePreview();" /></td>\r
+                                                                       <td id="qtsrcfilebrowsercontainer">&nbsp;</td>\r
+                                                                 </tr>\r
+                                                       </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="wmp_options">\r
+                                       <legend>{$lang_media_wmp_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_autostart" name="wmp_autostart" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_autostart">{$lang_media_autostart}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_enabled" name="wmp_enabled" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_enabled">{$lang_media_enabled}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_enablecontextmenu" name="wmp_enablecontextmenu" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_enablecontextmenu">{$lang_media_menu}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_fullscreen" name="wmp_fullscreen" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_fullscreen">{$lang_media_fullscreen}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_invokeurls" name="wmp_invokeurls" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_invokeurls">{$lang_media_invokeurls}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_mute" name="wmp_mute" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_mute">{$lang_media_mute}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_stretchtofit" name="wmp_stretchtofit" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_stretchtofit">{$lang_media_stretchtofit}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="wmp_windowlessvideo" name="wmp_windowlessvideo" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="wmp_windowlessvideo">{$lang_media_windowlessvideo}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_balance">{$lang_media_balance}</label></td>\r
+                                                       <td><input type="text" id="wmp_balance" name="wmp_balance" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_baseurl">{$lang_media_baseurl}</label></td>\r
+                                                       <td><input type="text" id="wmp_baseurl" name="wmp_baseurl" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_captioningid">{$lang_media_captioningid}</label></td>\r
+                                                       <td><input type="text" id="wmp_captioningid" name="wmp_captioningid" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_currentmarker">{$lang_media_currentmarker}</label></td>\r
+                                                       <td><input type="text" id="wmp_currentmarker" name="wmp_currentmarker" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_currentposition">{$lang_media_currentposition}</label></td>\r
+                                                       <td><input type="text" id="wmp_currentposition" name="wmp_currentposition" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_defaultframe">{$lang_media_defaultframe}</label></td>\r
+                                                       <td><input type="text" id="wmp_defaultframe" name="wmp_defaultframe" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_playcount">{$lang_media_playcount}</label></td>\r
+                                                       <td><input type="text" id="wmp_playcount" name="wmp_playcount" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_rate">{$lang_media_rate}</label></td>\r
+                                                       <td><input type="text" id="wmp_rate" name="wmp_rate" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="wmp_uimode">{$lang_media_uimode}</label></td>\r
+                                                       <td><input type="text" id="wmp_uimode" name="wmp_uimode" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="wmp_volume">{$lang_media_volume}</label></td>\r
+                                                       <td><input type="text" id="wmp_volume" name="wmp_volume" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="rmp_options">\r
+                                       <legend>{$lang_media_rmp_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_autostart" name="rmp_autostart" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_autostart">{$lang_media_autostart}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_loop" name="rmp_loop" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_loop">{$lang_media_loop}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_autogotourl" name="rmp_autogotourl" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_autogotourl">{$lang_media_autogotourl}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_center" name="rmp_center" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_center">{$lang_media_center}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_imagestatus" name="rmp_imagestatus" checked="checked" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_imagestatus">{$lang_media_imagestatus}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_maintainaspect" name="rmp_maintainaspect" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_maintainaspect">{$lang_media_maintainaspect}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_nojava" name="rmp_nojava" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_nojava">{$lang_media_nojava}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_prefetch" name="rmp_prefetch" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_prefetch">{$lang_media_prefetch}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="rmp_shuffle" name="rmp_shuffle" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="rmp_shuffle">{$lang_media_shuffle}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               &nbsp;\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="rmp_console">{$lang_media_console}</label></td>\r
+                                                       <td><input type="text" id="rmp_console" name="rmp_console" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="rmp_controls">{$lang_media_controls}</label></td>\r
+                                                       <td><input type="text" id="rmp_controls" name="rmp_controls" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="rmp_numloop">{$lang_media_numloop}</label></td>\r
+                                                       <td><input type="text" id="rmp_numloop" name="rmp_numloop" onchange="generatePreview();" /></td>\r
+\r
+                                                       <td><label for="rmp_scriptcallbacks">{$lang_media_scriptcallbacks}</label></td>\r
+                                                       <td><input type="text" id="rmp_scriptcallbacks" name="rmp_scriptcallbacks" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+\r
+                               <fieldset id="shockwave_options">\r
+                                       <legend>{$lang_media_shockwave_options}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="shockwave_swstretchstyle">{$lang_media_swstretchstyle}</label></td>\r
+                                                       <td>\r
+                                                               <select id="shockwave_swstretchstyle" name="shockwave_swstretchstyle" onchange="generatePreview();">\r
+                                                                       <option value="none">{$lang_not_set}</option>\r
+                                                                       <option value="meet">Meet</option>\r
+                                                                       <option value="fill">Fill</option>\r
+                                                                       <option value="stage">Stage</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="shockwave_swvolume">{$lang_media_volume}</label></td>\r
+                                                       <td><input type="text" id="shockwave_swvolume" name="shockwave_swvolume" onchange="generatePreview();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="shockwave_swstretchhalign">{$lang_media_swstretchhalign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="shockwave_swstretchhalign" name="shockwave_swstretchhalign" onchange="generatePreview();">\r
+                                                                       <option value="none">{$lang_not_set}</option>\r
+                                                                       <option value="left">{$lang_media_align_left}</option>\r
+                                                                       <option value="center">{$lang_media_align_center}</option>\r
+                                                                       <option value="right">{$lang_media_align_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="shockwave_swstretchvalign">{$lang_media_swstretchvalign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="shockwave_swstretchvalign" name="shockwave_swstretchvalign" onchange="generatePreview();">\r
+                                                                       <option value="none">{$lang_not_set}</option>\r
+                                                                       <option value="meet">Meet</option>\r
+                                                                       <option value="fill">Fill</option>\r
+                                                                       <option value="stage">Stage</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_autostart" name="shockwave_autostart" onchange="generatePreview();" checked="checked" /></td>\r
+                                                                               <td><label for="shockwave_autostart">{$lang_media_autostart}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_sound" name="shockwave_sound" onchange="generatePreview();" checked="checked" /></td>\r
+                                                                               <td><label for="shockwave_sound">{$lang_media_sound}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+\r
+                                               <tr>\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_swliveconnect" name="shockwave_swliveconnect" onchange="generatePreview();" /></td>\r
+                                                                               <td><label for="shockwave_swliveconnect">{$lang_media_liveconnect}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+\r
+                                                       <td colspan="2">\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input type="checkbox" class="checkbox" id="shockwave_progress" name="shockwave_progress" onchange="generatePreview();" checked="checked" /></td>\r
+                                                                               <td><label for="shockwave_progress">{$lang_media_progress}</label></td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertMedia();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/nonbreaking/editor_plugin.js b/media/tiny_mce/plugins/nonbreaking/editor_plugin.js
new file mode 100755 (executable)
index 0000000..5b12797
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking',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)?'<span class="mceItemHiddenVisualChar">&middot;</span>':'&nbsp;';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)?'<span class="mceItemHiddenVisualChar">&middot;&middot;&middot;</span>':'&nbsp;&nbsp;&nbsp;';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/media/tiny_mce/plugins/nonbreaking/editor_plugin_src.js b/media/tiny_mce/plugins/nonbreaking/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..73d5478
--- /dev/null
@@ -0,0 +1,62 @@
+/**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('nonbreaking');\r
+\r
+var TinyMCE_NonBreakingPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Nonbreaking space',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "nonbreaking":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_nonbreaking_desc', '{$pluginurl}/images/nonbreaking.gif', 'mceNonBreaking', false);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), h;\r
+\r
+               switch (command) {\r
+                       case "mceNonBreaking":\r
+                               h = (inst.visualChars && inst.visualChars.state) ? '<span class="mceItemHiddenVisualChar">&middot;</span>' : '&nbsp;';\r
+                               tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, h);\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       handleEvent : function(e) {\r
+               var inst, h;\r
+\r
+               if (!tinyMCE.isOpera && e.type == 'keydown' && e.keyCode == 9 && tinyMCE.getParam('nonbreaking_force_tab', false)) {\r
+                       inst = tinyMCE.selectedInstance;\r
+\r
+                       h = (inst.visualChars && inst.visualChars.state) ? '<span class="mceItemHiddenVisualChar">&middot;&middot;&middot;</span>' : '&nbsp;&nbsp;&nbsp;';\r
+                       tinyMCE.execInstanceCommand(inst.editorId, 'mceInsertContent', false, h);\r
+\r
+                       tinyMCE.cancelEvent(e);\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("nonbreaking", TinyMCE_NonBreakingPlugin);\r
diff --git a/media/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif b/media/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif
new file mode 100755 (executable)
index 0000000..a731fc9
Binary files /dev/null and b/media/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif differ
diff --git a/media/tiny_mce/plugins/nonbreaking/langs/en.js b/media/tiny_mce/plugins/nonbreaking/langs/en.js
new file mode 100755 (executable)
index 0000000..fd49a64
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('nonbreaking',{\r
+desc : 'Insert non-breaking space character'\r
+});\r
diff --git a/media/tiny_mce/plugins/noneditable/css/noneditable.css b/media/tiny_mce/plugins/noneditable/css/noneditable.css
new file mode 100755 (executable)
index 0000000..be0ab65
--- /dev/null
@@ -0,0 +1,9 @@
+/* This is the CSS file for the noneditable elements plugin */\r
+\r
+.mceEditable {\r
+       /*border: 1px dotted #0000cc;*/\r
+}\r
+\r
+.mceNonEditable {\r
+       /*border: 1px dotted #cc0000;*/\r
+}\r
diff --git a/media/tiny_mce/plugins/noneditable/editor_plugin.js b/media/tiny_mce/plugins/noneditable/editor_plugin.js
new file mode 100755 (executable)
index 0000000..6060981
--- /dev/null
@@ -0,0 +1 @@
+var TinyMCE_NonEditablePlugin={getInfo:function(){return{longname:'Non editable elements',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/noneditable/css/noneditable.css");if(tinyMCE.isMSIE5_0)tinyMCE.settings['plugins']=tinyMCE.settings['plugins'].replace(/noneditable/gi,'Noneditable')},handleEvent:function(e){return this._moveSelection(e,tinyMCE.selectedInstance)},cleanup:function(type,content,inst){switch(type){case"insert_to_editor_dom":var nodes,i,editClass,nonEditClass,editable,elm;if(tinyMCE.isGecko)return content;nodes=tinyMCE.getNodeTree(content,[],1);editClass=tinyMCE.getParam("noneditable_editable_class","mceEditable");nonEditClass=tinyMCE.getParam("noneditable_noneditable_class","mceNonEditable");for(i=0;i<nodes.length;i++){elm=nodes[i];editable=tinyMCE.getAttrib(elm,"contenteditable");if(new RegExp("true|false","gi").test(editable))TinyMCE_NonEditablePlugin._setEditable(elm,editable=="true");if(tinyMCE.isIE){if(tinyMCE.hasCSSClass(elm,editClass))elm.contentEditable=true;if(tinyMCE.hasCSSClass(elm,nonEditClass))elm.contentEditable=false}}break;case"insert_to_editor":var editClass=tinyMCE.getParam("noneditable_editable_class","mceEditable");var nonEditClass=tinyMCE.getParam("noneditable_noneditable_class","mceNonEditable");content=content.replace(/mceItemEditable/g,editClass);content=content.replace(/mceItemNonEditable/g,nonEditClass);if(tinyMCE.isIE&&(content.indexOf(editClass)!=-1||content.indexOf(nonEditClass)!=-1)){content=content.replace(new RegExp("class=\"(.+)("+editClass+")\"","gi"),'class="$1$2" contenteditable="true"');content=content.replace(new RegExp("class=\"(.+)("+nonEditClass+")\"","gi"),'class="$1$2" contenteditable="false"');content=content.replace(new RegExp("class=\"("+editClass+")([^\"]*)\"","gi"),'class="$1$2" contenteditable="true"');content=content.replace(new RegExp("class=\"("+nonEditClass+")([^\"]*)\"","gi"),'class="$1$2" contenteditable="false"');content=content.replace(new RegExp("class=\"(.+)("+editClass+")([^\"]*)\"","gi"),'class="$1$2$3" contenteditable="true"');content=content.replace(new RegExp("class=\"(.+)("+nonEditClass+")([^\"]*)\"","gi"),'class="$1$2$3" contenteditable="false"')}break;case"get_from_editor_dom":if(tinyMCE.isGecko)return content;if(tinyMCE.getParam("noneditable_leave_contenteditable",false)){var nodes=tinyMCE.getNodeTree(content,new Array(),1);for(var i=0;i<nodes.length;i++)nodes[i].removeAttribute("contenteditable")}break}return content},_moveSelection:function(e,inst){var s,r,sc,ec,el,c=tinyMCE.getParam('noneditable_editable_class','mceNonEditable');if(!inst)return true;if(tinyMCE.isGecko){s=inst.selection.getSel();r=s.getRangeAt(0);sc=tinyMCE.getParentNode(r.startContainer,function(n){return tinyMCE.hasCSSClass(n,c)});ec=tinyMCE.getParentNode(r.endContainer,function(n){return tinyMCE.hasCSSClass(n,c)});sc&&r.setStartBefore(sc);ec&&r.setEndAfter(ec);if(sc||ec){if(e.type=='keypress'&&e.keyCode==39){el=sc||ec;}s.removeAllRanges();s.addRange(r);return tinyMCE.cancelEvent(e)}}return true},_setEditable:function(elm,state){var editClass=tinyMCE.getParam("noneditable_editable_class","mceEditable");var nonEditClass=tinyMCE.getParam("noneditable_noneditable_class","mceNonEditable");var className=elm.className?elm.className:"";if(className.indexOf(editClass)!=-1||className.indexOf(nonEditClass)!=-1)return;if((className=tinyMCE.getAttrib(elm,"class"))!="")className+=" ";className+=state?editClass:nonEditClass;elm.setAttribute("class",className);elm.className=className}};tinyMCE.addPlugin("noneditable",TinyMCE_NonEditablePlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/noneditable/editor_plugin_src.js b/media/tiny_mce/plugins/noneditable/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..df3000c
--- /dev/null
@@ -0,0 +1,153 @@
+/**\r
+ * $Id: editor_plugin_src.js 205 2007-02-12 18:58:29Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+var TinyMCE_NonEditablePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Non editable elements',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/noneditable/css/noneditable.css");\r
+\r
+               // Ugly hack\r
+               if (tinyMCE.isMSIE5_0)\r
+                       tinyMCE.settings['plugins'] = tinyMCE.settings['plugins'].replace(/noneditable/gi, 'Noneditable');\r
+       },\r
+\r
+       handleEvent : function(e) {\r
+               return this._moveSelection(e, tinyMCE.selectedInstance);\r
+       },\r
+\r
+       cleanup : function(type, content, inst) {\r
+               switch (type) {\r
+                       case "insert_to_editor_dom":\r
+                               var nodes, i, editClass, nonEditClass, editable, elm;\r
+\r
+                               // Pass through Gecko\r
+                               if (tinyMCE.isGecko)\r
+                                       return content;\r
+\r
+                               nodes = tinyMCE.getNodeTree(content, [], 1);\r
+\r
+                               editClass = tinyMCE.getParam("noneditable_editable_class", "mceEditable");\r
+                               nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceNonEditable");\r
+\r
+                               for (i=0; i<nodes.length; i++) {\r
+                                       elm = nodes[i];\r
+\r
+                                       // Convert contenteditable to classes\r
+                                       editable = tinyMCE.getAttrib(elm, "contenteditable");\r
+                                       if (new RegExp("true|false","gi").test(editable))\r
+                                               TinyMCE_NonEditablePlugin._setEditable(elm, editable == "true");\r
+\r
+                                       if (tinyMCE.isIE) {\r
+                                               if (tinyMCE.hasCSSClass(elm, editClass))\r
+                                                       elm.contentEditable = true;\r
+\r
+                                               if (tinyMCE.hasCSSClass(elm, nonEditClass))\r
+                                                       elm.contentEditable = false;\r
+                                       }\r
+                               }\r
+\r
+                               break;\r
+\r
+                       case "insert_to_editor":\r
+                               var editClass = tinyMCE.getParam("noneditable_editable_class", "mceEditable");\r
+                               var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceNonEditable");\r
+\r
+                               // Replace mceItem to new school\r
+                               content = content.replace(/mceItemEditable/g, editClass);\r
+                               content = content.replace(/mceItemNonEditable/g, nonEditClass);\r
+\r
+                               if (tinyMCE.isIE && (content.indexOf(editClass) != -1 || content.indexOf(nonEditClass) != -1)) {\r
+                                       content = content.replace(new RegExp("class=\"(.+)(" + editClass + ")\"", "gi"), 'class="$1$2" contenteditable="true"');\r
+                                       content = content.replace(new RegExp("class=\"(.+)(" + nonEditClass + ")\"", "gi"), 'class="$1$2" contenteditable="false"');\r
+                                       content = content.replace(new RegExp("class=\"(" + editClass + ")([^\"]*)\"", "gi"), 'class="$1$2" contenteditable="true"');\r
+                                       content = content.replace(new RegExp("class=\"(" + nonEditClass + ")([^\"]*)\"", "gi"), 'class="$1$2" contenteditable="false"');\r
+                                       content = content.replace(new RegExp("class=\"(.+)(" + editClass + ")([^\"]*)\"", "gi"), 'class="$1$2$3" contenteditable="true"');\r
+                                       content = content.replace(new RegExp("class=\"(.+)(" + nonEditClass + ")([^\"]*)\"", "gi"), 'class="$1$2$3" contenteditable="false"');\r
+                               }\r
+\r
+                               break;\r
+\r
+                       case "get_from_editor_dom":\r
+                               // Pass through Gecko\r
+                               if (tinyMCE.isGecko)\r
+                                       return content;\r
+\r
+                               if (tinyMCE.getParam("noneditable_leave_contenteditable", false)) {\r
+                                       var nodes = tinyMCE.getNodeTree(content, new Array(), 1);\r
+\r
+                                       for (var i=0; i<nodes.length; i++)\r
+                                               nodes[i].removeAttribute("contenteditable");\r
+                               }\r
+\r
+                               break;\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       _moveSelection : function(e, inst) {\r
+               var s, r, sc, ec, el, c = tinyMCE.getParam('noneditable_editable_class', 'mceNonEditable');\r
+\r
+               if (!inst)\r
+                       return true;\r
+\r
+               // Always select whole element\r
+               if (tinyMCE.isGecko) {\r
+                       s = inst.selection.getSel();\r
+                       r = s.getRangeAt(0);\r
+                       sc = tinyMCE.getParentNode(r.startContainer, function (n) {return tinyMCE.hasCSSClass(n, c);});\r
+                       ec = tinyMCE.getParentNode(r.endContainer, function (n) {return tinyMCE.hasCSSClass(n, c);});\r
+\r
+                       sc && r.setStartBefore(sc);\r
+                       ec && r.setEndAfter(ec);\r
+\r
+                       if (sc || ec) {\r
+                               if (e.type == 'keypress' && e.keyCode == 39) {\r
+                                       el = sc || ec;\r
+\r
+                                       // Try!!\r
+                               }\r
+\r
+                               s.removeAllRanges();\r
+                               s.addRange(r);\r
+\r
+                               return tinyMCE.cancelEvent(e);\r
+                       }\r
+               }\r
+\r
+               return true;\r
+       },\r
+\r
+       _setEditable : function(elm, state) {\r
+               var editClass = tinyMCE.getParam("noneditable_editable_class", "mceEditable");\r
+               var nonEditClass = tinyMCE.getParam("noneditable_noneditable_class", "mceNonEditable");\r
+\r
+               var className = elm.className ? elm.className : "";\r
+\r
+               if (className.indexOf(editClass) != -1 || className.indexOf(nonEditClass) != -1)\r
+                       return;\r
+\r
+               if ((className = tinyMCE.getAttrib(elm, "class")) != "")\r
+                       className += " ";\r
+\r
+               className += state ? editClass : nonEditClass;\r
+\r
+               elm.setAttribute("class", className);\r
+               elm.className = className;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("noneditable", TinyMCE_NonEditablePlugin);\r
diff --git a/media/tiny_mce/plugins/noneditable/readme.txt b/media/tiny_mce/plugins/noneditable/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/paste/blank.htm b/media/tiny_mce/plugins/paste/blank.htm
new file mode 100755 (executable)
index 0000000..1ddf829
--- /dev/null
@@ -0,0 +1,19 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>blank_page</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+       <script language="javascript">\r
+               function init() {\r
+                       document.body.contentEditable = true;\r
+                       document.designMode = 'on';\r
+                       parent.initIframe(document);\r
+                       window.focus();\r
+               }\r
+       </script>\r
+       <link href="css/blank.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="init();">\r
+\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/paste/css/blank.css b/media/tiny_mce/plugins/paste/css/blank.css
new file mode 100755 (executable)
index 0000000..eca411a
--- /dev/null
@@ -0,0 +1,13 @@
+body {\r
+       background-color: #FFFFFF;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+}\r
diff --git a/media/tiny_mce/plugins/paste/css/pasteword.css b/media/tiny_mce/plugins/paste/css/pasteword.css
new file mode 100755 (executable)
index 0000000..b3be627
--- /dev/null
@@ -0,0 +1,3 @@
+.sourceIframe {\r
+       border: 1px solid #808080;\r
+}\r
diff --git a/media/tiny_mce/plugins/paste/editor_plugin.js b/media/tiny_mce/plugins/paste/editor_plugin.js
new file mode 100755 (executable)
index 0000000..ed901bb
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',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)},handleEvent:function(e){if(!tinyMCE.isRealIE&&tinyMCE.getParam("paste_auto_cleanup_on_paste",false)&&e.ctrlKey&&e.keyCode==86&&e.type=="keydown"){window.setTimeout('tinyMCE.selectedInstance.execCommand("mcePasteText",true)',1);return tinyMCE.cancelEvent(e)}return true},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,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);content=tinyMCE.regexpReplace(content,"\r\n\r\n","</p><p>","gi");content=tinyMCE.regexpReplace(content,"\r\r","</p><p>","gi");content=tinyMCE.regexpReplace(content,"\n\n","</p><p>","gi");if((pos=content.indexOf('</p><p>'))!=-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="</p>";before+=content.substring(0,pos);for(var i=0;i<breakElms.length;i++){before+="</"+breakElms[i].nodeName+">";after+="<"+breakElms[(breakElms.length-1)-i].nodeName+">"}before+="<p>";content=before+content.substring(pos+7)+after}}if(tinyMCE.getParam("paste_create_linebreaks",true)){content=tinyMCE.regexpReplace(content,"\r\n","<br />","gi");content=tinyMCE.regexpReplace(content,"\r","<br />","gi");content=tinyMCE.regexpReplace(content,"\n","<br />","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,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);if(tinyMCE.getParam("paste_convert_headers_to_strong",false)){content=content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>','gi'),'<p><b>$1</b></p>')}content=content.replace(new RegExp('tab-stops: list [0-9]+.0pt">','gi'),'">'+"--list--");content=content.replace(new RegExp(bull+"(.*?)<BR>","gi"),"<p>"+middot+"$1</p>");content=content.replace(new RegExp('<SPAN style="mso-list: Ignore">','gi'),"<span>"+bull);content=content.replace(/<o:p><\/o:p>/gi,"");content=content.replace(new RegExp('<br style="page-break-before: always;.*>','gi'),'-- page break --');content=content.replace(new RegExp('<(!--)([^>]*)(--)>','g'),"");if(tinyMCE.getParam("paste_remove_spans",true))content=content.replace(/<\/?span[^>]*>/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>&nbsp;<\/p>/gi,"");content=content.replace(/-- page break --/gi,"");if(!tinyMCE.settings['force_p_newlines']){content=content.replace('','','gi');content=content.replace('</p>','<br /><br />','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]>&nbsp;<\/h[1-6]>/gi,'<p>&nbsp;&nbsp;</p>');content=content.replace(/<h[1-6]>/gi,'<p><b>');content=content.replace(/<\/h[1-6]>/gi,'</b></p>');content=content.replace(/<b>&nbsp;<\/b>/gi,'<b>&nbsp;&nbsp;</b>');content=content.replace(/^(&nbsp;)*/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<s.length;i++){var c=s.charAt(i);if(l.indexOf(c)!=-1)o+='\\'+c;else o+=c}return o},_convertMiddots:function(div,search,class_name){var mdot=String.fromCharCode(183);var bull=String.fromCharCode(8226);var nodes=div.getElementsByTagName("p");var prevul;for(var i=0;i<nodes.length;i++){var p=nodes[i];if(p.innerHTML.indexOf(search)==0){var ul=document.createElement("ul");if(class_name)ul.className=class_name;var li=document.createElement("li");li.innerHTML=p.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');ul.appendChild(li);var np=p.nextSibling;while(np){if(np.nodeType==3&&new RegExp('^\\s$','m').test(np.nodeValue)){np=np.nextSibling;continue}if(search==mdot){if(np.nodeType==1&&new RegExp('^o(\\s+|&nbsp;)').test(np.innerHTML)){if(!prevul){prevul=ul;ul=document.createElement("ul");prevul.appendChild(ul)}np.innerHTML=np.innerHTML.replace(/^o/,'')}else{if(prevul){ul=prevul;prevul=null}if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break}}else{if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break}var cp=np.nextSibling;var li=document.createElement("li");li.innerHTML=np.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');np.parentNode.removeChild(np);ul.appendChild(li);np=cp}p.parentNode.replaceChild(ul,p);return true}}return false},_clipboardHTML:function(){var div=document.getElementById('_TinyMCE_clipboardHTML');if(!div){var div=document.createElement('DIV');div.id='_TinyMCE_clipboardHTML';with(div.style){visibility='hidden';overflow='hidden';position='absolute';width=1;height=1}document.body.appendChild(div)}div.innerHTML='';var rng=document.body.createTextRange();rng.moveToElementText(div);rng.execCommand('Paste');var html=div.innerHTML;div.innerHTML='';return html}};tinyMCE.addPlugin("paste",TinyMCE_PastePlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/paste/editor_plugin_src.js b/media/tiny_mce/plugins/paste/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..4704e69
--- /dev/null
@@ -0,0 +1,395 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */ \r
+tinyMCE.importPluginLanguagePack('paste');\r
+\r
+var TinyMCE_PastePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Paste text/word',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               if (tinyMCE.isMSIE && tinyMCE.getParam("paste_auto_cleanup_on_paste", false))\r
+                       tinyMCE.addEvent(inst.getBody(), "paste", TinyMCE_PastePlugin._handlePasteEvent);\r
+       },\r
+\r
+       handleEvent : function(e) {\r
+               // Force paste dialog if non IE browser\r
+               if (!tinyMCE.isRealIE && tinyMCE.getParam("paste_auto_cleanup_on_paste", false) && e.ctrlKey && e.keyCode == 86 && e.type == "keydown") {\r
+                       window.setTimeout('tinyMCE.selectedInstance.execCommand("mcePasteText",true)', 1);\r
+                       return tinyMCE.cancelEvent(e);\r
+               }\r
+\r
+               return true;\r
+       },\r
+\r
+       getControlHTML : function(cn) { \r
+               switch (cn) { \r
+                       case "pastetext":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_paste_text_desc', '{$pluginurl}/images/pastetext.gif', 'mcePasteText', true);\r
+\r
+                       case "pasteword":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_paste_word_desc', '{$pluginurl}/images/pasteword.gif', 'mcePasteWord', true);\r
+\r
+                       case "selectall":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_selectall_desc', '{$pluginurl}/images/selectall.gif', 'mceSelectAll', true);\r
+               } \r
+\r
+               return ''; \r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) { \r
+               switch (command) { \r
+                       case "mcePasteText": \r
+                               if (user_interface) {\r
+                                       if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false))\r
+                                               TinyMCE_PastePlugin._insertText(clipboardData.getData("Text"), true); \r
+                                       else { \r
+                                               var template = new Array(); \r
+                                               template['file']        = '../../plugins/paste/pastetext.htm'; // Relative to theme \r
+                                               template['width']  = 450; \r
+                                               template['height'] = 400; \r
+                                               var plain_text = ""; \r
+                                               tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'}); \r
+                                       }\r
+                               } else\r
+                                       TinyMCE_PastePlugin._insertText(value['html'], value['linebreaks']);\r
+\r
+                               return true;\r
+\r
+                       case "mcePasteWord": \r
+                               if (user_interface) {\r
+                                       if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false)) {\r
+                                               TinyMCE_PastePlugin._insertWordContent(TinyMCE_PastePlugin._clipboardHTML());\r
+                                       } else { \r
+                                               var template = new Array(); \r
+                                               template['file']        = '../../plugins/paste/pasteword.htm'; // Relative to theme \r
+                                               template['width']  = 450; \r
+                                               template['height'] = 400; \r
+                                               var plain_text = ""; \r
+                                               tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'});\r
+                                       }\r
+                               } else\r
+                                       TinyMCE_PastePlugin._insertWordContent(value);\r
+\r
+                               return true;\r
+\r
+                       case "mceSelectAll":\r
+                               tinyMCE.execInstanceCommand(editor_id, 'selectall'); \r
+                               return true; \r
+\r
+               } \r
+\r
+               // Pass to next handler in chain \r
+               return false; \r
+       },\r
+\r
+       // Private plugin internal methods\r
+\r
+       _handlePasteEvent : function(e) {\r
+               switch (e.type) {\r
+                       case "paste":\r
+                               var html = TinyMCE_PastePlugin._clipboardHTML();\r
+                               var r, inst = tinyMCE.selectedInstance;\r
+\r
+                               // Removes italic, strong etc, the if was needed due to bug #1437114\r
+                               if (inst && (r = inst.getRng()) && r.text.length > 0)\r
+                                       tinyMCE.execCommand('delete');\r
+\r
+                               if (html && html.length > 0)\r
+                                       tinyMCE.execCommand('mcePasteWord', false, html);\r
+\r
+                               tinyMCE.cancelEvent(e);\r
+                               return false;\r
+               }\r
+\r
+               return true;\r
+       },\r
+\r
+       _insertText : function(content, bLinebreaks) { \r
+               if (content && content.length > 0) {\r
+                       if (bLinebreaks) { \r
+                               // Special paragraph treatment \r
+                               if (tinyMCE.getParam("paste_create_paragraphs", true)) {\r
+                                       var rl = tinyMCE.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');\r
+                                       for (var i=0; i<rl.length; i+=2)\r
+                                               content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);\r
+\r
+                                       content = tinyMCE.regexpReplace(content, "\r\n\r\n", "</p><p>", "gi"); \r
+                                       content = tinyMCE.regexpReplace(content, "\r\r", "</p><p>", "gi"); \r
+                                       content = tinyMCE.regexpReplace(content, "\n\n", "</p><p>", "gi"); \r
+\r
+                                       // Has paragraphs \r
+                                       if ((pos = content.indexOf('</p><p>')) != -1) { \r
+                                               tinyMCE.execCommand("Delete"); \r
+\r
+                                               var node = tinyMCE.selectedInstance.getFocusElement(); \r
+\r
+                                               // Get list of elements to break \r
+                                               var breakElms = new Array(); \r
+\r
+                                               do { \r
+                                                       if (node.nodeType == 1) { \r
+                                                               // Don't break tables and break at body \r
+                                                               if (node.nodeName == "TD" || node.nodeName == "BODY") \r
+                                                                       break; \r
+               \r
+                                                               breakElms[breakElms.length] = node; \r
+                                                       } \r
+                                               } while(node = node.parentNode); \r
+\r
+                                               var before = "", after = "</p>"; \r
+                                               before += content.substring(0, pos); \r
+\r
+                                               for (var i=0; i<breakElms.length; i++) { \r
+                                                       before += "</" + breakElms[i].nodeName + ">"; \r
+                                                       after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; \r
+                                               } \r
+\r
+                                               before += "<p>"; \r
+                                               content = before + content.substring(pos+7) + after; \r
+                                       } \r
+                               } \r
+\r
+                               if (tinyMCE.getParam("paste_create_linebreaks", true)) {\r
+                                       content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi"); \r
+                                       content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi"); \r
+                                       content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi"); \r
+                               }\r
+                       } \r
+               \r
+                       tinyMCE.execCommand("mceInsertRawHTML", false, content); \r
+               }\r
+       },\r
+\r
+       _insertWordContent : function(content) { \r
+               if (content && content.length > 0) {\r
+                       // Cleanup Word content\r
+                       var bull = String.fromCharCode(8226);\r
+                       var middot = String.fromCharCode(183);\r
+                       var cb;\r
+\r
+                       if ((cb = tinyMCE.getParam("paste_insert_word_content_callback", "")) != "")\r
+                               content = eval(cb + "('before', content)");\r
+\r
+                       var rl = tinyMCE.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');\r
+                       for (var i=0; i<rl.length; i+=2)\r
+                               content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);\r
+\r
+                       if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {\r
+                               content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>');\r
+                       }\r
+\r
+                       content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--");\r
+                       content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>");\r
+                       content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list\r
+                       content = content.replace(/<o:p><\/o:p>/gi, "");\r
+                       content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks\r
+                       content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), "");  // Word comments\r
+\r
+                       if (tinyMCE.getParam("paste_remove_spans", true))\r
+                               content = content.replace(/<\/?span[^>]*>/gi, "");\r
+\r
+                       if (tinyMCE.getParam("paste_remove_styles", true))\r
+                               content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");\r
+\r
+                       content = content.replace(/<\/?font[^>]*>/gi, "");\r
+\r
+                       // Strips class attributes.\r
+                       switch (tinyMCE.getParam("paste_strip_class_attributes", "all")) {\r
+                               case "all":\r
+                                       content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");\r
+                                       break;\r
+\r
+                               case "mso":\r
+                                       content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3");\r
+                                       break;\r
+                       }\r
+\r
+                       content = content.replace(new RegExp('href="?' + TinyMCE_PastePlugin._reEscape("" + document.location) + '', 'gi'), 'href="' + tinyMCE.settings['document_base_url']);\r
+                       content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");\r
+                       content = content.replace(/<\\?\?xml[^>]*>/gi, "");\r
+                       content = content.replace(/<\/?\w+:[^>]*>/gi, "");\r
+                       content = content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi, ""); // Remove pagebreaks\r
+                       content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks\r
+\r
+       //              content = content.replace(/\/?&nbsp;*/gi, ""); &nbsp;\r
+       //              content = content.replace(/<p>&nbsp;<\/p>/gi, '');\r
+\r
+                       if (!tinyMCE.settings['force_p_newlines']) {\r
+                               content = content.replace('', '' ,'gi');\r
+                               content = content.replace('</p>', '<br /><br />' ,'gi');\r
+                       }\r
+\r
+                       if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) {\r
+                               content = content.replace(/<\/?p[^>]*>/gi, "");\r
+                       }\r
+\r
+                       content = content.replace(/<\/?div[^>]*>/gi, "");\r
+\r
+                       // Convert all middlot lists to UL lists\r
+                       if (tinyMCE.getParam("paste_convert_middot_lists", true)) {\r
+                               var div = document.createElement("div");\r
+                               div.innerHTML = content;\r
+\r
+                               // Convert all middot paragraphs to li elements\r
+                               var className = tinyMCE.getParam("paste_unindented_list_class", "unIndentedList");\r
+\r
+                               while (TinyMCE_PastePlugin._convertMiddots(div, "--list--")) ; // bull\r
+                               while (TinyMCE_PastePlugin._convertMiddots(div, middot, className)) ; // Middot\r
+                               while (TinyMCE_PastePlugin._convertMiddots(div, bull)) ; // bull\r
+\r
+                               content = div.innerHTML;\r
+                       }\r
+\r
+                       // Replace all headers with strong and fix some other issues\r
+                       if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) {\r
+                               content = content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi, '<p>&nbsp;&nbsp;</p>');\r
+                               content = content.replace(/<h[1-6]>/gi, '<p><b>');\r
+                               content = content.replace(/<\/h[1-6]>/gi, '</b></p>');\r
+                               content = content.replace(/<b>&nbsp;<\/b>/gi, '<b>&nbsp;&nbsp;</b>');\r
+                               content = content.replace(/^(&nbsp;)*/gi, '');\r
+                       }\r
+\r
+                       content = content.replace(/--list--/gi, ""); // Remove --list--\r
+\r
+                       if ((cb = tinyMCE.getParam("paste_insert_word_content_callback", "")) != "")\r
+                               content = eval(cb + "('after', content)");\r
+\r
+                       // Insert cleaned content\r
+                       tinyMCE.execCommand("mceInsertContent", false, content);\r
+\r
+                       if (tinyMCE.getParam('paste_force_cleanup_wordpaste', true))\r
+                               window.setTimeout('tinyMCE.execCommand("mceCleanup");', 1); // Do normal cleanup detached from this thread\r
+               }\r
+       },\r
+\r
+       _reEscape : function(s) {\r
+               var l = "?.\\*[](){}+^$:";\r
+               var o = "";\r
+\r
+               for (var i=0; i<s.length; i++) {\r
+                       var c = s.charAt(i);\r
+\r
+                       if (l.indexOf(c) != -1)\r
+                               o += '\\' + c;\r
+                       else\r
+                               o += c;\r
+               }\r
+\r
+               return o;\r
+       },\r
+\r
+       _convertMiddots : function(div, search, class_name) {\r
+               var mdot = String.fromCharCode(183);\r
+               var bull = String.fromCharCode(8226);\r
+\r
+               var nodes = div.getElementsByTagName("p");\r
+               var prevul;\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       var p = nodes[i];\r
+\r
+                       // Is middot\r
+                       if (p.innerHTML.indexOf(search) == 0) {\r
+                               var ul = document.createElement("ul");\r
+\r
+                               if (class_name)\r
+                                       ul.className = class_name;\r
+\r
+                               // Add the first one\r
+                               var li = document.createElement("li");\r
+                               li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
+                               ul.appendChild(li);\r
+\r
+                               // Add the rest\r
+                               var np = p.nextSibling;\r
+                               while (np) {\r
+                               // If the node is whitespace, then\r
+                               // ignore it and continue on.\r
+                               if (np.nodeType == 3 && new RegExp('^\\s$', 'm').test(np.nodeValue)) {\r
+                                       np = np.nextSibling;\r
+                                       continue;\r
+                               }\r
+\r
+                                       if (search == mdot) {\r
+                                               if (np.nodeType == 1 && new RegExp('^o(\\s+|&nbsp;)').test(np.innerHTML)) {\r
+                                                       // Second level of nesting\r
+                                                       if (!prevul) {\r
+                                                               prevul = ul;\r
+                                                               ul = document.createElement("ul");\r
+                                                               prevul.appendChild(ul);\r
+                                                       }\r
+                                                       np.innerHTML = np.innerHTML.replace(/^o/, '');\r
+                                               } else {\r
+                                                       // Pop the stack if we're going back up to the first level\r
+                                                       if (prevul) {\r
+                                                               ul = prevul;\r
+                                                               prevul = null;\r
+                                                       }\r
+                                                       // Not element or middot paragraph\r
+                                                       if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)\r
+                                                               break;\r
+                                               }\r
+                                       } else {\r
+                                               // Not element or middot paragraph\r
+                                               if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)\r
+                                                       break;\r
+                                       }\r
+\r
+                                       var cp = np.nextSibling;\r
+                                       var li = document.createElement("li");\r
+                                       li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');\r
+                                       np.parentNode.removeChild(np);\r
+                                       ul.appendChild(li);\r
+                                       np = cp;\r
+                               }\r
+\r
+                               p.parentNode.replaceChild(ul, p);\r
+\r
+                               return true;\r
+                       }\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       _clipboardHTML : function() {\r
+               var div = document.getElementById('_TinyMCE_clipboardHTML');\r
+\r
+               if (!div) {\r
+                       var div = document.createElement('DIV');\r
+                       div.id = '_TinyMCE_clipboardHTML';\r
+\r
+                       with (div.style) {\r
+                               visibility = 'hidden';\r
+                               overflow = 'hidden';\r
+                               position = 'absolute';\r
+                               width = 1;\r
+                               height = 1;\r
+                       }\r
+\r
+                       document.body.appendChild(div);\r
+               }\r
+\r
+               div.innerHTML = '';\r
+               var rng = document.body.createTextRange();\r
+               rng.moveToElementText(div);\r
+               rng.execCommand('Paste');\r
+               var html = div.innerHTML;\r
+               div.innerHTML = '';\r
+               return html;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("paste", TinyMCE_PastePlugin);\r
diff --git a/media/tiny_mce/plugins/paste/images/pastetext.gif b/media/tiny_mce/plugins/paste/images/pastetext.gif
new file mode 100755 (executable)
index 0000000..e381cc6
Binary files /dev/null and b/media/tiny_mce/plugins/paste/images/pastetext.gif differ
diff --git a/media/tiny_mce/plugins/paste/images/pasteword.gif b/media/tiny_mce/plugins/paste/images/pasteword.gif
new file mode 100755 (executable)
index 0000000..0ccb008
Binary files /dev/null and b/media/tiny_mce/plugins/paste/images/pasteword.gif differ
diff --git a/media/tiny_mce/plugins/paste/images/selectall.gif b/media/tiny_mce/plugins/paste/images/selectall.gif
new file mode 100755 (executable)
index 0000000..c4f9901
Binary files /dev/null and b/media/tiny_mce/plugins/paste/images/selectall.gif differ
diff --git a/media/tiny_mce/plugins/paste/jscripts/pastetext.js b/media/tiny_mce/plugins/paste/jscripts/pastetext.js
new file mode 100755 (executable)
index 0000000..4c07691
--- /dev/null
@@ -0,0 +1,38 @@
+function saveContent() {\r
+       if (document.forms[0].htmlSource.value == '') {\r
+               tinyMCEPopup.close();\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.execCommand('mcePasteText', false, {\r
+               html : document.forms[0].htmlSource.value,\r
+               linebreaks : document.forms[0].linebreaks.checked\r
+       });\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // Remove Gecko spellchecking\r
+       if (tinyMCE.isGecko)\r
+               document.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");\r
+\r
+       resizeInputs();\r
+}\r
+\r
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;\r
+\r
+function resizeInputs() {\r
+       if (!tinyMCE.isMSIE) {\r
+               wHeight = self.innerHeight-80;\r
+               wWidth = self.innerWidth-17;\r
+       } else {\r
+               wHeight = document.body.clientHeight-80;\r
+               wWidth = document.body.clientWidth-17;\r
+       }\r
+\r
+       document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';\r
+       document.forms[0].htmlSource.style.width  = Math.abs(wWidth) + 'px';\r
+}\r
diff --git a/media/tiny_mce/plugins/paste/jscripts/pasteword.js b/media/tiny_mce/plugins/paste/jscripts/pasteword.js
new file mode 100755 (executable)
index 0000000..b243a10
--- /dev/null
@@ -0,0 +1,52 @@
+function saveContent() {\r
+       var html = document.getElementById("frmData").contentWindow.document.body.innerHTML;\r
+\r
+       if (html == ''){\r
+               tinyMCEPopup.close();\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.execCommand('mcePasteWord', false, html);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // Fix for endless reloading in FF\r
+       window.setTimeout('createIFrame();', 10);\r
+}\r
+\r
+function createIFrame() {\r
+       document.getElementById('iframecontainer').innerHTML = '<iframe id="frmData" name="frmData" class="sourceIframe" src="blank.htm" height="280" width="400" frameborder="0" style="background-color:#FFFFFF; width:100%;" dir="ltr" wrap="soft"></iframe>';\r
+}\r
+\r
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;\r
+\r
+function initIframe(doc) {\r
+       var dir = tinyMCE.selectedInstance.settings['directionality'];\r
+\r
+       doc.body.dir = dir;\r
+\r
+       // Remove Gecko spellchecking\r
+       if (tinyMCE.isGecko)\r
+               doc.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");\r
+\r
+       resizeInputs();\r
+}\r
+\r
+function resizeInputs() {\r
+       if (!tinyMCE.isMSIE) {\r
+               wHeight = self.innerHeight - 80;\r
+               wWidth = self.innerWidth - 18;\r
+       } else {\r
+               wHeight = document.body.clientHeight - 80;\r
+               wWidth = document.body.clientWidth - 18;\r
+       }\r
+\r
+       var elm = document.getElementById('frmData');\r
+       if (elm) {\r
+               elm.style.height = Math.abs(wHeight) + 'px';\r
+               elm.style.width  = Math.abs(wWidth) + 'px';\r
+       }\r
+}\r
diff --git a/media/tiny_mce/plugins/paste/langs/en.js b/media/tiny_mce/plugins/paste/langs/en.js
new file mode 100755 (executable)
index 0000000..b125d51
--- /dev/null
@@ -0,0 +1,10 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+paste_text_desc : 'Paste as Plain Text',\r
+paste_text_title : 'Use CTRL+V on your keyboard to paste the text into the window.',\r
+paste_text_linebreaks : 'Keep linebreaks',\r
+paste_word_desc : 'Paste from Word',\r
+paste_word_title : 'Use CTRL+V on your keyboard to paste the text into the window.',\r
+selectall_desc : 'Select All'\r
+});\r
diff --git a/media/tiny_mce/plugins/paste/pastetext.htm b/media/tiny_mce/plugins/paste/pastetext.htm
new file mode 100755 (executable)
index 0000000..63ff000
--- /dev/null
@@ -0,0 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_paste_text_desc}</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/pastetext.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">\r
+<form name="source" onsubmit="saveContent();">\r
+       <div style="float: left" class="title">{$lang_paste_text_desc}</div>\r
+\r
+       <div style="float: right">\r
+               <input type="checkbox" name="linebreaks" id="linebreaks" class="wordWrapCode" checked="checked" /><label for="linebreaks">{$lang_paste_text_linebreaks}</label>\r
+       </div>\r
+\r
+       <br style="clear: both" />\r
+\r
+       <div>{$lang_paste_text_title}</div>\r
+\r
+       <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft"></textarea>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" name="insert" value="{$lang_insert}" onclick="saveContent();" id="insert" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body> \r
+</html>
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/paste/pasteword.htm b/media/tiny_mce/plugins/paste/pasteword.htm
new file mode 100755 (executable)
index 0000000..7acc7f7
--- /dev/null
@@ -0,0 +1,29 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <title>{$lang_paste_word_desc}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/pasteword.js"></script>\r
+       <link href="css/pasteword.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">\r
+       <form name="source" onsubmit="saveContent();" action="#">\r
+               <div class="title">{$lang_paste_word_desc}</div>\r
+\r
+               <div>{$lang_paste_word_title}</div>\r
+\r
+               <div id="iframecontainer"></div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="saveContent();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/paste/readme.txt b/media/tiny_mce/plugins/paste/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/preview/editor_plugin.js b/media/tiny_mce/plugins/preview/editor_plugin.js
new file mode 100755 (executable)
index 0000000..5409610
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview',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('<body'),pos2,css=tinyMCE.getParam("content_css").split(',');if(pos!=-1){pos=c.indexOf('>',pos);pos2=c.lastIndexOf('</body>');c=c.substring(pos+1,pos2)}html+=tinyMCE.getParam('doctype');html+='<html xmlns="http://www.w3.org/1999/xhtml">';html+='<head>';html+='<title>'+tinyMCE.getLang('lang_preview_desc')+'</title>';html+='<base href="'+tinyMCE.settings['base_href']+'" />';html+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';for(i=0;i<css.length;i++)html+='<link href="'+css[i]+'" rel="stylesheet" type="text/css" />';html+='<script type="text/javascript">';html+='window.opener.TinyMCE_PreviewPlugin._setDoc(document);';html+='window.opener.TinyMCE_PreviewPlugin._setWin(window);';html+='writeFlash = window.opener.TinyMCE_PreviewPlugin._writeFlash;';html+='writeShockWave = window.opener.TinyMCE_PreviewPlugin._writeShockWave;';html+='writeQuickTime = window.opener.TinyMCE_PreviewPlugin._writeQuickTime;';html+='writeRealMedia = window.opener.TinyMCE_PreviewPlugin._writeRealMedia;';html+='writeWindowsMedia = window.opener.TinyMCE_PreviewPlugin._writeWindowsMedia;';html+='writeEmbed = window.opener.TinyMCE_PreviewPlugin._writeEmbed;';html+='</script>';html+='</head>';html+='<body dir="'+tinyMCE.getParam("directionality")+'" onload="window.opener.TinyMCE_PreviewPlugin._onLoad();">';html+=c;html+='</body>';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<nl.length;i++){sv=tinyMCE.isMSIE?nl[i].innerHTML:nl[i].firstChild.nodeValue;if(new RegExp('write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\\(.*','g').test(sv))el[el.length]=nl[i]}for(i=0;i<el.length;i++){ne=d.createElement("div");ne.innerHTML=d._embeds[i];el[i].parentNode.insertBefore(ne.firstChild,el[i])}},_writeFlash:function(p){p.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],p.src);TinyMCE_PreviewPlugin._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)},_writeShockWave:function(p){p.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],p.src);TinyMCE_PreviewPlugin._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)},_writeQuickTime:function(p){p.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],p.src);TinyMCE_PreviewPlugin._writeEmbed('02BF25D5-8C17-4B23-BC80-D3488ABDDC6B','http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0','video/quicktime',p)},_writeRealMedia:function(p){p.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],p.src);TinyMCE_PreviewPlugin._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)},_writeWindowsMedia:function(p){p.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],p.src);p.url=p.src;TinyMCE_PreviewPlugin._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)},_writeEmbed:function(cls,cb,mt,p){var h='',n,d=TinyMCE_PreviewPlugin._doc,ne,c;h+='<object classid="clsid:'+cls+'" codebase="'+cb+'"';h+=typeof(p.id)!="undefined"?'id="'+p.id+'"':'';h+=typeof(p.name)!="undefined"?'name="'+p.name+'"':'';h+=typeof(p.width)!="undefined"?'width="'+p.width+'"':'';h+=typeof(p.height)!="undefined"?'height="'+p.height+'"':'';h+=typeof(p.align)!="undefined"?'align="'+p.align+'"':'';h+='>';for(n in p)h+='<param name="'+n+'" value="'+p[n]+'">';h+='<embed type="'+mt+'"';for(n in p)h+=n+'="'+p[n]+'" ';h+='></embed></object>';d._embeds[d._embeds.length]=h}};tinyMCE.addPlugin("preview",TinyMCE_PreviewPlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/preview/editor_plugin_src.js b/media/tiny_mce/plugins/preview/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..449e226
--- /dev/null
@@ -0,0 +1,205 @@
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.
+ */
+
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('preview');
+
+var TinyMCE_PreviewPlugin = {
+       getInfo : function() {
+               return {
+                       longname : 'Preview',
+                       author : 'Moxiecode Systems AB',
+                       authorurl : 'http://tinymce.moxiecode.com',
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview',
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+               };
+       },
+
+       /**
+        * Returns the HTML contents of the preview control.
+        */
+       getControlHTML : function(cn) {
+               switch (cn) {
+                       case "preview":
+                               return tinyMCE.getButtonHTML(cn, 'lang_preview_desc', '{$pluginurl}/images/preview.gif', 'mcePreview');
+               }
+
+               return "";
+       },
+
+       /**
+        * Executes the mcePreview command.
+        */
+       execCommand : function(editor_id, element, command, user_interface, value) {
+               // Handle commands
+               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");
+
+                               // Use a custom preview page
+                               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('<body'), pos2, css = tinyMCE.getParam("content_css").split(',');
+
+                                       if (pos != -1) {
+                                               pos = c.indexOf('>', pos);
+                                               pos2 = c.lastIndexOf('</body>');
+                                               c = c.substring(pos + 1, pos2);
+                                       }
+
+                                       html += tinyMCE.getParam('doctype');
+                                       html += '<html xmlns="http://www.w3.org/1999/xhtml">';
+                                       html += '<head>';
+                                       html += '<title>' + tinyMCE.getLang('lang_preview_desc') + '</title>';
+                                       html += '<base href="' + tinyMCE.settings['base_href'] + '" />';
+                                       html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
+
+                                       for (i=0; i<css.length; i++)
+                                               html += '<link href="' + css[i] + '" rel="stylesheet" type="text/css" />';
+
+                                       html += '<script type="text/javascript">';
+                                       html += 'window.opener.TinyMCE_PreviewPlugin._setDoc(document);';
+                                       html += 'window.opener.TinyMCE_PreviewPlugin._setWin(window);';
+                                       html += 'writeFlash = window.opener.TinyMCE_PreviewPlugin._writeFlash;';
+                                       html += 'writeShockWave = window.opener.TinyMCE_PreviewPlugin._writeShockWave;';
+                                       html += 'writeQuickTime = window.opener.TinyMCE_PreviewPlugin._writeQuickTime;';
+                                       html += 'writeRealMedia = window.opener.TinyMCE_PreviewPlugin._writeRealMedia;';
+                                       html += 'writeWindowsMedia = window.opener.TinyMCE_PreviewPlugin._writeWindowsMedia;';
+                                       html += 'writeEmbed = window.opener.TinyMCE_PreviewPlugin._writeEmbed;';
+                                       html += '</script>';
+                                       html += '</head>';
+                                       html += '<body dir="' + tinyMCE.getParam("directionality") + '" onload="window.opener.TinyMCE_PreviewPlugin._onLoad();">';
+                                       html += c;
+                                       html += '</body>';
+                                       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<nl.length; i++) {
+                       sv = tinyMCE.isMSIE ? nl[i].innerHTML : nl[i].firstChild.nodeValue;
+
+                       if (new RegExp('write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\\(.*', 'g').test(sv))
+                               el[el.length] = nl[i];
+               }
+
+               for (i=0; i<el.length; i++) {
+                       ne = d.createElement("div");
+                       ne.innerHTML = d._embeds[i];
+                       el[i].parentNode.insertBefore(ne.firstChild, el[i]);
+               }
+       },
+
+       _writeFlash : function(p) {
+               p.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], p.src);
+               TinyMCE_PreviewPlugin._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
+               );
+       },
+
+       _writeShockWave : function(p) {
+               p.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], p.src);
+               TinyMCE_PreviewPlugin._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
+               );
+       },
+
+       _writeQuickTime : function(p) {
+               p.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], p.src);
+               TinyMCE_PreviewPlugin._writeEmbed(
+                       '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
+                       'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
+                       'video/quicktime',
+                       p
+               );
+       },
+
+       _writeRealMedia : function(p) {
+               p.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], p.src);
+               TinyMCE_PreviewPlugin._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
+               );
+       },
+
+       _writeWindowsMedia : function(p) {
+               p.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], p.src);
+               p.url = p.src;
+               TinyMCE_PreviewPlugin._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
+               );
+       },
+
+       _writeEmbed : function(cls, cb, mt, p) {
+               var h = '', n, d = TinyMCE_PreviewPlugin._doc, ne, c;
+
+               h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';
+               h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';
+               h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';
+               h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';
+               h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';
+               h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';
+               h += '>';
+
+               for (n in p)
+                       h += '<param name="' + n + '" value="' + p[n] + '">';
+
+               h += '<embed type="' + mt + '"';
+
+               for (n in p)
+                       h += n + '="' + p[n] + '" ';
+
+               h += '></embed></object>';
+
+               d._embeds[d._embeds.length] = h;
+       }
+};
+
+tinyMCE.addPlugin("preview", TinyMCE_PreviewPlugin);
diff --git a/media/tiny_mce/plugins/preview/example.html b/media/tiny_mce/plugins/preview/example.html
new file mode 100755 (executable)
index 0000000..d02eb73
--- /dev/null
@@ -0,0 +1,14 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+<script language="javascript" src="../../tiny_mce_popup.js"></script>\r
+<script type="text/javascript" src="jscripts/embed.js"></script>\r
+<title>Example of a custom preview page</title>\r
+<link href="{$content_css}" rel="stylesheet" type="text/css" />\r
+</head>\r
+<body>\r
+\r
+Editor contents: <br />\r
+{$content}\r
+\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/preview/images/preview.gif b/media/tiny_mce/plugins/preview/images/preview.gif
new file mode 100755 (executable)
index 0000000..318936e
Binary files /dev/null and b/media/tiny_mce/plugins/preview/images/preview.gif differ
diff --git a/media/tiny_mce/plugins/preview/jscripts/embed.js b/media/tiny_mce/plugins/preview/jscripts/embed.js
new file mode 100755 (executable)
index 0000000..f8dc810
--- /dev/null
@@ -0,0 +1,73 @@
+/**\r
+ * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.\r
+ */\r
+\r
+function writeFlash(p) {\r
+       writeEmbed(\r
+               'D27CDB6E-AE6D-11cf-96B8-444553540000',\r
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
+               'application/x-shockwave-flash',\r
+               p\r
+       );\r
+}\r
+\r
+function writeShockWave(p) {\r
+       writeEmbed(\r
+       '166B1BCA-3F9C-11CF-8075-444553540000',\r
+       'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',\r
+       'application/x-director',\r
+               p\r
+       );\r
+}\r
+\r
+function writeQuickTime(p) {\r
+       writeEmbed(\r
+               '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',\r
+               'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',\r
+               'video/quicktime',\r
+               p\r
+       );\r
+}\r
+\r
+function writeRealMedia(p) {\r
+       writeEmbed(\r
+               'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',\r
+               'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',\r
+               'audio/x-pn-realaudio-plugin',\r
+               p\r
+       );\r
+}\r
+\r
+function writeWindowsMedia(p) {\r
+       p.url = p.src;\r
+       writeEmbed(\r
+               '6BF52A52-394A-11D3-B153-00C04F79FAA6',\r
+               'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',\r
+               'application/x-mplayer2',\r
+               p\r
+       );\r
+}\r
+\r
+function writeEmbed(cls, cb, mt, p) {\r
+       var h = '', n;\r
+\r
+       h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';\r
+       h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';\r
+       h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';\r
+       h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';\r
+       h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';\r
+       h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';\r
+       h += '>';\r
+\r
+       for (n in p)\r
+               h += '<param name="' + n + '" value="' + p[n] + '">';\r
+\r
+       h += '<embed type="' + mt + '"';\r
+\r
+       for (n in p)\r
+               h += n + '="' + p[n] + '" ';\r
+\r
+       h += '></embed></object>';\r
+\r
+       document.write(h);\r
+}\r
diff --git a/media/tiny_mce/plugins/preview/langs/en.js b/media/tiny_mce/plugins/preview/langs/en.js
new file mode 100755 (executable)
index 0000000..b68b675
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+preview_desc : 'Preview'\r
+});\r
diff --git a/media/tiny_mce/plugins/preview/readme.txt b/media/tiny_mce/plugins/preview/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/print/editor_plugin.js b/media/tiny_mce/plugins/print/editor_plugin.js
new file mode 100755 (executable)
index 0000000..79241fe
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('print');var TinyMCE_PrintPlugin={getInfo:function(){return{longname:'Print',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(cn){switch(cn){case"print":return tinyMCE.getButtonHTML(cn,'lang_print_desc','{$pluginurl}/images/print.gif','mcePrint')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mcePrint":tinyMCE.getInstanceById(editor_id).contentWindow.print();return true}return false}};tinyMCE.addPlugin("print",TinyMCE_PrintPlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/print/editor_plugin_src.js b/media/tiny_mce/plugins/print/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..9478a51
--- /dev/null
@@ -0,0 +1,47 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import theme        specific language pack */\r
+tinyMCE.importPluginLanguagePack('print');\r
+\r
+var TinyMCE_PrintPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Print',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       getControlHTML : function(cn)   {\r
+               switch (cn) {\r
+                       case "print":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_print_desc', '{$pluginurl}/images/print.gif', 'mcePrint');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes     the     search/replace commands.\r
+        */\r
+       execCommand : function(editor_id, element, command,     user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mcePrint":\r
+                               tinyMCE.getInstanceById(editor_id).contentWindow.print();\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("print", TinyMCE_PrintPlugin);\r
diff --git a/media/tiny_mce/plugins/print/images/print.gif b/media/tiny_mce/plugins/print/images/print.gif
new file mode 100755 (executable)
index 0000000..72104d1
Binary files /dev/null and b/media/tiny_mce/plugins/print/images/print.gif differ
diff --git a/media/tiny_mce/plugins/print/langs/en.js b/media/tiny_mce/plugins/print/langs/en.js
new file mode 100755 (executable)
index 0000000..6407cdb
--- /dev/null
@@ -0,0 +1,5 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+print_desc : 'Print'\r
+});\r
diff --git a/media/tiny_mce/plugins/print/readme.txt b/media/tiny_mce/plugins/print/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/readme.txt b/media/tiny_mce/plugins/readme.txt
new file mode 100755 (executable)
index 0000000..b694fdb
--- /dev/null
@@ -0,0 +1 @@
+This is the location you place TinyMCE plugins.\r
diff --git a/media/tiny_mce/plugins/save/editor_plugin.js b/media/tiny_mce/plugins/save/editor_plugin.js
new file mode 100755 (executable)
index 0000000..bd23dab
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('save');var TinyMCE_SavePlugin={getInfo:function(){return{longname:'Save',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){inst.addShortcut('ctrl','s','lang_save_desc','mceSave')},getControlHTML:function(cn){switch(cn){case"save":return tinyMCE.getButtonHTML(cn,'lang_save_desc','{$pluginurl}/images/save.gif','mceSave');case"cancel":return tinyMCE.getButtonHTML(cn,'lang_cancel_desc','{$pluginurl}/images/cancel.gif','mceCancel')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceSave":return this._save(editor_id,element,command,user_interface,value);case"mceCancel":return this._cancel(editor_id,element,command,user_interface,value)}return false},_save:function(editor_id,element,command,user_interface,value){var inst,formObj,os,i,elementId;if(tinyMCE.getParam("fullscreen_is_enabled"))return true;inst=tinyMCE.selectedInstance;formObj=inst.formElement.form;if(tinyMCE.getParam("save_enablewhendirty")&&!inst.isDirty())return true;if(formObj){tinyMCE.triggerSave();if((os=tinyMCE.getParam("save_onsavecallback"))){if(eval(os+'(inst);')){inst.startContent=tinyMCE.trim(inst.getBody().innerHTML);tinyMCE.triggerNodeChange(false,true)}return true}for(i=0;i<formObj.elements.length;i++){elementId=formObj.elements[i].name?formObj.elements[i].name:formObj.elements[i].id;if(elementId.indexOf('mce_editor_')==0)formObj.elements[i].disabled=true}inst.isNotDirty=true;if(formObj.onsubmit==null||formObj.onsubmit()!=false)inst.formElement.form.submit();tinyMCE.triggerNodeChange(false,true)}else alert("Error: No form element found.");return true},_cancel:function(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id),os,h=tinyMCE.trim(inst.startContent);if((os=tinyMCE.getParam("save_oncancelcallback"))){if(eval(os+'(inst);'))return true}inst.setHTML(h);inst.undoRedo.undoLevels=[];inst.undoRedo.add({content:h});inst.undoRedo.undoIndex=0;inst.undoRedo.typingUndoIndex=-1;tinyMCE.triggerNodeChange(false,true);return true},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var inst;if(tinyMCE.getParam("fullscreen_is_enabled")){tinyMCE.switchClass(editor_id+'_save','mceButtonDisabled');return true}if(tinyMCE.getParam("save_enablewhendirty")){inst=tinyMCE.getInstanceById(editor_id);if(inst.isDirty()){tinyMCE.switchClass(editor_id+'_save','mceButtonNormal');return true}tinyMCE.switchClass(editor_id+'_save','mceButtonDisabled')}return true}};tinyMCE.addPlugin("save",TinyMCE_SavePlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/save/editor_plugin_src.js b/media/tiny_mce/plugins/save/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..7ad469a
--- /dev/null
@@ -0,0 +1,152 @@
+/**\r
+ * $Id: editor_plugin_src.js 251 2007-04-10 20:16:15Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('save');\r
+\r
+var TinyMCE_SavePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Save',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               inst.addShortcut('ctrl', 's', 'lang_save_desc', 'mceSave');\r
+       },\r
+\r
+       /**\r
+        * Returns the HTML contents of the save control.\r
+        */\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "save":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_save_desc', '{$pluginurl}/images/save.gif', 'mceSave');\r
+\r
+                       case "cancel":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_cancel_desc', '{$pluginurl}/images/cancel.gif', 'mceCancel');\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes the save command.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceSave":\r
+                               return this._save(editor_id, element, command, user_interface, value);\r
+\r
+                       case "mceCancel":\r
+                               return this._cancel(editor_id, element, command, user_interface, value);\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       },\r
+\r
+       _save : function(editor_id, element, command, user_interface, value) {\r
+               var inst, formObj, os, i, elementId;\r
+\r
+               if (tinyMCE.getParam("fullscreen_is_enabled"))\r
+                       return true;\r
+\r
+               inst = tinyMCE.selectedInstance;\r
+               formObj = inst.formElement.form;\r
+\r
+               if (tinyMCE.getParam("save_enablewhendirty") && !inst.isDirty())\r
+                       return true;\r
+\r
+               if (formObj) {\r
+                       tinyMCE.triggerSave();\r
+\r
+                       // Use callback instead\r
+                       if ((os = tinyMCE.getParam("save_onsavecallback"))) {\r
+                               if (eval(os + '(inst);')) {\r
+                                       inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);\r
+                                       /*inst.undoLevels = new Array();\r
+                                       inst.undoIndex = 0;\r
+                                       inst.typingUndoIndex = -1;\r
+                                       inst.undoRedo = true;\r
+                                       inst.undoLevels[inst.undoLevels.length] = inst.startContent;*/\r
+                                       tinyMCE.triggerNodeChange(false, true);\r
+                               }\r
+\r
+                               return true;\r
+                       }\r
+\r
+                       // Disable all UI form elements that TinyMCE created\r
+                       for (i=0; i<formObj.elements.length; i++) {\r
+                               elementId = formObj.elements[i].name ? formObj.elements[i].name : formObj.elements[i].id;\r
+\r
+                               if (elementId.indexOf('mce_editor_') == 0)\r
+                                       formObj.elements[i].disabled = true;\r
+                       }\r
+\r
+                       inst.isNotDirty = true;\r
+\r
+                       if (formObj.onsubmit == null || formObj.onsubmit() != false)\r
+                               inst.formElement.form.submit();\r
+\r
+                       tinyMCE.triggerNodeChange(false, true);\r
+               } else\r
+                       alert("Error: No form element found.");\r
+\r
+               return true;\r
+       },\r
+\r
+       _cancel : function(editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), os, h = tinyMCE.trim(inst.startContent);\r
+\r
+               // Use callback instead\r
+               if ((os = tinyMCE.getParam("save_oncancelcallback"))) {\r
+                       if (eval(os + '(inst);'))\r
+                               return true;\r
+               }\r
+\r
+               inst.setHTML(h);\r
+\r
+               inst.undoRedo.undoLevels = [];\r
+               inst.undoRedo.add({ content : h });\r
+               inst.undoRedo.undoIndex = 0;\r
+               inst.undoRedo.typingUndoIndex = -1;\r
+\r
+               tinyMCE.triggerNodeChange(false, true);\r
+\r
+               return true;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               var inst;\r
+\r
+               if (tinyMCE.getParam("fullscreen_is_enabled")) {\r
+                       tinyMCE.switchClass(editor_id + '_save', 'mceButtonDisabled');\r
+                       return true;\r
+               }\r
+\r
+               if (tinyMCE.getParam("save_enablewhendirty")) {\r
+                       inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+                       if (inst.isDirty()) {\r
+                               tinyMCE.switchClass(editor_id + '_save', 'mceButtonNormal');\r
+                               return true;\r
+                       }\r
+\r
+                       tinyMCE.switchClass(editor_id + '_save', 'mceButtonDisabled');\r
+               }\r
+\r
+               return true;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("save", TinyMCE_SavePlugin);\r
diff --git a/media/tiny_mce/plugins/save/images/cancel.gif b/media/tiny_mce/plugins/save/images/cancel.gif
new file mode 100755 (executable)
index 0000000..ad190ef
Binary files /dev/null and b/media/tiny_mce/plugins/save/images/cancel.gif differ
diff --git a/media/tiny_mce/plugins/save/images/save.gif b/media/tiny_mce/plugins/save/images/save.gif
new file mode 100755 (executable)
index 0000000..2777beb
Binary files /dev/null and b/media/tiny_mce/plugins/save/images/save.gif differ
diff --git a/media/tiny_mce/plugins/save/langs/en.js b/media/tiny_mce/plugins/save/langs/en.js
new file mode 100755 (executable)
index 0000000..7793088
--- /dev/null
@@ -0,0 +1,6 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+save_desc : 'Save',\r
+cancel_desc : 'Cancel all changes'\r
+});\r
diff --git a/media/tiny_mce/plugins/save/readme.txt b/media/tiny_mce/plugins/save/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/searchreplace/css/searchreplace.css b/media/tiny_mce/plugins/searchreplace/css/searchreplace.css
new file mode 100755 (executable)
index 0000000..4c7bd13
--- /dev/null
@@ -0,0 +1,20 @@
+/* stylesheet for advsearchreplace plugin*/\r
+\r
+.panel_wrapper { height: 85px; }\r
+.panel_wrapper div.current { height: 85px; }\r
+\r
+/* MS IE only styles */\r
+* html .panel_wrapper { height: 100px; }\r
+* html .panel_wrapper div.current { height: 100px; }\r
+\r
+#replaceBtn, #replaceAllBtn {\r
+       padding-bottom: 2px;\r
+       font-weight: bold;\r
+       width: 90px;\r
+       height: 21px;\r
+       border: 0;\r
+       cursor: pointer;\r
+}\r
+\r
+#replaceBtn { background: url(../images/replace_button_bg.gif); }\r
+#replaceAllBtn { background: url(../images/replace_all_button_bg.gif); }\r
diff --git a/media/tiny_mce/plugins/searchreplace/editor_plugin.js b/media/tiny_mce/plugins/searchreplace/editor_plugin.js
new file mode 100755 (executable)
index 0000000..959e9cc
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace',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){if(!inst.selection.isCollapsed()){if(tinyMCE.isRealIE)inst.selection.getRng().duplicate().pasteHTML(str);else 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"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.selection.collapse(true);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;var awin=value.win,found;if(body.innerHTML==""){awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true}if(value['replacemode']=="current"){replaceSel(value['string'],value['replacestring'],value['backwards']);value['replacemode']="none";}inst.selection.collapse(value['backwards']);if(tinyMCE.isMSIE){var rng=inst.selection.getRng();var flags=0;if(value['wholeword'])flags=flags|2;if(value['casesensitive'])flags=flags|4;if(!rng.findText){awin.alert('This operation is currently not supported by this browser.');return true}if(value['replacemode']=="all"){found=false;while(rng.findText(value['string'],value['backwards']?-1:1,flags)){found=true;rng.scrollIntoView();rng.select();replaceSel(value['string'],value['replacestring'],value['backwards'])}if(found)awin.alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));else awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true}if(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select()}else awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'))}else{if(value['replacemode']=="all"){found=false;while(win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false)){found=true;replaceSel(value['string'],value['replacestring'],value['backwards'])}if(found)awin.alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));else awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true}if(!win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))awin.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/media/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/media/tiny_mce/plugins/searchreplace/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..cd2f3a8
--- /dev/null
@@ -0,0 +1,173 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+tinyMCE.importPluginLanguagePack('searchreplace');\r
+\r
+var TinyMCE_SearchReplacePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Search/Replace',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function (inst) {\r
+               inst.addShortcut('ctrl', 'f', 'lang_searchreplace_search_desc', 'mceSearch', true);\r
+               // No CTRL+R for "replace" because browsers will reload page instead of executing plugin\r
+       },\r
+\r
+       getControlHTML : function (cn) {\r
+               switch (cn) {\r
+                       case "search" :\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_searchreplace_search_desc', '{$pluginurl}/images/search.gif','mceSearch', true);\r
+\r
+                       case "replace" :\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_searchreplace_replace_desc', '{$pluginurl}/images/replace.gif', 'mceSearchReplace', true);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function (editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), selectedText = inst.selection.getSelectedText(), rng;\r
+\r
+               function defValue(key, default_value) {\r
+                       value[key] = typeof(value[key]) == "undefined" ? default_value : value[key];\r
+               }\r
+\r
+               function replaceSel(search_str, str, back) {\r
+                       if (!inst.selection.isCollapsed()) {\r
+                               if (tinyMCE.isRealIE)\r
+                                       inst.selection.getRng().duplicate().pasteHTML(str); // Needs to be duplicated due to selection bug in IE\r
+                               else\r
+                                       inst.execCommand('mceInsertContent', false, str);\r
+                       }\r
+               }\r
+\r
+               if (!value)\r
+                       value = [];\r
+\r
+               defValue("editor_id", editor_id);\r
+               defValue("searchstring", selectedText);\r
+               defValue("replacestring", null);\r
+               defValue("replacemode", "none");\r
+               defValue("casesensitive", false);\r
+               defValue("backwards", false);\r
+               defValue("wrap", false);\r
+               defValue("wholeword", false);\r
+               defValue("inline", "yes");\r
+               defValue("resizable", "no");\r
+\r
+               switch (command) {\r
+                       case "mceSearch" :\r
+                               if (user_interface) {\r
+                                       var template = new Array();\r
+\r
+                                       template['file'] = '../../plugins/searchreplace/searchreplace.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 155 + (tinyMCE.isNS7 ? 20 : 0) + (tinyMCE.isMSIE ? 15 : 0);\r
+                                       template['width'] += tinyMCE.getLang('lang_searchreplace_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_searchreplace_delta_height', 0);\r
+\r
+                                       inst.selection.collapse(true);\r
+\r
+                                       tinyMCE.openWindow(template, value);\r
+                               } else {\r
+                                       var win = tinyMCE.getInstanceById(editor_id).contentWindow;\r
+                                       var doc = tinyMCE.getInstanceById(editor_id).contentWindow.document;\r
+                                       var body = tinyMCE.getInstanceById(editor_id).contentWindow.document.body;\r
+                                       var awin = value.win, found;\r
+\r
+                                       if (body.innerHTML == "") {\r
+                                               awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+                                               return true;\r
+                                       }\r
+\r
+                                       if (value['replacemode'] == "current") {\r
+                                               replaceSel(value['string'], value['replacestring'], value['backwards']);\r
+                                               value['replacemode'] = "none";\r
+                                               //tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value);\r
+                                               //return true;\r
+                                       }\r
+\r
+                                       inst.selection.collapse(value['backwards']);\r
+\r
+                                       if (tinyMCE.isMSIE) {\r
+                                               var rng = inst.selection.getRng();\r
+                                               var flags = 0;\r
+                                               if (value['wholeword'])\r
+                                                       flags = flags | 2;\r
+\r
+                                               if (value['casesensitive'])\r
+                                                       flags = flags | 4;\r
+\r
+                                               if (!rng.findText) {\r
+                                                       awin.alert('This operation is currently not supported by this browser.');\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               if (value['replacemode'] == "all") {\r
+                                                       found = false;\r
+\r
+                                                       while (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) {\r
+                                                               found = true;\r
+                                                               rng.scrollIntoView();\r
+                                                               rng.select();\r
+                                                               replaceSel(value['string'], value['replacestring'], value['backwards']);\r
+                                                       }\r
+\r
+                                                       if (found)\r
+                                                               awin.alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));\r
+                                                       else\r
+                                                               awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               if (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) {\r
+                                                       rng.scrollIntoView();\r
+                                                       rng.select();\r
+                                               } else\r
+                                                       awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+                                       } else {\r
+                                               if (value['replacemode'] == "all") {\r
+                                                       found = false;\r
+\r
+                                                       while (win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false)) {\r
+                                                               found = true;\r
+                                                               replaceSel(value['string'], value['replacestring'], value['backwards']);\r
+                                                       }\r
+\r
+                                                       if (found)\r
+                                                               awin.alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));\r
+                                                       else\r
+                                                               awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               if (!win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false))\r
+                                                       awin.alert(tinyMCE.getLang('lang_searchreplace_notfound'));\r
+                                       }\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceSearchReplace" :\r
+                               value['replacestring'] = "";\r
+                               tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false);\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("searchreplace", TinyMCE_SearchReplacePlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/searchreplace/images/replace.gif b/media/tiny_mce/plugins/searchreplace/images/replace.gif
new file mode 100755 (executable)
index 0000000..784c73e
Binary files /dev/null and b/media/tiny_mce/plugins/searchreplace/images/replace.gif differ
diff --git a/media/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif b/media/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif
new file mode 100755 (executable)
index 0000000..123fa5b
Binary files /dev/null and b/media/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif differ
diff --git a/media/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif b/media/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif
new file mode 100755 (executable)
index 0000000..cc2c56e
Binary files /dev/null and b/media/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif differ
diff --git a/media/tiny_mce/plugins/searchreplace/images/search.gif b/media/tiny_mce/plugins/searchreplace/images/search.gif
new file mode 100755 (executable)
index 0000000..cfe76b5
Binary files /dev/null and b/media/tiny_mce/plugins/searchreplace/images/search.gif differ
diff --git a/media/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js b/media/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js
new file mode 100755 (executable)
index 0000000..ac6cdf6
--- /dev/null
@@ -0,0 +1,86 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // start with appropiate tab\r
+       var task = (tinyMCE.getWindowArg("replacestring") != null) ? "replace" : "search";\r
+       mcTabs.displayTab(task + '_tab', task +'_panel');\r
+       manageReplaceButtons();\r
+       \r
+       var formObj = document.forms[0];\r
+\r
+       formObj[task + "_panel_searchstring"].value = tinyMCE.getWindowArg("searchstring");\r
+       formObj["replace_panel_replacestring"].value = (tinyMCE.getWindowArg("replacestring") != null) ? tinyMCE.getWindowArg("replacestring") : "";\r
+       formObj[task + "_panel_casesensitivebox"].checked = tinyMCE.getWindowArg("casesensitive");\r
+       formObj[task + "_panel_backwardsu"].checked = tinyMCE.getWindowArg("backwards");\r
+       formObj[task + "_panel_backwardsd"].checked = !tinyMCE.getWindowArg("backwards");\r
+}\r
+\r
+function searchNext(replacemode) {\r
+       // "search" or "replace" mode of operation?\r
+       var task = (document.getElementById("search_tab").className == "current") ? "search" : "replace";\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       if (task == "replace") {\r
+               // Whats the point?\r
+               if (formObj[task + "_panel_searchstring"].value == "" || formObj[task + "_panel_searchstring"].value == formObj[task + "_panel_replacestring"].value)\r
+                       return false;\r
+       }\r
+\r
+       // Do search\r
+       tinyMCEPopup.execCommand('mceSearch', false, { \r
+               string : formObj[task + "_panel_searchstring"].value,\r
+               replacestring : formObj["replace_panel_replacestring"].value,\r
+               replacemode : replacemode,\r
+               casesensitive : formObj[task + "_panel_casesensitivebox"].checked,\r
+               backwards : formObj[task + "_panel_backwardsu"].checked,\r
+               win : window\r
+               }, false);\r
+\r
+       window.focus();\r
+\r
+       return false;\r
+}\r
+\r
+function cancelAction() {\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function manageReplaceButtons() {\r
+       // "search" or "replace" mode of operation?\r
+       var task = (document.getElementById("search_tab").className == "current") ? "search" : "replace";\r
+       document.getElementById("replace_buttons").style.visibility = (task == "replace") ? "visible" : "hidden";\r
+}\r
+\r
+function copyValues(link) {\r
+       // check if tab is already active\r
+       var tab = link;\r
+       while (tab.tagName && tab.tagName.toLowerCase() != "li") tab = tab.parentNode;\r
+       if (tab.className) return false; // tab is already active -> no need to copy any values!\r
+\r
+       // copy values from one panel to the other (if they exist there)\r
+       var from_panel_name = tab.id.match(/^search/i) ? "replace_panel" : "search_panel";\r
+       var to_panel_name = (from_panel_name == "search_panel") ? "replace_panel" : "search_panel";\r
+\r
+       // find all elements with IDs to copy their values\r
+       var elms = document.getElementById(from_panel_name).getElementsByTagName("*");\r
+       for (var i = 0; i < elms.length; i++) {\r
+               if (elms[i].id && elms[i].id != "") {\r
+                       var checked = "undefined";\r
+                       if (elms[i].type.toLowerCase() == "checkbox" || elms[i].type.toLowerCase() == "radio")\r
+                               checked = elms[i].checked;\r
+\r
+                       // copy values if element exists in other panel\r
+                       var to_elm_name = to_panel_name + elms[i].id.substring(from_panel_name.length, elms[i].id.length);\r
+                       var to_elm = document.getElementById(to_elm_name);\r
+                       if (to_elm) {\r
+                               if (checked != "undefined")\r
+                                       to_elm.checked = checked;\r
+                               else\r
+                                       to_elm.value = elms[i].value;\r
+                       }\r
+               }\r
+       }\r
+\r
+       return false;\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/searchreplace/langs/en.js b/media/tiny_mce/plugins/searchreplace/langs/en.js
new file mode 100755 (executable)
index 0000000..32af828
--- /dev/null
@@ -0,0 +1,21 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+searchreplace_search_desc : 'Find',\r
+searchreplace_searchnext_desc : 'Find again',\r
+searchreplace_replace_desc : 'Find/Replace',\r
+searchreplace_notfound : 'The search has been completed. The search string could not be found.',\r
+searchreplace_search_title : 'Find',\r
+searchreplace_replace_title : 'Find/Replace',\r
+searchreplace_allreplaced : 'All occurrences of the search string were replaced.',\r
+searchreplace_findwhat : 'Find what',\r
+searchreplace_replacewith : 'Replace with',\r
+searchreplace_direction : 'Direction',\r
+searchreplace_up : 'Up',\r
+searchreplace_down : 'Down',\r
+searchreplace_case : 'Match case',\r
+searchreplace_findnext : 'Find&nbsp;next',\r
+searchreplace_replace : 'Replace',\r
+searchreplace_replaceall : 'Replace&nbsp;all',\r
+searchreplace_cancel : 'Cancel'\r
+});\r
diff --git a/media/tiny_mce/plugins/searchreplace/readme.txt b/media/tiny_mce/plugins/searchreplace/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/searchreplace/searchreplace.htm b/media/tiny_mce/plugins/searchreplace/searchreplace.htm
new file mode 100755 (executable)
index 0000000..192e0cb
--- /dev/null
@@ -0,0 +1,107 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_searchreplace_replace_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/searchreplace.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/searchreplace.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none; margin: 4px;">\r
+<form onsubmit="return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="search_tab"><span><a href="javascript:mcTabs.displayTab('search_tab','search_panel');manageReplaceButtons();" onmousedown="return copyValues(this);">{$lang_searchreplace_search_desc}</a></span></li>\r
+                       <li id="replace_tab"><span><a href="javascript:mcTabs.displayTab('replace_tab','replace_panel');manageReplaceButtons();" onmousedown="return copyValues(this);">{$lang_searchreplace_replace}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+\r
+               <div id="search_panel" class="panel">\r
+                       <table border="0" cellspacing="0" cellpadding="2">\r
+                               <tr>\r
+                                       <td><label for="search_panel_searchstring">{$lang_searchreplace_findwhat}</label></td>\r
+                                       <td><input type="text" id="search_panel_searchstring" name="search_panel_searchstring" style="width: 200px" /></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table border="0" cellspacing="0" cellpadding="0" class="direction">\r
+                                                       <tr>\r
+                                                               <td><label>{$lang_searchreplace_direction}</label></td>\r
+                                                               <td><input id="search_panel_backwardsu" name="search_panel_backwards" class="radio" type="radio" /></td>\r
+                                                               <td><label for="search_panel_backwardsu">{$lang_searchreplace_up}</label></td>\r
+                                                               <td><input id="search_panel_backwardsd" name="search_panel_backwards" class="radio" type="radio" /></td>\r
+                                                               <td><label for="search_panel_backwardsd">{$lang_searchreplace_down}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table border="0" cellspacing="0" cellpadding="0">\r
+                                                       <tr>\r
+                                                               <td><input id="search_panel_casesensitivebox" name="search_panel_casesensitivebox" class="checkbox" type="checkbox" /></td>\r
+                                                               <td><label for="search_panel_casesensitivebox">{$lang_searchreplace_case}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                       </table>\r
+               </div>\r
+\r
+               <div id="replace_panel" class="panel">\r
+                       <table border="0" cellspacing="0" cellpadding="2">\r
+                               <tr>\r
+                                       <td><label for="replace_panel_searchstring">{$lang_searchreplace_findwhat}</label></td>\r
+                                       <td><input type="text" id="replace_panel_searchstring" name="replace_panel_searchstring" style="width: 200px" /></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td><label for="replace_panel_replacestring">{$lang_searchreplace_replacewith}</label></td>\r
+                                       <td><input type="text" id="replace_panel_replacestring" name="replace_panel_replacestring" style="width: 200px" /></td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table border="0" cellspacing="0" cellpadding="0" class="direction">\r
+                                                       <tr>\r
+                                                               <td><label>{$lang_searchreplace_direction}</label></td>\r
+                                                               <td><input id="replace_panel_backwardsu" name="replace_panel_backwards" class="radio" type="radio" /></td>\r
+                                                               <td><label for="replace_panel_backwardsu">{$lang_searchreplace_up}</label></td>\r
+                                                               <td><input id="replace_panel_backwardsd" name="replace_panel_backwards" class="radio" type="radio" /></td>\r
+                                                               <td><label for="replace_panel_backwardsd">{$lang_searchreplace_down}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                               <tr>\r
+                                       <td colspan="2">\r
+                                               <table border="0" cellspacing="0" cellpadding="0">\r
+                                                       <tr>\r
+                                                               <td><input id="replace_panel_casesensitivebox" name="replace_panel_casesensitivebox" class="checkbox" type="checkbox" /></td>\r
+                                                               <td><label for="replace_panel_casesensitivebox">{$lang_searchreplace_case}</label></td>\r
+                                                       </tr>\r
+                                               </table>\r
+                                       </td>\r
+                               </tr>\r
+                       </table>\r
+               </div>\r
+\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_searchreplace_findnext}" onclick="searchNext('none');" />\r
+                       <span id="replace_buttons">\r
+                               <input type="button" id="replaceBtn" name="replaceBtn" value="{$lang_searchreplace_replace}" onclick="searchNext('current');" />\r
+                               <input type="button" id="replaceAllBtn" name="replaceAllBtn" value="{$lang_searchreplace_replaceall}" onclick="searchNext('all');;" />\r
+                       </span>\r
+               </div>\r
+\r
+               <div style="float: right">      \r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_searchreplace_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/style/css/props.css b/media/tiny_mce/plugins/style/css/props.css
new file mode 100755 (executable)
index 0000000..b159b5f
--- /dev/null
@@ -0,0 +1,62 @@
+#text_font {\r
+       width: 250px;\r
+}\r
+\r
+#text_size {\r
+       width: 70px;\r
+}\r
+\r
+.mceAddSelectValue {\r
+       background-color: #DDDDDD;\r
+}\r
+\r
+select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {\r
+       width: 70px;\r
+}\r
+\r
+#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {\r
+       width: 70px;\r
+}\r
+\r
+#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {\r
+       width: 70px;\r
+}\r
+\r
+#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {\r
+       width: 70px;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       padding-top: 10px;\r
+       height: 230px;\r
+}\r
+\r
+.delim {\r
+       border-left: 1px solid gray;\r
+}\r
+\r
+.tdelim {\r
+       border-bottom: 1px solid gray;  \r
+}\r
+\r
+#block_display {\r
+       width: 145px;\r
+}\r
+\r
+#list_type {\r
+       width: 115px;\r
+}\r
+\r
+.disabled {\r
+       background-color: #EEEEEE;\r
+}\r
+\r
+#apply {\r
+       font-weight: bold;\r
+       width: 78px;\r
+       height: 21px;\r
+       border: 0;\r
+       background-image: url('../images/apply_button_bg.gif');\r
+       cursor: pointer;\r
+}\r
+\r
diff --git a/media/tiny_mce/plugins/style/editor_plugin.js b/media/tiny_mce/plugins/style/editor_plugin.js
new file mode 100755 (executable)
index 0000000..89f5b07
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style',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){if(node.nodeName=='BODY')tinyMCE.switchClass(editor_id+'_styleprops','mceButtonDisabled');else tinyMCE.switchClass(editor_id+'_styleprops','mceButtonNormal')},_styleProps:function(){var e=tinyMCE.selectedInstance.selection.getFocusElement();if(!e||e.nodeName=='BODY')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/media/tiny_mce/plugins/style/editor_plugin_src.js b/media/tiny_mce/plugins/style/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..4fa8aaa
--- /dev/null
@@ -0,0 +1,83 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('style');\r
+\r
+var TinyMCE_StylePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Style',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "styleprops":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_style_styleinfo_desc', '{$pluginurl}/images/styleprops.gif', 'mceStyleProps', true);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               var e, inst;\r
+\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceStyleProps":\r
+                               TinyMCE_StylePlugin._styleProps();\r
+                               return true;\r
+\r
+                       case "mceSetElementStyle":\r
+                               inst = tinyMCE.getInstanceById(editor_id);\r
+                               e = inst.selection.getFocusElement();\r
+\r
+                               if (e) {\r
+                                       e.style.cssText = value;\r
+                                       inst.repaint();\r
+                               }\r
+\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               if (node.nodeName == 'BODY')\r
+                       tinyMCE.switchClass(editor_id + '_styleprops', 'mceButtonDisabled');\r
+               else\r
+                       tinyMCE.switchClass(editor_id + '_styleprops', 'mceButtonNormal');\r
+       },\r
+\r
+       // Private plugin specific methods\r
+\r
+       _styleProps : function() {\r
+               var e = tinyMCE.selectedInstance.selection.getFocusElement();\r
+\r
+               if (!e || e.nodeName == 'BODY')\r
+                       return;\r
+\r
+               tinyMCE.openWindow({\r
+                       file : '../../plugins/style/props.htm',\r
+                       width : 480 + tinyMCE.getLang('lang_style_props_delta_width', 0),\r
+                       height : 320 + tinyMCE.getLang('lang_style_props_delta_height', 0)\r
+               }, {\r
+                       editor_id : tinyMCE.selectedInstance.editorId,\r
+                       inline : "yes",\r
+                       style_text : e.style.cssText\r
+               });\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("style", TinyMCE_StylePlugin);\r
diff --git a/media/tiny_mce/plugins/style/images/apply_button_bg.gif b/media/tiny_mce/plugins/style/images/apply_button_bg.gif
new file mode 100755 (executable)
index 0000000..979e868
Binary files /dev/null and b/media/tiny_mce/plugins/style/images/apply_button_bg.gif differ
diff --git a/media/tiny_mce/plugins/style/images/style_info.gif b/media/tiny_mce/plugins/style/images/style_info.gif
new file mode 100755 (executable)
index 0000000..41f2271
Binary files /dev/null and b/media/tiny_mce/plugins/style/images/style_info.gif differ
diff --git a/media/tiny_mce/plugins/style/images/styleprops.gif b/media/tiny_mce/plugins/style/images/styleprops.gif
new file mode 100755 (executable)
index 0000000..41f2271
Binary files /dev/null and b/media/tiny_mce/plugins/style/images/styleprops.gif differ
diff --git a/media/tiny_mce/plugins/style/jscripts/props.js b/media/tiny_mce/plugins/style/jscripts/props.js
new file mode 100755 (executable)
index 0000000..c9883d7
--- /dev/null
@@ -0,0 +1,633 @@
+var defaultFonts = "" + \r
+       "Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + \r
+       "Times New Roman, Times, serif=Times New Roman, Times, serif;" + \r
+       "Courier New, Courier, mono=Courier New, Courier, mono;" + \r
+       "Times New Roman, Times, serif=Times New Roman, Times, serif;" + \r
+       "Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + \r
+       "Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + \r
+       "Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif";\r
+\r
+var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger";\r
+var defaultMeasurement = "+pixels=px;points=pt;in;cm;mm;picas;ems;exs;%";\r
+var defaultSpacingMeasurement = "pixels=px;points=pt;in;cm;mm;picas;+ems;exs;%";\r
+var defaultIndentMeasurement = "pixels=px;+points=pt;in;cm;mm;picas;ems;exs;%";\r
+var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900";\r
+var defaultTextStyle = "normal;italic;oblique";\r
+var defaultVariant = "normal;small-caps";\r
+var defaultLineHeight = "normal";\r
+var defaultAttachment = "fixed;scroll";\r
+var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y";\r
+var defaultPosH = "left;center;right";\r
+var defaultPosV = "top;center;bottom";\r
+var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom";\r
+var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none";\r
+var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset";\r
+var defaultBorderWidth = "thin;medium;thick";\r
+var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none";\r
+\r
+function init() {\r
+       var ce = document.getElementById('container'), h;\r
+\r
+       ce.style.cssText = tinyMCEPopup.getWindowArg('style_text');\r
+\r
+       h = getBrowserHTML('background_image_browser','background_image','image','advimage');\r
+       document.getElementById("background_image_browser").innerHTML = h;\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color');\r
+       document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color');\r
+       document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top');\r
+       document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right');\r
+       document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom');\r
+       document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left');\r
+\r
+       fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true);\r
+       fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true);\r
+       fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true);\r
+       fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true);\r
+       fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true);\r
+       fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true);\r
+       fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true);\r
+       fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true);\r
+       fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true);\r
+\r
+       fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true);\r
+       fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true);\r
+\r
+       fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true);\r
+       fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true);\r
+       fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true);\r
+       fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true);\r
+       fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true);\r
+       fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true);\r
+       fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true);\r
+       fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true);\r
+       fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true);\r
+       fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true);\r
+       fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true);\r
+       fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true);\r
+       fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true);\r
+       fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true);\r
+\r
+       fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true);\r
+       fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true);\r
+       fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true);\r
+       fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true);\r
+\r
+       fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true);\r
+       fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true);\r
+\r
+       fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true);\r
+       fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true);\r
+\r
+       fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true);\r
+\r
+       fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true);\r
+\r
+       fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true);\r
+       fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true);\r
+\r
+       TinyMCE_EditableSelects.init();\r
+       setupFormData();\r
+       showDisabledControls();\r
+}\r
+\r
+function setupFormData() {\r
+       var ce = document.getElementById('container'), f = document.forms[0], s, b, i;\r
+\r
+       // Setup text fields\r
+\r
+       selectByValue(f, 'text_font', ce.style.fontFamily, true, true);\r
+       selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true);\r
+       selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize));\r
+       selectByValue(f, 'text_weight', ce.style.fontWeight, true, true);\r
+       selectByValue(f, 'text_style', ce.style.fontStyle, true, true);\r
+       selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true);\r
+       selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight));\r
+       selectByValue(f, 'text_case', ce.style.textTransform, true, true);\r
+       selectByValue(f, 'text_variant', ce.style.fontVariant, true, true);\r
+       f.text_color.value = ce.style.color;\r
+       updateColor('text_color_pick', 'text_color');\r
+       f.text_underline.checked = inStr(ce.style.textDecoration, 'underline');\r
+       f.text_overline.checked = inStr(ce.style.textDecoration, 'overline');\r
+       f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through');\r
+       f.text_blink.checked = inStr(ce.style.textDecoration, 'blink');\r
+\r
+       // Setup background fields\r
+\r
+       f.background_color.value = ce.style.backgroundColor;\r
+       updateColor('background_color_pick', 'background_color');\r
+       f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true);\r
+       selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true);\r
+       selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true);\r
+       selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0)));\r
+       selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true);\r
+       selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1)));\r
+\r
+       // Setup block fields\r
+\r
+       selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true);\r
+       selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing));\r
+       selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true);\r
+       selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing));\r
+       selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true);\r
+       selectByValue(f, 'block_text_align', ce.style.textAlign, true, true);\r
+       f.block_text_indent.value = getNum(ce.style.textIndent);\r
+       selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent));\r
+       selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true);\r
+       selectByValue(f, 'block_display', ce.style.display, true, true);\r
+\r
+       // Setup box fields\r
+\r
+       f.box_width.value = getNum(ce.style.width);\r
+       selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width));\r
+\r
+       f.box_height.value = getNum(ce.style.height);\r
+       selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height));\r
+\r
+       if (tinyMCE.isGecko)\r
+               selectByValue(f, 'box_float', ce.style.cssFloat, true, true);\r
+       else\r
+               selectByValue(f, 'box_float', ce.style.styleFloat, true, true);\r
+\r
+       selectByValue(f, 'box_clear', ce.style.clear, true, true);\r
+\r
+       setupBox(f, ce, 'box_padding', 'padding', '');\r
+       setupBox(f, ce, 'box_margin', 'margin', '');\r
+\r
+       // Setup border fields\r
+\r
+       setupBox(f, ce, 'border_style', 'border', 'Style');\r
+       setupBox(f, ce, 'border_width', 'border', 'Width');\r
+       setupBox(f, ce, 'border_color', 'border', 'Color');\r
+\r
+       updateColor('border_color_top_pick', 'border_color_top');\r
+       updateColor('border_color_right_pick', 'border_color_right');\r
+       updateColor('border_color_bottom_pick', 'border_color_bottom');\r
+       updateColor('border_color_left_pick', 'border_color_left');\r
+\r
+       // Setup list fields\r
+\r
+       selectByValue(f, 'list_type', ce.style.listStyleType, true, true);\r
+       selectByValue(f, 'list_position', ce.style.listStylePosition, true, true);\r
+       f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+\r
+       // Setup box fields\r
+\r
+       selectByValue(f, 'positioning_type', ce.style.position, true, true);\r
+       selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true);\r
+       selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true);\r
+       f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : "";\r
+\r
+       f.positioning_width.value = getNum(ce.style.width);\r
+       selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width));\r
+\r
+       f.positioning_height.value = getNum(ce.style.height);\r
+       selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height));\r
+\r
+       setupBox(f, ce, 'positioning_placement', '', '', new Array('top', 'right', 'bottom', 'left'));\r
+\r
+       s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       s = s.replace(/,/g, ' ');\r
+\r
+       if (!hasEqualValues(new Array(getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)))) {\r
+               f.positioning_clip_top.value = getNum(getVal(s, 0));\r
+               selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));\r
+               f.positioning_clip_right.value = getNum(getVal(s, 1));\r
+               selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1)));\r
+               f.positioning_clip_bottom.value = getNum(getVal(s, 2));\r
+               selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2)));\r
+               f.positioning_clip_left.value = getNum(getVal(s, 3));\r
+               selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3)));\r
+       } else {\r
+               f.positioning_clip_top.value = getNum(getVal(s, 0));\r
+               selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));\r
+               f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value;\r
+       }\r
+\r
+//     setupBox(f, ce, '', 'border', 'Color');\r
+}\r
+\r
+function getMeasurement(s) {\r
+       return s.replace(/^([0-9]+)(.*)$/, "$2");\r
+}\r
+\r
+function getNum(s) {\r
+       if (new RegExp('^[0-9]+[a-z%]+$', 'gi').test(s))\r
+               return s.replace(/[^0-9]/g, '');\r
+\r
+       return s;\r
+}\r
+\r
+function inStr(s, n) {\r
+       return new RegExp(n, 'gi').test(s);\r
+}\r
+\r
+function getVal(s, i) {\r
+       var a = tinyMCE.explode(' ', s);\r
+\r
+       if (a.length > 1)\r
+               return a[i];\r
+\r
+       return "";\r
+}\r
+\r
+function setValue(f, n, v) {\r
+       if (f.elements[n].type == "text")\r
+               f.elements[n].value = v;\r
+       else\r
+               selectByValue(f, n, v, true, true);\r
+}\r
+\r
+function setupBox(f, ce, fp, pr, sf, b) {\r
+       if (typeof(b) == "undefined")\r
+               b = new Array('Top', 'Right', 'Bottom', 'Left');\r
+\r
+       if (isSame(ce, pr, sf, b)) {\r
+               f.elements[fp + "_same"].checked = true;\r
+\r
+               setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));\r
+               f.elements[fp + "_top"].disabled = false;\r
+\r
+               f.elements[fp + "_right"].value = "";\r
+               f.elements[fp + "_right"].disabled = true;\r
+               f.elements[fp + "_bottom"].value = "";\r
+               f.elements[fp + "_bottom"].disabled = true;\r
+               f.elements[fp + "_left"].value = "";\r
+               f.elements[fp + "_left"].disabled = true;\r
+\r
+               if (f.elements[fp + "_top_measurement"]) {\r
+                       selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));\r
+                       f.elements[fp + "_left_measurement"].disabled = true;\r
+                       f.elements[fp + "_bottom_measurement"].disabled = true;\r
+                       f.elements[fp + "_right_measurement"].disabled = true;\r
+               }\r
+       } else {\r
+               f.elements[fp + "_same"].checked = false;\r
+\r
+               setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));\r
+               f.elements[fp + "_top"].disabled = false;\r
+\r
+               setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf]));\r
+               f.elements[fp + "_right"].disabled = false;\r
+\r
+               setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf]));\r
+               f.elements[fp + "_bottom"].disabled = false;\r
+\r
+               setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf]));\r
+               f.elements[fp + "_left"].disabled = false;\r
+\r
+               if (f.elements[fp + "_top_measurement"]) {\r
+                       selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));\r
+                       selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf]));\r
+                       selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf]));\r
+                       selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf]));\r
+                       f.elements[fp + "_left_measurement"].disabled = false;\r
+                       f.elements[fp + "_bottom_measurement"].disabled = false;\r
+                       f.elements[fp + "_right_measurement"].disabled = false;\r
+               }\r
+       }\r
+}\r
+\r
+function isSame(e, pr, sf, b) {\r
+       var a = new Array(), i, x;\r
+\r
+       if (typeof(b) == "undefined")\r
+               b = new Array('Top', 'Right', 'Bottom', 'Left');\r
+\r
+       if (typeof(sf) == "undefined" || sf == null)\r
+               sf = "";\r
+\r
+       a[0] = e.style[pr + b[0] + sf];\r
+       a[1] = e.style[pr + b[1] + sf];\r
+       a[2] = e.style[pr + b[2] + sf];\r
+       a[3] = e.style[pr + b[3] + sf];\r
+\r
+       for (i=0; i<a.length; i++) {\r
+               if (a[i] == null)\r
+                       return false;\r
+\r
+               for (x=0; x<a.length; x++) {\r
+                       if (a[x] != a[i])\r
+                               return false;\r
+               }\r
+       }\r
+\r
+       return true;\r
+};\r
+\r
+function hasEqualValues(a) {\r
+       var i, x;\r
+\r
+       for (i=0; i<a.length; i++) {\r
+               if (a[i] == null)\r
+                       return false;\r
+\r
+               for (x=0; x<a.length; x++) {\r
+                       if (a[x] != a[i])\r
+                               return false;\r
+               }\r
+       }\r
+\r
+       return true;\r
+}\r
+\r
+function applyAction() {\r
+       var ce = document.getElementById('container');\r
+\r
+       generateCSS();\r
+\r
+       tinyMCEPopup.execCommand('mceSetElementStyle', false, tinyMCE.serializeStyle(tinyMCE.parseStyle(ce.style.cssText)));\r
+}\r
+\r
+function updateAction() {\r
+       applyAction();\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function generateCSS() {\r
+       var ce = document.getElementById('container'), f = document.forms[0], num = new RegExp('[0-9]+', 'g'), s, t;\r
+\r
+       ce.style.cssText = "";\r
+\r
+       // Build text styles\r
+       ce.style.fontFamily = f.text_font.value;\r
+       ce.style.fontSize = f.text_size.value + (isNum(f.text_size.value) ? f.text_size_measurement.value : "");\r
+       ce.style.fontStyle = f.text_style.value;\r
+       ce.style.lineHeight = f.text_lineheight.value + (isNum(f.text_lineheight.value) ? f.text_lineheight_measurement.value : "");\r
+       ce.style.textTransform = f.text_case.value;\r
+       ce.style.fontWeight = f.text_weight.value;\r
+       ce.style.fontVariant = f.text_variant.value;\r
+       ce.style.color = f.text_color.value;\r
+\r
+       s = "";\r
+       s += f.text_underline.checked ? " underline" : "";\r
+       s += f.text_overline.checked ? " overline" : "";\r
+       s += f.text_linethrough.checked ? " line-through" : "";\r
+       s += f.text_blink.checked ? " blink" : "";\r
+       s = s.length > 0 ? s.substring(1) : s;\r
+\r
+       if (f.text_none.checked)\r
+               s = "none";\r
+\r
+       ce.style.textDecoration = s;\r
+\r
+       // Build background styles\r
+\r
+       ce.style.backgroundColor = f.background_color.value;\r
+       ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : "";\r
+       ce.style.backgroundRepeat = f.background_repeat.value;\r
+       ce.style.backgroundAttachment = f.background_attachment.value;\r
+\r
+       if (f.background_hpos.value != "") {\r
+               s = "";\r
+               s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " ";\r
+               s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : "");\r
+               ce.style.backgroundPosition = s;\r
+       }\r
+\r
+       // Build block styles\r
+\r
+       ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : "");\r
+       ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : "");\r
+       ce.style.verticalAlign = f.block_vertical_alignment.value;\r
+       ce.style.textAlign = f.block_text_align.value;\r
+       ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : "");\r
+       ce.style.whiteSpace = f.block_whitespace.value;\r
+       ce.style.display = f.block_display.value;\r
+\r
+       // Build box styles\r
+\r
+       ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : "");\r
+       ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : "");\r
+       ce.style.styleFloat = f.box_float.value;\r
+\r
+       if (tinyMCE.isGecko)\r
+               ce.style.cssFloat = f.box_float.value;\r
+\r
+       ce.style.clear = f.box_clear.value;\r
+\r
+       if (!f.box_padding_same.checked) {\r
+               ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");\r
+               ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : "");\r
+               ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : "");\r
+               ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : "");\r
+       } else\r
+               ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");               \r
+\r
+       if (!f.box_margin_same.checked) {\r
+               ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");\r
+               ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : "");\r
+               ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : "");\r
+               ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : "");\r
+       } else\r
+               ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");           \r
+\r
+       // Build border styles\r
+\r
+       if (!f.border_style_same.checked) {\r
+               ce.style.borderTopStyle = f.border_style_top.value;\r
+               ce.style.borderRightStyle = f.border_style_right.value;\r
+               ce.style.borderBottomStyle = f.border_style_bottom.value;\r
+               ce.style.borderLeftStyle = f.border_style_left.value;\r
+       } else\r
+               ce.style.borderStyle = f.border_style_top.value;\r
+\r
+       if (!f.border_width_same.checked) {\r
+               ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : "");\r
+               ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : "");\r
+               ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : "");\r
+               ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : "");\r
+       } else\r
+               ce.style.borderWidth = f.border_width_top.value;\r
+\r
+       if (!f.border_color_same.checked) {\r
+               ce.style.borderTopColor = f.border_color_top.value;\r
+               ce.style.borderRightColor = f.border_color_right.value;\r
+               ce.style.borderBottomColor = f.border_color_bottom.value;\r
+               ce.style.borderLeftColor = f.border_color_left.value;\r
+       } else\r
+               ce.style.borderColor = f.border_color_top.value;\r
+\r
+       // Build list styles\r
+\r
+       ce.style.listStyleType = f.list_type.value;\r
+       ce.style.listStylePosition = f.list_position.value;\r
+       ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : "";\r
+\r
+       // Build positioning styles\r
+\r
+       ce.style.position = f.positioning_type.value;\r
+       ce.style.visibility = f.positioning_visibility.value;\r
+\r
+       if (ce.style.width == "")\r
+               ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : "");\r
+\r
+       if (ce.style.height == "")\r
+               ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : "");\r
+\r
+       ce.style.zIndex = f.positioning_zindex.value;\r
+       ce.style.overflow = f.positioning_overflow.value;\r
+\r
+       if (!f.positioning_placement_same.checked) {\r
+               ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");\r
+               ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : "");\r
+               ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : "");\r
+               ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : "");\r
+       } else {\r
+               s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");\r
+               ce.style.top = s;\r
+               ce.style.right = s;\r
+               ce.style.bottom = s;\r
+               ce.style.left = s;\r
+       }\r
+\r
+       if (!f.positioning_clip_same.checked) {\r
+               s = "rect(";\r
+               s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " ";\r
+               s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " ";\r
+               s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " ";\r
+               s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto");\r
+               s += ")";\r
+\r
+               if (s != "rect(auto auto auto auto)")\r
+                       ce.style.clip = s;\r
+       } else {\r
+               s = "rect(";\r
+               t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto";\r
+               s += t + " ";\r
+               s += t + " ";\r
+               s += t + " ";\r
+               s += t + ")";\r
+\r
+               if (s != "rect(auto auto auto auto)")\r
+                       ce.style.clip = s;\r
+       }\r
+\r
+       ce.style.cssText = tinyMCE.serializeStyle(tinyMCE.parseStyle(ce.style.cssText));\r
+}\r
+\r
+function isNum(s) {\r
+       return new RegExp('[0-9]+', 'g').test(s);\r
+}\r
+\r
+function showDisabledControls() {\r
+       var f = document.forms, i, a;\r
+\r
+       for (i=0; i<f.length; i++) {\r
+               for (a=0; a<f[i].elements.length; a++) {\r
+                       if (f[i].elements[a].disabled)\r
+                               tinyMCE.addCSSClass(f[i].elements[a], "disabled");\r
+                       else\r
+                               tinyMCE.removeCSSClass(f[i].elements[a], "disabled");\r
+               }\r
+       }\r
+}\r
+\r
+function fillSelect(f, s, param, dval, sep, em) {\r
+       var i, ar, p, se;\r
+\r
+       f = document.forms[f];\r
+       sep = typeof(sep) == "undefined" ? ";" : sep;\r
+\r
+       if (em)\r
+               addSelectValue(f, s, "", "");\r
+\r
+       ar = tinyMCE.getParam(param, dval).split(sep);\r
+       for (i=0; i<ar.length; i++) {\r
+               se = false;\r
+\r
+               if (ar[i].charAt(0) == '+') {\r
+                       ar[i] = ar[i].substring(1);\r
+                       se = true;\r
+               }\r
+\r
+               p = ar[i].split('=');\r
+\r
+               if (p.length > 1) {\r
+                       addSelectValue(f, s, p[0], p[1]);\r
+\r
+                       if (se)\r
+                               selectByValue(f, s, p[1]);\r
+               } else {\r
+                       addSelectValue(f, s, p[0], p[0]);\r
+\r
+                       if (se)\r
+                               selectByValue(f, s, p[0]);\r
+               }\r
+       }\r
+}\r
+\r
+function toggleSame(ce, pre) {\r
+       var el = document.forms[0].elements, i;\r
+\r
+       if (ce.checked) {\r
+               el[pre + "_top"].disabled = false;\r
+               el[pre + "_right"].disabled = true;\r
+               el[pre + "_bottom"].disabled = true;\r
+               el[pre + "_left"].disabled = true;\r
+\r
+               if (el[pre + "_top_measurement"]) {\r
+                       el[pre + "_top_measurement"].disabled = false;\r
+                       el[pre + "_right_measurement"].disabled = true;\r
+                       el[pre + "_bottom_measurement"].disabled = true;\r
+                       el[pre + "_left_measurement"].disabled = true;\r
+               }\r
+       } else {\r
+               el[pre + "_top"].disabled = false;\r
+               el[pre + "_right"].disabled = false;\r
+               el[pre + "_bottom"].disabled = false;\r
+               el[pre + "_left"].disabled = false;\r
+\r
+               if (el[pre + "_top_measurement"]) {\r
+                       el[pre + "_top_measurement"].disabled = false;\r
+                       el[pre + "_right_measurement"].disabled = false;\r
+                       el[pre + "_bottom_measurement"].disabled = false;\r
+                       el[pre + "_left_measurement"].disabled = false;\r
+               }\r
+       }\r
+\r
+       showDisabledControls();\r
+}\r
+\r
+function synch(fr, to) {\r
+       var f = document.forms[0];\r
+\r
+       f.elements[to].value = f.elements[fr].value;\r
+\r
+       if (f.elements[fr + "_measurement"])\r
+               selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value);\r
+}\r
diff --git a/media/tiny_mce/plugins/style/langs/en.js b/media/tiny_mce/plugins/style/langs/en.js
new file mode 100755 (executable)
index 0000000..6bed70f
--- /dev/null
@@ -0,0 +1,66 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('style',{\r
+title : 'Edit CSS Style',\r
+styleinfo_desc : 'Edit CSS Style',\r
+apply : 'Apply',\r
+text_tab : 'Text',\r
+background_tab : 'Background',\r
+block_tab : 'Block',\r
+box_tab : 'Box',\r
+border_tab : 'Border',\r
+list_tab : 'List',\r
+positioning_tab : 'Positioning',\r
+text_props : 'Text',\r
+text_font : 'Font',\r
+text_size : 'Size',\r
+text_weight : 'Weight',\r
+text_style : 'Style',\r
+text_variant : 'Variant',\r
+text_lineheight : 'Line height',\r
+text_case : 'Case',\r
+text_color : 'Color',\r
+text_decoration : 'Decoration',\r
+text_overline : 'overline',\r
+text_underline : 'underline',\r
+text_striketrough : 'strikethrough',\r
+text_blink : 'blink',\r
+text_none : 'none',\r
+background_color : 'Background color',\r
+background_image : 'Background image',\r
+background_repeat : 'Repeat',\r
+background_attachment : 'Attachment',\r
+background_hpos : 'Horizontal position',\r
+background_vpos : 'Vertical position',\r
+block_wordspacing : 'Word spacing',\r
+block_letterspacing : 'Letter spacing',\r
+block_vertical_alignment : 'Vertical alignment',\r
+block_text_align : 'Text align',\r
+block_text_indent : 'Text indent',\r
+block_whitespace : 'Whitespace',\r
+block_display : 'Display',\r
+box_width : 'Width',\r
+box_height : 'Height',\r
+box_float : 'Float',\r
+box_clear : 'Clear',\r
+padding : 'Padding',\r
+same : 'Same for all',\r
+top : 'Top',\r
+right : 'Right',\r
+bottom : 'Bottom',\r
+left : 'Left',\r
+margin : 'Margin',\r
+style : 'Style',\r
+width : 'Width',\r
+height : 'Height',\r
+color : 'Color',\r
+list_type : 'Type',\r
+bullet_image : 'Bullet image',\r
+position : 'Position',\r
+positioning_type : 'Type',\r
+visibility : 'Visibility',\r
+zindex : 'Z-index',\r
+overflow : 'Overflow',\r
+placement : 'Placement',\r
+clip : 'Clip'\r
+});\r
diff --git a/media/tiny_mce/plugins/style/props.htm b/media/tiny_mce/plugins/style/props.htm
new file mode 100755 (executable)
index 0000000..8bbd3db
--- /dev/null
@@ -0,0 +1,729 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+       <title>{$lang_style_title}</title>
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>
+       <script language="javascript" type="text/javascript" src="../../utils/editable_selects.js"></script>
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>
+       <script language="javascript" type="text/javascript" src="jscripts/props.js"></script>
+       <link href="css/props.css" rel="stylesheet" type="text/css" />
+       <base target="_self" />
+</head>
+
+<body id="styleprops" onLoad="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+<form onSubmit="updateAction();return false;" action="#">
+<div class="tabs">
+       <ul>
+               <li id="text_tab" class="current"><span><a href="javascript:mcTabs.displayTab('text_tab','text_panel');" onMouseDown="return false;">{$lang_style_text_tab}</a></span></li>
+               <li id="background_tab"><span><a href="javascript:mcTabs.displayTab('background_tab','background_panel');" onMouseDown="return false;">{$lang_style_background_tab}</a></span></li>
+               <li id="block_tab"><span><a href="javascript:mcTabs.displayTab('block_tab','block_panel');" onMouseDown="return false;">{$lang_style_block_tab}</a></span></li>
+               <li id="box_tab"><span><a href="javascript:mcTabs.displayTab('box_tab','box_panel');" onMouseDown="return false;">{$lang_style_box_tab}</a></span></li>
+               <li id="border_tab"><span><a href="javascript:mcTabs.displayTab('border_tab','border_panel');" onMouseDown="return false;">{$lang_style_border_tab}</a></span></li>
+               <li id="list_tab"><span><a href="javascript:mcTabs.displayTab('list_tab','list_panel');" onMouseDown="return false;">{$lang_style_list_tab}</a></span></li>
+               <li id="positioning_tab"><span><a href="javascript:mcTabs.displayTab('positioning_tab','positioning_panel');" onMouseDown="return false;">{$lang_style_positioning_tab}</a></span></li>
+       </ul>
+</div>
+
+<div class="panel_wrapper">
+<div id="text_panel" class="panel current">
+       <table border="0" width="100%">
+               <tr>
+                       <td><label for="text_font">{$lang_style_text_font}</label></td>
+                       <td colspan="3">
+                               <select id="text_font" name="text_font" class="mceEditableSelect" onChange="alert(this.options[this.selectedIndex].value);"></select>
+                       </td>
+               </tr>
+               <tr>
+                       <td><label for="text_size">{$lang_style_text_size}</label></td>
+                       <td>
+                               <table border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><select id="text_size" name="text_size" class="mceEditableSelect"></select></td>
+                                               <td>&nbsp;</td>
+      <td><select id="text_size_measurement" name="text_size_measurement"></select></td>
+                                       </tr>
+                               </table>
+                       </td>
+                       <td><label for="text_weight">{$lang_style_text_weight}</label></td>
+                       <td>
+                               <select id="text_weight" name="text_weight"></select>
+                       </td>
+               </tr>
+               <tr>
+                       <td><label for="text_style">{$lang_style_text_style}</label></td>
+                       <td>
+                               <select id="text_style" name="text_style" class="mceEditableSelect"></select>
+                       </td>
+                       <td><label for="text_variant">{$lang_style_text_variant}</label></td>
+                       <td>
+                               <select id="text_variant" name="text_variant"></select>
+                       </td>
+               </tr>
+               <tr>
+                       <td><label for="text_lineheight">{$lang_style_text_lineheight}</label></td>
+                       <td>
+                               <table border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td>
+                                                       <select id="text_lineheight" name="text_lineheight" class="mceEditableSelect"></select>
+                                               </td>
+                                               <td>&nbsp;</td>
+      <td><select id="text_lineheight_measurement" name="text_lineheight_measurement"></select></td>
+                                       </tr>
+                               </table>
+                       </td>
+                       <td><label for="text_case">{$lang_style_text_case}</label></td>
+                       <td>
+                               <select id="text_case" name="text_case"></select>
+                       </td>
+               </tr>
+               <tr>
+                       <td><label for="text_color">{$lang_style_text_color}</label></td>
+                       <td colspan="2">
+                               <table border="0" cellpadding="0" cellspacing="0">
+                                       <tr>
+                                               <td><input id="text_color" name="text_color" type="text" value="" size="9" onChange="updateColor('text_color_pick','text_color');" /></td>
+                                               <td id="text_color_pickcontainer">&nbsp;</td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+               <tr>
+                       <td valign="top" style="vertical-align: top; padding-top: 3px;">{$lang_style_text_decoration}</td>
+                       <td colspan="2">
+                               <table border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><input id="text_underline" name="text_underline" class="checkbox" type="checkbox" /></td>
+                                               <td><label for="text_underline">{$lang_style_text_underline}</label></td>
+                                       </tr>
+                                       <tr>
+                                               <td><input id="text_overline" name="text_overline" class="checkbox" type="checkbox" /></td>
+                                               <td><label for="text_overline">{$lang_style_text_overline}</label></td>
+                                       </tr>
+                                       <tr>
+                                               <td><input id="text_linethrough" name="text_linethrough" class="checkbox" type="checkbox" /></td>
+                                               <td><label for="text_linethrough">{$lang_style_text_striketrough}</label></td>
+                                       </tr>
+                                       <tr>
+                                               <td><input id="text_blink" name="text_blink" class="checkbox" type="checkbox" /></td>
+                                               <td><label for="text_blink">{$lang_style_text_blink}</label></td>
+                                       </tr>
+                                       <tr>
+                                               <td><input id="text_none" name="text_none" class="checkbox" type="checkbox" /></td>
+                                               <td><label for="text_none">{$lang_style_text_none}</label></td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+       </table>
+</div>
+
+<div id="background_panel" class="panel">
+       <table border="0">
+               <tr>
+                       <td><label for="background_color">{$lang_style_background_color}</label></td>
+                       <td>
+                               <table border="0" cellpadding="0" cellspacing="0">
+                                       <tr>
+                                               <td><input id="background_color" name="background_color" type="text" value="" size="9" onChange="updateColor('background_color_pick','background_color');" /></td>
+                                               <td id="background_color_pickcontainer">&nbsp;</td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+
+               <tr>
+                       <td><label for="background_image">{$lang_style_background_image}</label></td>
+                       <td><table border="0" cellspacing="0" cellpadding="0">
+                               <tr> 
+                                 <td><input id="background_image" name="background_image" type="text" /></td> 
+                                 <td id="background_image_browser">&nbsp;</td>
+                               </tr>
+                               </table>
+                       </td>
+               </tr>
+
+               <tr>
+                       <td><label for="background_repeat">{$lang_style_background_repeat}</label></td>
+                       <td><select id="background_repeat" name="background_repeat" class="mceEditableSelect"></select></td>
+               </tr>
+
+               <tr>
+                       <td><label for="background_attachment">{$lang_style_background_attachment}</label></td>
+                       <td><select id="background_attachment" name="background_attachment" class="mceEditableSelect"></select></td>
+               </tr>
+
+               <tr>
+                       <td><label for="background_hpos">{$lang_style_background_hpos}</label></td>
+                       <td>
+                               <table border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><select id="background_hpos" name="background_hpos" class="mceEditableSelect"></select></td>
+                                               <td>&nbsp;</td>
+      <td><select id="background_hpos_measurement" name="background_hpos_measurement"></select></td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+
+               <tr>
+                       <td><label for="background_vpos">{$lang_style_background_vpos}</label></td>
+                       <td>
+                               <table border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><select id="background_vpos" name="background_vpos" class="mceEditableSelect"></select></td>
+                                               <td>&nbsp;</td>
+      <td><select id="background_vpos_measurement" name="background_vpos_measurement"></select></td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+       </table>
+</div>
+
+<div id="block_panel" class="panel">
+       <table border="0">
+               <tr>
+                       <td><label for="block_wordspacing">{$lang_style_block_wordspacing}</label></td>
+                       <td>
+                               <table border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><select id="block_wordspacing" name="block_wordspacing" class="mceEditableSelect"></select></td>
+                                               <td>&nbsp;</td>
+      <td><select id="block_wordspacing_measurement" name="block_wordspacing_measurement"></select></td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+
+               <tr>
+                       <td><label for="block_letterspacing">{$lang_style_block_letterspacing}</label></td>
+                       <td>
+                               <table border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><select id="block_letterspacing" name="block_letterspacing" class="mceEditableSelect"></select></td>
+                                               <td>&nbsp;</td>
+      <td><select id="block_letterspacing_measurement" name="block_letterspacing_measurement"></select></td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+
+               <tr>
+                       <td><label for="block_vertical_alignment">{$lang_style_block_vertical_alignment}</label></td>
+                       <td><select id="block_vertical_alignment" name="block_vertical_alignment" class="mceEditableSelect"></select></td>
+               </tr>
+
+               <tr>
+                       <td><label for="block_text_align">{$lang_style_block_text_align}</label></td>
+                       <td><select id="block_text_align" name="block_text_align" class="mceEditableSelect"></select></td>
+               </tr>
+
+               <tr>
+                       <td><label for="block_text_indent">{$lang_style_block_text_indent}</label></td>
+                       <td>
+                               <table border="0" cellspacing="0" cellpadding="0">
+                                       <tr>
+                                               <td><input type="text" id="block_text_indent" name="block_text_indent" /></td>
+                                               <td>&nbsp;</td>
+      <td><select id="block_text_indent_measurement" name="block_text_indent_measurement"></select></td>
+                                       </tr>
+                               </table>
+                       </td>
+               </tr>
+
+               <tr>
+                       <td><label for="block_whitespace">{$lang_style_block_whitespace}</label></td>
+                       <td><select id="block_whitespace" name="block_whitespace" class="mceEditableSelect"></select></td>
+               </tr>
+
+               <tr>
+                       <td><label for="block_display">{$lang_style_block_display}</label></td>
+                       <td><select id="block_display" name="block_display" class="mceEditableSelect"></select></td>
+               </tr>
+       </table>
+</div>
+
+<div id="box_panel" class="panel">
+<table border="0">
+       <tr>
+               <td><label for="box_width">{$lang_style_box_width}</label></td>
+               <td>
+                       <table border="0" cellspacing="0" cellpadding="0">
+                               <tr>
+                                       <td><input type="text" id="box_width" name="box_width" class="mceEditableSelect" onChange="synch('box_width','positioning_width');" /></td>
+                                       <td>&nbsp;</td>
+     <td><select id="box_width_measurement" name="box_width_measurement"></select></td>
+                               </tr>
+                       </table>
+               </td>
+               <td>&nbsp;&nbsp;&nbsp;<label for="box_float">{$lang_style_box_float}</label></td>
+               <td><select id="box_float" name="box_float" class="mceEditableSelect"></select></td>
+       </tr>
+
+       <tr>
+               <td><label for="box_height">{$lang_style_box_height}</label></td>
+               <td>
+                       <table border="0" cellspacing="0" cellpadding="0">
+                               <tr>
+                                       <td><input type="text" id="box_height" name="box_height" class="mceEditableSelect" onChange="synch('box_height','positioning_height');" /></td>
+                                       <td>&nbsp;</td>
+     <td><select id="box_height_measurement" name="box_height_measurement"></select></td>
+                               </tr>
+                       </table>
+               </td>
+               <td>&nbsp;&nbsp;&nbsp;<label for="box_clear">{$lang_style_box_clear}</label></td>
+               <td><select id="box_clear" name="box_clear" class="mceEditableSelect"></select></td>
+       </tr>
+</table>
+<div style="float: left; width: 49%">
+       <fieldset>
+               <legend>{$lang_style_padding}</legend>
+
+               <table border="0">
+                       <tr>
+                               <td>&nbsp;</td>
+                               <td><input type="checkbox" id="box_padding_same" name="box_padding_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_padding');" /> <label for="box_padding_same">{$lang_style_same}</label></td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_padding_top">{$lang_style_top}</label></td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_padding_top" name="box_padding_top" class="mceEditableSelect" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="box_padding_top_measurement" name="box_padding_top_measurement"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_padding_right">{$lang_style_right}</label></td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_padding_right" name="box_padding_right" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="box_padding_right_measurement" name="box_padding_right_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_padding_bottom">{$lang_style_bottom}</label></td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_padding_bottom" name="box_padding_bottom" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="box_padding_bottom_measurement" name="box_padding_bottom_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_padding_left">{$lang_style_left}</label></td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_padding_left" name="box_padding_left" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="box_padding_left_measurement" name="box_padding_left_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+
+<div style="float: right; width: 49%">
+       <fieldset>
+               <legend>{$lang_style_margin}</legend>
+
+               <table border="0">
+                       <tr>
+                               <td>&nbsp;</td>
+                               <td><input type="checkbox" id="box_margin_same" name="box_margin_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_margin');" /> <label for="box_margin_same">{$lang_style_same}</label></td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_margin_top">{$lang_style_top}</label></td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_margin_top" name="box_margin_top" class="mceEditableSelect" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="box_margin_top_measurement" name="box_margin_top_measurement"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_margin_right">{$lang_style_right}</label></td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_margin_right" name="box_margin_right" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="box_margin_right_measurement" name="box_margin_right_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_margin_bottom">{$lang_style_bottom}</label></td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_margin_bottom" name="box_margin_bottom" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="box_margin_bottom_measurement" name="box_margin_bottom_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td><label for="box_margin_left">{$lang_style_left}</label></td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="box_margin_left" name="box_margin_left" class="mceEditableSelect" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="box_margin_left_measurement" name="box_margin_left_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+<br style="clear: both" />
+</div>
+
+<div id="border_panel" class="panel">
+<table border="0" cellspacing="0" cellpadding="0" width="100%">
+<tr>
+       <td class="tdelim">&nbsp;</td>
+       <td class="tdelim delim">&nbsp;</td>
+       <td class="tdelim">{$lang_style_style}</td>
+       <td class="tdelim delim">&nbsp;</td>
+       <td class="tdelim">{$lang_style_width}</td>
+       <td class="tdelim delim">&nbsp;</td>
+       <td class="tdelim">{$lang_style_color}</td>
+</tr>
+
+<tr>
+       <td>&nbsp;</td>
+       <td class="delim">&nbsp;</td>
+       <td><input type="checkbox" id="border_style_same" name="border_style_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_style');" /> <label for="border_style_same">{$lang_style_same}</label></td>
+       <td class="delim">&nbsp;</td>
+       <td><input type="checkbox" id="border_width_same" name="border_width_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_width');" /> <label for="border_width_same">{$lang_style_same}</label></td>
+       <td class="delim">&nbsp;</td>
+       <td><input type="checkbox" id="border_color_same" name="border_color_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_color');" /> <label for="border_color_same">{$lang_style_same}</label></td>
+</tr>
+
+<tr>
+       <td>{$lang_style_top}</td>
+       <td class="delim">&nbsp;</td>
+       <td><select id="border_style_top" name="border_style_top" class="mceEditableSelect"></select></td>
+       <td class="delim">&nbsp;</td>
+       <td>
+               <table border="0" cellspacing="0" cellpadding="0">
+                       <tr>
+                               <td><select id="border_width_top" name="border_width_top" class="mceEditableSelect"></select></td>
+                               <td>&nbsp;</td>
+    <td><select id="border_width_top_measurement" name="border_width_top_measurement"></select></td>
+                       </tr>
+               </table>
+       </td>
+       <td class="delim">&nbsp;</td>
+       <td>
+               <table border="0" cellpadding="0" cellspacing="0">
+                       <tr>
+                               <td><input id="border_color_top" name="border_color_top" type="text" value="" size="9" onChange="updateColor('border_color_top_pick','border_color_top');" /></td>
+                               <td id="border_color_top_pickcontainer">&nbsp;</td>
+                       </tr>
+               </table>
+       </td>
+</tr>
+
+<tr>
+       <td>{$lang_style_right}</td>
+       <td class="delim">&nbsp;</td>
+       <td><select id="border_style_right" name="border_style_right" class="mceEditableSelect" disabled="disabled"></select></td>
+       <td class="delim">&nbsp;</td>
+       <td>
+               <table border="0" cellspacing="0" cellpadding="0">
+                       <tr>
+                               <td><select id="border_width_right" name="border_width_right" class="mceEditableSelect" disabled="disabled"></select></td>
+                               <td>&nbsp;</td>
+    <td><select id="border_width_right_measurement" name="border_width_right_measurement" disabled="disabled"></select></td>
+                       </tr>
+               </table>
+       </td>
+       <td class="delim">&nbsp;</td>
+       <td>
+               <table border="0" cellpadding="0" cellspacing="0">
+                       <tr>
+                               <td><input id="border_color_right" name="border_color_right" type="text" value="" size="9" onChange="updateColor('border_color_right_pick','border_color_right');" disabled="disabled" /></td>
+                               <td id="border_color_right_pickcontainer">&nbsp;</td>
+                       </tr>
+               </table>
+       </td>
+</tr>
+
+<tr>
+       <td>{$lang_style_bottom}</td>
+       <td class="delim">&nbsp;</td>
+       <td><select id="border_style_bottom" name="border_style_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
+       <td class="delim">&nbsp;</td>
+       <td>
+               <table border="0" cellspacing="0" cellpadding="0">
+                       <tr>
+                               <td><select id="border_width_bottom" name="border_width_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
+                               <td>&nbsp;</td>
+    <td><select id="border_width_bottom_measurement" name="border_width_bottom_measurement" disabled="disabled"></select></td>
+                       </tr>
+               </table>
+       </td>
+       <td class="delim">&nbsp;</td>
+       <td>
+               <table border="0" cellpadding="0" cellspacing="0">
+                       <tr>
+                               <td><input id="border_color_bottom" name="border_color_bottom" type="text" value="" size="9" onChange="updateColor('border_color_bottom_pick','border_color_bottom');" disabled="disabled" /></td>
+                               <td id="border_color_bottom_pickcontainer">&nbsp;</td>
+                       </tr>
+               </table>
+       </td>
+</tr>
+
+<tr>
+       <td>{$lang_style_left}</td>
+       <td class="delim">&nbsp;</td>
+       <td><select id="border_style_left" name="border_style_left" class="mceEditableSelect" disabled="disabled"></select></td>
+       <td class="delim">&nbsp;</td>
+       <td>
+               <table border="0" cellspacing="0" cellpadding="0">
+                       <tr>
+                               <td><select id="border_width_left" name="border_width_left" class="mceEditableSelect" disabled="disabled"></select></td>
+                               <td>&nbsp;</td>
+    <td><select id="border_width_left_measurement" name="border_width_left_measurement" disabled="disabled"></select></td>
+                       </tr>
+               </table>
+       </td>
+       <td class="delim">&nbsp;</td>
+       <td>
+               <table border="0" cellpadding="0" cellspacing="0">
+                       <tr>
+                               <td><input id="border_color_left" name="border_color_left" type="text" value="" size="9" onChange="updateColor('border_color_left_pick','border_color_left');" disabled="disabled" /></td>
+                               <td id="border_color_left_pickcontainer">&nbsp;</td>
+                       </tr>
+               </table>
+       </td>
+</tr>
+</table>
+</div>
+
+<div id="list_panel" class="panel">
+       <table border="0">
+               <tr>
+                       <td><label for="list_type">{$lang_style_list_type}</label></td>
+                       <td><select id="list_type" name="list_type" class="mceEditableSelect"></select></td>
+               </tr>
+
+               <tr>
+                       <td><label for="list_bullet_image">{$lang_style_bullet_image}</label></td>
+                       <td><input id="list_bullet_image" name="list_bullet_image" type="text" /></td>
+               </tr>
+
+               <tr>
+                       <td><label for="list_position">{$lang_style_position}</label></td>
+                       <td><select id="list_position" name="list_position" class="mceEditableSelect"></select></td>
+               </tr>
+       </table>
+</div>
+
+<div id="positioning_panel" class="panel">
+<table border="0">
+       <tr>
+               <td><label for="positioning_type">{$lang_style_positioning_type}</label></td>
+               <td><select id="positioning_type" name="positioning_type" class="mceEditableSelect"></select></td>
+               <td>&nbsp;&nbsp;&nbsp;<label for="positioning_visibility">{$lang_style_visibility}</label></td>
+               <td><select id="positioning_visibility" name="positioning_visibility" class="mceEditableSelect"></select></td>
+       </tr>
+
+       <tr>
+               <td><label for="positioning_width">{$lang_style_width}</label></td>
+               <td>
+                       <table border="0" cellspacing="0" cellpadding="0">
+                               <tr>
+                                       <td><input type="text" id="positioning_width" name="positioning_width" onChange="synch('positioning_width','box_width');" /></td>
+                                       <td>&nbsp;</td>
+     <td><select id="positioning_width_measurement" name="positioning_width_measurement"></select></td>
+                               </tr>
+                       </table>
+               </td>
+               <td>&nbsp;&nbsp;&nbsp;<label for="positioning_zindex">{$lang_style_zindex}</label></td>
+               <td><input type="text" id="positioning_zindex" name="positioning_zindex" /></td>
+       </tr>
+
+       <tr>
+               <td><label for="positioning_height">{$lang_style_height}</label></td>
+               <td>
+                       <table border="0" cellspacing="0" cellpadding="0">
+                               <tr>
+                                       <td><input type="text" id="positioning_height" name="positioning_height" onChange="synch('positioning_height','box_height');" /></td>
+                                       <td>&nbsp;</td>
+     <td><select id="positioning_height_measurement" name="positioning_height_measurement"></select></td>
+                               </tr>
+                       </table>
+               </td>
+               <td>&nbsp;&nbsp;&nbsp;<label for="positioning_overflow">{$lang_style_overflow}</label></td>
+               <td><select id="positioning_overflow" name="positioning_overflow" class="mceEditableSelect"></select></td>
+       </tr>
+</table>
+
+<div style="float: left; width: 49%">
+       <fieldset>
+               <legend>{$lang_style_placement}</legend>
+
+               <table border="0">
+                       <tr>
+                               <td>&nbsp;</td>
+                               <td><input type="checkbox" id="positioning_placement_same" name="positioning_placement_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_placement');" /> <label for="positioning_placement_same">{$lang_style_same}</label></td>
+                       </tr>
+                       <tr>
+                               <td>{$lang_style_top}</td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_placement_top" name="positioning_placement_top" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="positioning_placement_top_measurement" name="positioning_placement_top_measurement"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{$lang_style_right}</td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_placement_right" name="positioning_placement_right" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="positioning_placement_right_measurement" name="positioning_placement_right_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{$lang_style_bottom}</td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_placement_bottom" name="positioning_placement_bottom" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="positioning_placement_bottom_measurement" name="positioning_placement_bottom_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{$lang_style_left}</td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_placement_left" name="positioning_placement_left" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="positioning_placement_left_measurement" name="positioning_placement_left_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+
+<div style="float: right; width: 49%">
+       <fieldset>
+               <legend>{$lang_style_clip}</legend>
+
+               <table border="0">
+                       <tr>
+                               <td>&nbsp;</td>
+                               <td><input type="checkbox" id="positioning_clip_same" name="positioning_clip_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_clip');" /> <label for="positioning_clip_same">{$lang_style_same}</label></td>
+                       </tr>
+                       <tr>
+                               <td>{$lang_style_top}</td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_clip_top" name="positioning_clip_top" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="positioning_clip_top_measurement" name="positioning_clip_top_measurement"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{$lang_style_right}</td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_clip_right" name="positioning_clip_right" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="positioning_clip_right_measurement" name="positioning_clip_right_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{$lang_style_bottom}</td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_clip_bottom" name="positioning_clip_bottom" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="positioning_clip_bottom_measurement" name="positioning_clip_bottom_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+                       <tr>
+                               <td>{$lang_style_left}</td>
+                               <td>
+                                       <table border="0" cellspacing="0" cellpadding="0">
+                                               <tr>
+                                                       <td><input type="text" id="positioning_clip_left" name="positioning_clip_left" disabled="disabled" /></td>
+                                                       <td>&nbsp;</td>
+       <td><select id="positioning_clip_left_measurement" name="positioning_clip_left_measurement" disabled="disabled"></select></td>
+                                               </tr>
+                                       </table>
+                               </td>
+                       </tr>
+               </table>
+       </fieldset>
+</div>
+<br style="clear: both" />
+</div>
+</div>
+
+<div class="mceActionPanel">
+       <div style="float: left">
+               <div style="float: left"><input type="button" id="insert" name="insert" value="{$lang_update}" onClick="updateAction();" /></div>
+
+               <div style="float: left">&nbsp;<input type="button" id="apply" name="apply" value="{$lang_style_apply}" onClick="applyAction();" class="updateButton" /></div>
+               <br style="clear: both" />
+       </div>
+
+       <div style="float: right">
+               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onClick="tinyMCEPopup.close();" />
+       </div>
+</div>
+</form>
+
+<div style="display: none">
+       <div id="container"></div>
+</div>
+</body>
+</html>
diff --git a/media/tiny_mce/plugins/style/readme.txt b/media/tiny_mce/plugins/style/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/table/cell.htm b/media/tiny_mce/plugins/table/cell.htm
new file mode 100755 (executable)
index 0000000..7171d4f
--- /dev/null
@@ -0,0 +1,182 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_cell_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/cell.js"></script>\r
+       <link href="css/cell.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="tablecell" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <form onsubmit="updateAction();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_table_general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_general_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="align">{$lang_table_align}</label></td>\r
+                                                       <td>\r
+                                                               <select id="align" name="align">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="center">{$lang_table_align_middle}</option>\r
+                                                                       <option value="left">{$lang_table_align_left}</option>\r
+                                                                       <option value="right">{$lang_table_align_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+               \r
+                                                       <td><label for="celltype">{$lang_table_cell_type}</label></td>\r
+                                                       <td>\r
+                                                               <select id="celltype" name="celltype">\r
+                                                                       <option value="td">{$lang_table_td}</option>\r
+                                                                       <option value="th">{$lang_table_th}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="valign">{$lang_table_valign}</label></td>\r
+                                                       <td>\r
+                                                               <select id="valign" name="valign">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="top">{$lang_table_align_top}</option>\r
+                                                                       <option value="middle">{$lang_table_align_middle}</option>\r
+                                                                       <option value="bottom">{$lang_table_align_bottom}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                                       <td><label for="scope">{$lang_table_scope}</label></td>\r
+                                                       <td>\r
+                                                               <select id="scope" name="scope">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="col">{$lang_table_col}</option>\r
+                                                                       <option value="row">{$lang_table_row}</option>\r
+                                                                       <option value="rowgroup">{$lang_table_rowgroup}</option>\r
+                                                                       <option value="colgroup">{$lang_table_colgroup}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="width">{$lang_table_width}</label></td>\r
+                                                       <td><input id="width" name="width" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+\r
+                                                       <td><label for="height">{$lang_table_height}</label></td>\r
+                                                       <td><input id="height" name="height" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr id="styleSelectRow">\r
+                                                       <td><label for="class">{$lang_class_name}</label></td>\r
+                                                       <td colspan="3">\r
+                                                               <select id="class" name="class">\r
+                                                                       <option value="" selected="selected">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="id">{$lang_table_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="style">{$lang_table_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{$lang_table_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" style="width: 200px"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_table_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_table_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="lang">{$lang_table_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" style="width: 200px" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>\r
+                                                                               <td id="bordercolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div>\r
+                               <select id="action" name="action">\r
+                                       <option value="cell">{$lang_table_cell_cell}</option>\r
+                                       <option value="row">{$lang_table_cell_row}</option>\r
+                                       <option value="all">{$lang_table_cell_all}</option>\r
+                               </select>\r
+                       </div>\r
+\r
+                       <div style="float: left">\r
+                               <div><input type="button" id="insert" name="insert" value="{$lang_update}" onclick="updateAction();" /></div>\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/table/css/cell.css b/media/tiny_mce/plugins/table/css/cell.css
new file mode 100755 (executable)
index 0000000..a067ecd
--- /dev/null
@@ -0,0 +1,17 @@
+/* CSS file for cell dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 200px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#action {\r
+       margin-bottom: 3px;\r
+}\r
+\r
+#class {\r
+       width: 150px;\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/table/css/row.css b/media/tiny_mce/plugins/table/css/row.css
new file mode 100755 (executable)
index 0000000..1f7755d
--- /dev/null
@@ -0,0 +1,25 @@
+/* CSS file for row dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 200px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#action {\r
+       margin-bottom: 3px;\r
+}\r
+\r
+#rowtype,#align,#valign,#class,#height {\r
+       width: 150px;\r
+}\r
+\r
+#height {\r
+       width: 50px;    \r
+}\r
+\r
+.col2 {\r
+       padding-left: 20px;\r
+}\r
diff --git a/media/tiny_mce/plugins/table/css/table.css b/media/tiny_mce/plugins/table/css/table.css
new file mode 100755 (executable)
index 0000000..804f766
--- /dev/null
@@ -0,0 +1,13 @@
+/* CSS file for table dialog in the table plugin */\r
+\r
+.panel_wrapper div.current {\r
+       height: 220px;\r
+}\r
+\r
+.advfield {\r
+       width: 200px;\r
+}\r
+\r
+#class {\r
+       width: 150px;\r
+}\r
diff --git a/media/tiny_mce/plugins/table/editor_plugin.js b/media/tiny_mce/plugins/table/editor_plugin.js
new file mode 100755 (executable)
index 0000000..2f308f8
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',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;i<controls.length;i++){var but=controls[i];var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+but[3]+'\', '+(but.length>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))}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;i<ar.length;i++){if(ar[i].length>0&&inArray(ar[i],v))return true;if(ar[i]==v)return true}return false}function makeTD(){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;"}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<grid.length;y++){for(x=0;x<grid[y].length;x++){if(grid[y][x]==td)return{cellindex:x,rowindex:y}}}return null}function getCell(grid,row,col){if(grid[row]&&grid[row][col])return grid[row][col];return null}function getTableGrid(table){var grid=new Array(),rows=table.rows,x,y,td,sd,xstart,x2,y2;for(y=0;y<rows.length;y++){for(x=0;x<rows[y].cells.length;x++){td=rows[y].cells[x];sd=getColRowSpan(td);for(xstart=x;grid[y]&&grid[y][xstart];xstart++);for(y2=y;y2<y+sd['rowspan'];y2++){if(!grid[y2])grid[y2]=new Array();for(x2=xstart;x2<xstart+sd['colspan'];x2++)grid[y2][x2]=td}}}return grid}function trimRow(table,tr,td,new_tr){var grid=getTableGrid(table),cpos=getCellPos(grid,td);var cells,lastElm;if(new_tr.cells.length!=tr.childNodes.length){cells=tr.childNodes;lastElm=null;for(var x=0;td=getCell(grid,cpos.rowindex,x);x++){var remove=true;var sd=getColRowSpan(td);if(inArray(cells,td)){new_tr.childNodes[x]._delete=true}else if((lastElm==null||td!=lastElm)&&sd.colspan>1){for(var i=x;i<x+td.colSpan;i++)new_tr.childNodes[i]._delete=true}if((lastElm==null||td!=lastElm)&&sd.rowspan>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<namesAr.length;i++){if(node.nodeName.toLowerCase()==namesAr[i].toLowerCase())return node}}return null}function deleteMarked(tbl){if(tbl.rows==0)return;var tr=tbl.rows[0];do{var next=nextElm(tr,"TR");if(tr._delete){tr.parentNode.removeChild(tr);continue}var td=tr.cells[0];if(td.cells>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){td_elm.rowSpan=1;var trNext=nextElm(tr_elm,"TR");for(var i=1;i<rowspan&&trNext;i++){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";if(tinyMCE.isMSIE)trNext.insertBefore(newTD,trNext.cells(td_elm.cellIndex));else trNext.insertBefore(newTD,trNext.cells[td_elm.cellIndex]);trNext=nextElm(trNext,"TR")}}function copyRow(doc,table,tr){var grid=getTableGrid(table);var newTR=tr.cloneNode(false);var cpos=getCellPos(grid,tr.cells[0]);var lastCell=null;var tableBorder=tinyMCE.getAttrib(table,"border");var tdElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){var newTD=null;if(lastCell!=tdElm){for(var i=0;i<tr.cells.length;i++){if(tdElm==tr.cells[i]){newTD=tdElm.cloneNode(true);break}}}if(newTD==null){newTD=doc.createElement("td");newTD.innerHTML="&nbsp;"}newTD.colSpan=1;newTD.rowSpan=1;newTR.appendChild(newTD);lastCell=tdElm}return newTR}switch(command){case"mceTableRowProps":if(trElm==null)return true;if(user_interface){var template=new Array();template['file']='../../plugins/table/row.htm';template['width']=380;template['height']=295;template['width']+=tinyMCE.getLang('lang_table_rowprops_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_rowprops_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes"})}return true;case"mceTableCellProps":if(tdElm==null)return true;if(user_interface){var template=new Array();template['file']='../../plugins/table/cell.htm';template['width']=380;template['height']=295;template['width']+=tinyMCE.getLang('lang_table_cellprops_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_cellprops_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes"})}return true;case"mceInsertTable":if(user_interface){var template=new Array();template['file']='../../plugins/table/table.htm';template['width']=380;template['height']=295;template['width']+=tinyMCE.getLang('lang_table_table_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_table_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes",action:value})}return true;case"mceTableDelete":var table=tinyMCE.getParentElement(inst.getFocusElement(),"table");if(table){table.parentNode.removeChild(table);inst.repaint()}return true;case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":if(!tableElm)return true;if(trElm&&tableElm!=trElm.parentNode)tableElm=trElm.parentNode;if(tableElm&&trElm){switch(command){case"mceTableCutRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);inst.execCommand("mceTableDeleteRow");break;case"mceTableCopyRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);break;case"mceTablePasteRowBefore":if(!trElm||!tdElm)return true;var newTR=inst.tableRowClipboard.cloneNode(true);var prevTR=prevElm(trElm,"TR");if(prevTR!=null)trimRow(tableElm,prevTR,prevTR.cells[0],newTR);trElm.parentNode.insertBefore(newTR,trElm);break;case"mceTablePasteRowAfter":if(!trElm||!tdElm)return true;var nextTR=nextElm(trElm,"TR");var newTR=inst.tableRowClipboard.cloneNode(true);trimRow(tableElm,trElm,tdElm,newTR);if(nextTR==null)trElm.parentNode.appendChild(newTR);else nextTR.parentNode.insertBefore(newTR,nextTR);break;case"mceTableInsertRowBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD)}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm}}trElm.parentNode.insertBefore(newTR,trElm);grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex+1,cpos.cellindex),tinyMCE.isGecko,true);break;case"mceTableInsertRowAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");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){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD)}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm}}if(newTR.hasChildNodes()){var nextTR=nextElm(trElm,"TR");if(nextTR)nextTR.parentNode.insertBefore(newTR,nextTR);else tableElm.appendChild(newTR)}grid=getTableGrid(tableElm);inst.selection.selectNode(getCell(grid,cpos.rowindex,cpos.cellindex),tinyMCE.isGecko,true);break;case"mceTableDeleteRow":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);if(grid.length==1){tableElm=tinyMCE.getParentElement(tableElm,"table");tableElm.parentNode.removeChild(tableElm);return true}var cells=trElm.cells;var nextTR=nextElm(trElm,"TR");for(var x=0;x<cells.length;x++){if(cells[x].rowSpan>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)}}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="&nbsp;";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="&nbsp;";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;i<colspan;i++){var newTD=doc.createElement("td");newTD.innerHTML="&nbsp;";trElm.insertBefore(newTD,nextElm(tdElm,"TD,TH"));if(rowspan>1)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;y<grid.length;y++){var rowCells=new Array();for(var x=cpos.cellindex;x<grid[y].length;x++){var td=getCell(grid,y,x);if(td&&!inArray(rows,td)&&!inArray(rowCells,td)){var cp=getCellPos(grid,td);if(cp.cellindex<cpos.cellindex+numCols&&cp.rowindex<cpos.rowindex+numRows)rowCells[rowCells.length]=td}}if(rowCells.length>0)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;i<sel.rangeCount;i++){var rng=sel.getRangeAt(i);var tdElm=rng.startContainer.childNodes[rng.startOffset];if(!tdElm)break;if(tdElm.nodeName=="TD")cells[cells.length]=tdElm}var tRows=tableElm.rows;for(var y=0;y<tRows.length;y++){var rowCells=new Array();for(var x=0;x<tRows[y].cells.length;x++){var td=tRows[y].cells[x];for(var i=0;i<cells.length;i++){if(td==cells[i]){rowCells[rowCells.length]=td}}}if(rowCells.length>0)rows[rows.length]=rowCells}var curRow=new Array();var lastTR=null;for(var y=0;y<grid.length;y++){for(var x=0;x<grid[y].length;x++){grid[y][x]._selected=false;for(var i=0;i<cells.length;i++){if(grid[y][x]==cells[i]){if(x1==-1){x1=x;y1=y}x2=x;y2=y;grid[y][x]._selected=true}}}}for(var y=y1;y<=y2;y++){for(var x=x1;x<=x2;x++){if(!grid[y][x]._selected){alert("Invalid selection for merge.");return true}}}}var rowSpan=1,colSpan=1;var lastRowSpan=-1;for(var y=0;y<rows.length;y++){var rowColSpan=0;for(var x=0;x<rows[y].length;x++){var sd=getColRowSpan(rows[y][x]);rowColSpan+=sd['colspan'];if(lastRowSpan!=-1&&sd['rowspan']!=lastRowSpan){alert("Invalid selection for merge.");return true}lastRowSpan=sd['rowspan']}if(rowColSpan>colSpan)colSpan=rowColSpan;lastRowSpan=-1}var lastColSpan=-1;for(var x=0;x<rows[0].length;x++){var colRowSpan=0;for(var y=0;y<rows.length;y++){var sd=getColRowSpan(rows[y][x]);colRowSpan+=sd['rowspan'];if(lastColSpan!=-1&&sd['colspan']!=lastColSpan){alert("Invalid selection for merge.");return true}lastColSpan=sd['colspan']}if(colRowSpan>rowSpan)rowSpan=colRowSpan;lastColSpan=-1}tdElm=rows[0][0];tdElm.rowSpan=rowSpan;tdElm.colSpan=colSpan;for(var y=0;y<rows.length;y++){for(var x=0;x<rows[y].length;x++){var html=rows[y][x].innerHTML;var chk=tinyMCE.regexpReplace(html,"[ \t\r\n]","");if(chk!="<br/>"&&chk!="<br>"&&chk!="&nbsp;"&&(x+y>0))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/media/tiny_mce/plugins/table/editor_plugin_src.js b/media/tiny_mce/plugins/table/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..75aaa4d
--- /dev/null
@@ -0,0 +1,1073 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('table');\r
+\r
+var TinyMCE_TablePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Tables',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               if (tinyMCE.isGecko) {\r
+                       var doc = inst.getDoc();\r
+                       tinyMCE.addEvent(doc, "mouseup", TinyMCE_TablePlugin._mouseDownHandler);\r
+               }\r
+\r
+               inst.tableRowClipboard = null;\r
+       },\r
+\r
+       /**\r
+        * Returns the HTML contents of the table control.\r
+        */\r
+       getControlHTML : function(control_name) {\r
+               var controls = new Array(\r
+                       ['table', 'table.gif', 'lang_table_desc', 'mceInsertTable', true],\r
+                       ['delete_table', 'table_delete.gif', 'lang_table_del', 'mceTableDelete'],\r
+                       ['delete_col', 'table_delete_col.gif', 'lang_table_delete_col_desc', 'mceTableDeleteCol'],\r
+                       ['delete_row', 'table_delete_row.gif', 'lang_table_delete_row_desc', 'mceTableDeleteRow'],\r
+                       ['col_after', 'table_insert_col_after.gif', 'lang_table_col_after_desc', 'mceTableInsertColAfter'],\r
+                       ['col_before', 'table_insert_col_before.gif', 'lang_table_col_before_desc', 'mceTableInsertColBefore'],\r
+                       ['row_after', 'table_insert_row_after.gif', 'lang_table_row_after_desc', 'mceTableInsertRowAfter'],\r
+                       ['row_before', 'table_insert_row_before.gif', 'lang_table_row_before_desc', 'mceTableInsertRowBefore'],\r
+                       ['row_props', 'table_row_props.gif', 'lang_table_row_desc', 'mceTableRowProps', true],\r
+                       ['cell_props', 'table_cell_props.gif', 'lang_table_cell_desc', 'mceTableCellProps', true],\r
+                       ['split_cells', 'table_split_cells.gif', 'lang_table_split_cells_desc', 'mceTableSplitCells', true],\r
+                       ['merge_cells', 'table_merge_cells.gif', 'lang_table_merge_cells_desc', 'mceTableMergeCells', true]);\r
+\r
+               // Render table control\r
+               for (var i=0; i<controls.length; i++) {\r
+                       var but = controls[i];\r
+                       var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + but[3] + '\', ' + (but.length > 4 ? but[4] : false) + (but.length > 5 ? ', \'' + but[5] + '\'' : '') + ');return false;';\r
+\r
+                       if (but[0] == control_name)\r
+                               return tinyMCE.getButtonHTML(control_name, but[2], '{$pluginurl}/images/'+ but[1], but[3], (but.length > 4 ? but[4] : false));\r
+               }\r
+\r
+               // Special tablecontrols\r
+               if (control_name == "tablecontrols") {\r
+                       var html = "";\r
+\r
+                       html += tinyMCE.getControlHTML("table");\r
+                       html += tinyMCE.getControlHTML("separator");\r
+                       html += tinyMCE.getControlHTML("row_props");\r
+                       html += tinyMCE.getControlHTML("cell_props");\r
+                       html += tinyMCE.getControlHTML("separator");\r
+                       html += tinyMCE.getControlHTML("row_before");\r
+                       html += tinyMCE.getControlHTML("row_after");\r
+                       html += tinyMCE.getControlHTML("delete_row");\r
+                       html += tinyMCE.getControlHTML("separator");\r
+                       html += tinyMCE.getControlHTML("col_before");\r
+                       html += tinyMCE.getControlHTML("col_after");\r
+                       html += tinyMCE.getControlHTML("delete_col");\r
+                       html += tinyMCE.getControlHTML("separator");\r
+                       html += tinyMCE.getControlHTML("split_cells");\r
+                       html += tinyMCE.getControlHTML("merge_cells");\r
+\r
+                       return html;\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes the table commands.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Is table command\r
+               switch (command) {\r
+                       case "mceInsertTable":\r
+                       case "mceTableRowProps":\r
+                       case "mceTableCellProps":\r
+                       case "mceTableSplitCells":\r
+                       case "mceTableMergeCells":\r
+                       case "mceTableInsertRowBefore":\r
+                       case "mceTableInsertRowAfter":\r
+                       case "mceTableDeleteRow":\r
+                       case "mceTableInsertColBefore":\r
+                       case "mceTableInsertColAfter":\r
+                       case "mceTableDeleteCol":\r
+                       case "mceTableCutRow":\r
+                       case "mceTableCopyRow":\r
+                       case "mceTablePasteRowBefore":\r
+                       case "mceTablePasteRowAfter":\r
+                       case "mceTableDelete":\r
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+                               inst.execCommand('mceBeginUndoLevel');\r
+                               TinyMCE_TablePlugin._doExecCommand(editor_id, element, command, user_interface, value);\r
+                               inst.execCommand('mceEndUndoLevel');\r
+\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               var colspan = "1", rowspan = "1", tdElm;\r
+\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               // Reset table controls\r
+               tinyMCE.switchClass(editor_id + '_table', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_delete_table', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonDisabled');\r
+\r
+               // Within a td element\r
+               if (tdElm = tinyMCE.getParentElement(node, "td,th")) {\r
+                       tinyMCE.switchClass(editor_id + '_cell_props', 'mceButtonSelected');\r
+                       tinyMCE.switchClass(editor_id + '_delete_table', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_row_before', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_row_after', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_delete_row', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_col_before', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_col_after', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_delete_col', 'mceButtonNormal');\r
+\r
+                       colspan = tinyMCE.getAttrib(tdElm, "colspan");\r
+                       rowspan = tinyMCE.getAttrib(tdElm, "rowspan");\r
+\r
+                       colspan = colspan == "" ? "1" : colspan;\r
+                       rowspan = rowspan == "" ? "1" : rowspan;\r
+\r
+                       if (colspan != "1" || rowspan != "1")\r
+                               tinyMCE.switchClass(editor_id + '_split_cells', 'mceButtonNormal');\r
+               }\r
+\r
+               // Within a tr element\r
+               if (tinyMCE.getParentElement(node, "tr"))\r
+                       tinyMCE.switchClass(editor_id + '_row_props', 'mceButtonSelected');\r
+\r
+               // Within table\r
+               if (tinyMCE.getParentElement(node, "table")) {\r
+                       tinyMCE.switchClass(editor_id + '_table', 'mceButtonSelected');\r
+                       tinyMCE.switchClass(editor_id + '_merge_cells', 'mceButtonNormal');\r
+               }\r
+       },\r
+\r
+       // Private plugin internal methods\r
+\r
+       _mouseDownHandler : function(e) {\r
+               var elm = tinyMCE.isMSIE ? event.srcElement : e.target;\r
+               var focusElm = tinyMCE.selectedInstance.getFocusElement();\r
+\r
+               // If press on special Mozilla create TD/TR thingie\r
+               if (elm.nodeName == "BODY" && (focusElm.nodeName == "TD" || focusElm.nodeName == "TH" || (focusElm.parentNode && focusElm.parentNode.nodeName == "TD") ||(focusElm.parentNode && focusElm.parentNode.nodeName == "TH") )) {\r
+                       window.setTimeout(function() {\r
+                               var tableElm = tinyMCE.getParentElement(focusElm, "table");\r
+                               tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);\r
+                       }, 10);\r
+               }\r
+       },\r
+\r
+       /**\r
+        * Executes the table commands.\r
+        */\r
+       _doExecCommand : function(editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+               var focusElm = inst.getFocusElement();\r
+               var trElm = tinyMCE.getParentElement(focusElm, "tr");\r
+               var tdElm = tinyMCE.getParentElement(focusElm, "td,th");\r
+               var tableElm = tinyMCE.getParentElement(focusElm, "table");\r
+               var doc = inst.contentWindow.document;\r
+               var tableBorder = tableElm ? tableElm.getAttribute("border") : "";\r
+\r
+               // Get first TD if no TD found\r
+               if (trElm && tdElm == null)\r
+                       tdElm = trElm.cells[0];\r
+\r
+               // ------- Inner functions ---------\r
+               function inArray(ar, v) {\r
+                       for (var i=0; i<ar.length; i++) {\r
+                               // Is array\r
+                               if (ar[i].length > 0 && inArray(ar[i], v))\r
+                                       return true;\r
+\r
+                               // Found value\r
+                               if (ar[i] == v)\r
+                                       return true;\r
+                       }\r
+\r
+                       return false;\r
+               }\r
+\r
+               function makeTD() {\r
+                       var newTD = doc.createElement("td");\r
+                       newTD.innerHTML = "&nbsp;";\r
+               }\r
+\r
+               function getColRowSpan(td) {\r
+                       var colspan = tinyMCE.getAttrib(td, "colspan");\r
+                       var rowspan = tinyMCE.getAttrib(td, "rowspan");\r
+\r
+                       colspan = colspan == "" ? 1 : parseInt(colspan);\r
+                       rowspan = rowspan == "" ? 1 : parseInt(rowspan);\r
+\r
+                       return {colspan : colspan, rowspan : rowspan};\r
+               }\r
+\r
+               function getCellPos(grid, td) {\r
+                       var x, y;\r
+\r
+                       for (y=0; y<grid.length; y++) {\r
+                               for (x=0; x<grid[y].length; x++) {\r
+                                       if (grid[y][x] == td)\r
+                                               return {cellindex : x, rowindex : y};\r
+                               }\r
+                       }\r
+\r
+                       return null;\r
+               }\r
+\r
+               function getCell(grid, row, col) {\r
+                       if (grid[row] && grid[row][col])\r
+                               return grid[row][col];\r
+\r
+                       return null;\r
+               }\r
+\r
+               function getTableGrid(table) {\r
+                       var grid = new Array(), rows = table.rows, x, y, td, sd, xstart, x2, y2;\r
+\r
+                       for (y=0; y<rows.length; y++) {\r
+                               for (x=0; x<rows[y].cells.length; x++) {\r
+                                       td = rows[y].cells[x];\r
+                                       sd = getColRowSpan(td);\r
+\r
+                                       // All ready filled\r
+                                       for (xstart = x; grid[y] && grid[y][xstart]; xstart++) ;\r
+\r
+                                       // Fill box\r
+                                       for (y2=y; y2<y+sd['rowspan']; y2++) {\r
+                                               if (!grid[y2])\r
+                                                       grid[y2] = new Array();\r
+\r
+                                               for (x2=xstart; x2<xstart+sd['colspan']; x2++)\r
+                                                       grid[y2][x2] = td;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return grid;\r
+               }\r
+\r
+               function trimRow(table, tr, td, new_tr) {\r
+                       var grid = getTableGrid(table), cpos = getCellPos(grid, td);\r
+                       var cells, lastElm;\r
+\r
+                       // Time to crop away some\r
+                       if (new_tr.cells.length != tr.childNodes.length) {\r
+                               cells = tr.childNodes;\r
+                               lastElm = null;\r
+\r
+                               for (var x=0; td = getCell(grid, cpos.rowindex, x); x++) {\r
+                                       var remove = true;\r
+                                       var sd = getColRowSpan(td);\r
+\r
+                                       // Remove due to rowspan\r
+                                       if (inArray(cells, td)) {\r
+                                               new_tr.childNodes[x]._delete = true;\r
+                                       } else if ((lastElm == null || td != lastElm) && sd.colspan > 1) { // Remove due to colspan\r
+                                               for (var i=x; i<x+td.colSpan; i++)\r
+                                                       new_tr.childNodes[i]._delete = true;\r
+                                       }\r
+\r
+                                       if ((lastElm == null || td != lastElm) && sd.rowspan > 1)\r
+                                               td.rowSpan = sd.rowspan + 1;\r
+\r
+                                       lastElm = td;\r
+                               }\r
+\r
+                               deleteMarked(tableElm);\r
+                       }\r
+               }\r
+\r
+               function prevElm(node, name) {\r
+                       while ((node = node.previousSibling) != null) {\r
+                               if (node.nodeName == name)\r
+                                       return node;\r
+                       }\r
+\r
+                       return null;\r
+               }\r
+\r
+               function nextElm(node, names) {\r
+                       var namesAr = names.split(',');\r
+\r
+                       while ((node = node.nextSibling) != null) {\r
+                               for (var i=0; i<namesAr.length; i++) {\r
+                                       if (node.nodeName.toLowerCase() == namesAr[i].toLowerCase() )\r
+                                               return node;\r
+                               }\r
+                       }\r
+\r
+                       return null;\r
+               }\r
+\r
+               function deleteMarked(tbl) {\r
+                       if (tbl.rows == 0)\r
+                               return;\r
+\r
+                       var tr = tbl.rows[0];\r
+                       do {\r
+                               var next = nextElm(tr, "TR");\r
+\r
+                               // Delete row\r
+                               if (tr._delete) {\r
+                                       tr.parentNode.removeChild(tr);\r
+                                       continue;\r
+                               }\r
+\r
+                               // Delete cells\r
+                               var td = tr.cells[0];\r
+                               if (td.cells > 1) {\r
+                                       do {\r
+                                               var nexttd = nextElm(td, "TD,TH");\r
+\r
+                                               if (td._delete)\r
+                                                       td.parentNode.removeChild(td);\r
+                                       } while ((td = nexttd) != null);\r
+                               }\r
+                       } while ((tr = next) != null);\r
+               }\r
+\r
+               function addRows(td_elm, tr_elm, rowspan) {\r
+                       // Add rows\r
+                       td_elm.rowSpan = 1;\r
+                       var trNext = nextElm(tr_elm, "TR");\r
+                       for (var i=1; i<rowspan && trNext; i++) {\r
+                               var newTD = doc.createElement("td");\r
+                               newTD.innerHTML = "&nbsp;";\r
+\r
+                               if (tinyMCE.isMSIE)\r
+                                       trNext.insertBefore(newTD, trNext.cells(td_elm.cellIndex));\r
+                               else\r
+                                       trNext.insertBefore(newTD, trNext.cells[td_elm.cellIndex]);\r
+\r
+                               trNext = nextElm(trNext, "TR");\r
+                       }\r
+               }\r
+\r
+               function copyRow(doc, table, tr) {\r
+                       var grid = getTableGrid(table);\r
+                       var newTR = tr.cloneNode(false);\r
+                       var cpos = getCellPos(grid, tr.cells[0]);\r
+                       var lastCell = null;\r
+                       var tableBorder = tinyMCE.getAttrib(table, "border");\r
+                       var tdElm = null;\r
+\r
+                       for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                               var newTD = null;\r
+\r
+                               if (lastCell != tdElm) {\r
+                                       for (var i=0; i<tr.cells.length; i++) {\r
+                                               if (tdElm == tr.cells[i]) {\r
+                                                       newTD = tdElm.cloneNode(true);\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               if (newTD == null) {\r
+                                       newTD = doc.createElement("td");\r
+                                       newTD.innerHTML = "&nbsp;";\r
+                               }\r
+\r
+                               // Reset col/row span\r
+                               newTD.colSpan = 1;\r
+                               newTD.rowSpan = 1;\r
+\r
+                               newTR.appendChild(newTD);\r
+\r
+                               lastCell = tdElm;\r
+                       }\r
+\r
+                       return newTR;\r
+               }\r
+\r
+               // ---- Commands -----\r
+\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceTableRowProps":\r
+                               if (trElm == null)\r
+                                       return true;\r
+\r
+                               if (user_interface) {\r
+                                       // Setup template\r
+                                       var template = new Array();\r
+\r
+                                       template['file'] = '../../plugins/table/row.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 295;\r
+\r
+                                       // Language specific width and height addons\r
+                                       template['width'] += tinyMCE.getLang('lang_table_rowprops_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_table_rowprops_delta_height', 0);\r
+\r
+                                       // Open window\r
+                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceTableCellProps":\r
+                               if (tdElm == null)\r
+                                       return true;\r
+\r
+                               if (user_interface) {\r
+                                       // Setup template\r
+                                       var template = new Array();\r
+\r
+                                       template['file'] = '../../plugins/table/cell.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 295;\r
+\r
+                                       // Language specific width and height addons\r
+                                       template['width'] += tinyMCE.getLang('lang_table_cellprops_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_table_cellprops_delta_height', 0);\r
+\r
+                                       // Open window\r
+                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes"});\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceInsertTable":\r
+                               if (user_interface) {\r
+                                       // Setup template\r
+                                       var template = new Array();\r
+\r
+                                       template['file'] = '../../plugins/table/table.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 295;\r
+\r
+                                       // Language specific width and height addons\r
+                                       template['width'] += tinyMCE.getLang('lang_table_table_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_table_table_delta_height', 0);\r
+\r
+                                       // Open window\r
+                                       tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : value});\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceTableDelete":\r
+                               var table = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+                               if (table) {\r
+                                       table.parentNode.removeChild(table);\r
+                                       inst.repaint();\r
+                               }\r
+                               return true;\r
+\r
+                       case "mceTableSplitCells":\r
+                       case "mceTableMergeCells":\r
+                       case "mceTableInsertRowBefore":\r
+                       case "mceTableInsertRowAfter":\r
+                       case "mceTableDeleteRow":\r
+                       case "mceTableInsertColBefore":\r
+                       case "mceTableInsertColAfter":\r
+                       case "mceTableDeleteCol":\r
+                       case "mceTableCutRow":\r
+                       case "mceTableCopyRow":\r
+                       case "mceTablePasteRowBefore":\r
+                       case "mceTablePasteRowAfter":\r
+                               // No table just return (invalid command)\r
+                               if (!tableElm)\r
+                                       return true;\r
+\r
+                               // Table has a tbody use that reference\r
+                               // Changed logic by ApTest 2005.07.12 (www.aptest.com)\r
+                               // Now lookk at the focused element and take its parentNode.  That will be a tbody or a table.\r
+                               if (trElm && tableElm != trElm.parentNode)\r
+                                       tableElm = trElm.parentNode;\r
+\r
+                               if (tableElm && trElm) {\r
+                                       switch (command) {\r
+                                               case "mceTableCutRow":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
+                                                       inst.execCommand("mceTableDeleteRow");\r
+                                                       break;\r
+\r
+                                               case "mceTableCopyRow":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       inst.tableRowClipboard = copyRow(doc, tableElm, trElm);\r
+                                                       break;\r
+\r
+                                               case "mceTablePasteRowBefore":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var newTR = inst.tableRowClipboard.cloneNode(true);\r
+\r
+                                                       var prevTR = prevElm(trElm, "TR");\r
+                                                       if (prevTR != null)\r
+                                                               trimRow(tableElm, prevTR, prevTR.cells[0], newTR);\r
+\r
+                                                       trElm.parentNode.insertBefore(newTR, trElm);\r
+                                                       break;\r
+\r
+                                               case "mceTablePasteRowAfter":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+                                                       \r
+                                                       var nextTR = nextElm(trElm, "TR");\r
+                                                       var newTR = inst.tableRowClipboard.cloneNode(true);\r
+\r
+                                                       trimRow(tableElm, trElm, tdElm, newTR);\r
+\r
+                                                       if (nextTR == null)\r
+                                                               trElm.parentNode.appendChild(newTR);\r
+                                                       else\r
+                                                               nextTR.parentNode.insertBefore(newTR, nextTR);\r
+\r
+                                                       break;\r
+\r
+                                               case "mceTableInsertRowBefore":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+                                                       var newTR = doc.createElement("tr");\r
+                                                       var lastTDElm = null;\r
+\r
+                                                       cpos.rowindex--;\r
+                                                       if (cpos.rowindex < 0)\r
+                                                               cpos.rowindex = 0;\r
+\r
+                                                       // Create cells\r
+                                                       for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                                                               if (tdElm != lastTDElm) {\r
+                                                                       var sd = getColRowSpan(tdElm);\r
+\r
+                                                                       if (sd['rowspan'] == 1) {\r
+                                                                               var newTD = doc.createElement("td");\r
+\r
+                                                                               newTD.innerHTML = "&nbsp;";\r
+                                                                               newTD.colSpan = tdElm.colSpan;\r
+\r
+                                                                               newTR.appendChild(newTD);\r
+                                                                       } else\r
+                                                                               tdElm.rowSpan = sd['rowspan'] + 1;\r
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       trElm.parentNode.insertBefore(newTR, trElm);\r
+\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex + 1, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableInsertRowAfter":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+                                                       var newTR = doc.createElement("tr");\r
+                                                       var lastTDElm = null;\r
+\r
+                                                       // Create cells\r
+                                                       for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                                                               if (tdElm != lastTDElm) {\r
+                                                                       var sd = getColRowSpan(tdElm);\r
+\r
+                                                                       if (sd['rowspan'] == 1) {\r
+                                                                               var newTD = doc.createElement("td");\r
+\r
+                                                                               newTD.innerHTML = "&nbsp;";\r
+                                                                               newTD.colSpan = tdElm.colSpan;\r
+\r
+                                                                               newTR.appendChild(newTD);\r
+                                                                       } else\r
+                                                                               tdElm.rowSpan = sd['rowspan'] + 1;\r
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       if (newTR.hasChildNodes()) {\r
+                                                               var nextTR = nextElm(trElm, "TR");\r
+                                                               if (nextTR)\r
+                                                                       nextTR.parentNode.insertBefore(newTR, nextTR);\r
+                                                               else\r
+                                                                       tableElm.appendChild(newTR);\r
+                                                       }\r
+\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableDeleteRow":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+\r
+                                                       // Only one row, remove whole table\r
+                                                       if (grid.length == 1) {\r
+                                                               tableElm = tinyMCE.getParentElement(tableElm, "table"); // Look for table instead of tbody\r
+                                                               tableElm.parentNode.removeChild(tableElm);\r
+                                                               return true;\r
+                                                       }\r
+\r
+                                                       // Move down row spanned cells\r
+                                                       var cells = trElm.cells;\r
+                                                       var nextTR = nextElm(trElm, "TR");\r
+                                                       for (var x=0; x<cells.length; x++) {\r
+                                                               if (cells[x].rowSpan > 1) {\r
+                                                                       var newTD = cells[x].cloneNode(true);\r
+                                                                       var sd = getColRowSpan(cells[x]);\r
+\r
+                                                                       newTD.rowSpan = sd.rowspan - 1;\r
+\r
+                                                                       var nextTD = nextTR.cells[x];\r
+\r
+                                                                       if (nextTD == null)\r
+                                                                               nextTR.appendChild(newTD);\r
+                                                                       else\r
+                                                                               nextTR.insertBefore(newTD, nextTD);\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       // Delete cells\r
+                                                       var lastTDElm = null;\r
+                                                       for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                                                               if (tdElm != lastTDElm) {\r
+                                                                       var sd = getColRowSpan(tdElm);\r
+\r
+                                                                       if (sd.rowspan > 1) {\r
+                                                                               tdElm.rowSpan = sd.rowspan - 1;\r
+                                                                       } else {\r
+                                                                               trElm = tdElm.parentNode;\r
+\r
+                                                                               if (trElm.parentNode)\r
+                                                                                       trElm._delete = true;\r
+                                                                       }\r
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       deleteMarked(tableElm);\r
+\r
+                                                       cpos.rowindex--;\r
+                                                       if (cpos.rowindex < 0)\r
+                                                               cpos.rowindex = 0;\r
+\r
+                                                       // Recalculate grid and select\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, 0), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableInsertColBefore":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+                                                       var lastTDElm = null;\r
+\r
+                                                       for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                               if (tdElm != lastTDElm) {\r
+                                                                       var sd = getColRowSpan(tdElm);\r
+\r
+                                                                       if (sd['colspan'] == 1) {\r
+                                                                               var newTD = doc.createElement(tdElm.nodeName);\r
+\r
+                                                                               newTD.innerHTML = "&nbsp;";\r
+                                                                               newTD.rowSpan = tdElm.rowSpan;\r
+\r
+                                                                               tdElm.parentNode.insertBefore(newTD, tdElm);\r
+                                                                       } else\r
+                                                                               tdElm.colSpan++;\r
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex + 1), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableInsertColAfter":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+                                                       var lastTDElm = null;\r
+\r
+                                                       for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                               if (tdElm != lastTDElm) {\r
+                                                                       var sd = getColRowSpan(tdElm);\r
+\r
+                                                                       if (sd['colspan'] == 1) {\r
+                                                                               var newTD = doc.createElement(tdElm.nodeName);\r
+\r
+                                                                               newTD.innerHTML = "&nbsp;";\r
+                                                                               newTD.rowSpan = tdElm.rowSpan;\r
+\r
+                                                                               var nextTD = nextElm(tdElm, "TD,TH");\r
+                                                                               if (nextTD == null)\r
+                                                                                       tdElm.parentNode.appendChild(newTD);\r
+                                                                               else\r
+                                                                                       nextTD.parentNode.insertBefore(newTD, nextTD);\r
+                                                                       } else\r
+                                                                               tdElm.colSpan++;\r
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, cpos.cellindex), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                               case "mceTableDeleteCol":\r
+                                                       if (!trElm || !tdElm)\r
+                                                               return true;\r
+\r
+                                                       var grid = getTableGrid(tableElm);\r
+                                                       var cpos = getCellPos(grid, tdElm);\r
+                                                       var lastTDElm = null;\r
+\r
+                                                       // Only one col, remove whole table\r
+                                                       if (grid.length > 1 && grid[0].length <= 1) {\r
+                                                               tableElm = tinyMCE.getParentElement(tableElm, "table"); // Look for table instead of tbody\r
+                                                               tableElm.parentNode.removeChild(tableElm);\r
+                                                               return true;\r
+                                                       }\r
+\r
+                                                       // Delete cells\r
+                                                       for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {\r
+                                                               if (tdElm != lastTDElm) {\r
+                                                                       var sd = getColRowSpan(tdElm);\r
+\r
+                                                                       if (sd['colspan'] > 1)\r
+                                                                               tdElm.colSpan = sd['colspan'] - 1;\r
+                                                                       else {\r
+                                                                               if (tdElm.parentNode)\r
+                                                                                       tdElm.parentNode.removeChild(tdElm);\r
+                                                                       }\r
+\r
+                                                                       lastTDElm = tdElm;\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       cpos.cellindex--;\r
+                                                       if (cpos.cellindex < 0)\r
+                                                               cpos.cellindex = 0;\r
+\r
+                                                       // Recalculate grid and select\r
+                                                       grid = getTableGrid(tableElm);\r
+                                                       inst.selection.selectNode(getCell(grid, cpos.rowindex, 0), tinyMCE.isGecko, true); // Only collape on gecko\r
+                                               break;\r
+\r
+                                       case "mceTableSplitCells":\r
+                                               if (!trElm || !tdElm)\r
+                                                       return true;\r
+\r
+                                               var spandata = getColRowSpan(tdElm);\r
+\r
+                                               var colspan = spandata["colspan"];\r
+                                               var rowspan = spandata["rowspan"];\r
+\r
+                                               // Needs splitting\r
+                                               if (colspan > 1 || rowspan > 1) {\r
+                                                       // Generate cols\r
+                                                       tdElm.colSpan = 1;\r
+                                                       for (var i=1; i<colspan; i++) {\r
+                                                               var newTD = doc.createElement("td");\r
+\r
+                                                               newTD.innerHTML = "&nbsp;";\r
+\r
+                                                               trElm.insertBefore(newTD, nextElm(tdElm, "TD,TH"));\r
+\r
+                                                               if (rowspan > 1)\r
+                                                                       addRows(newTD, trElm, rowspan);\r
+                                                       }\r
+\r
+                                                       addRows(tdElm, trElm, rowspan);\r
+                                               }\r
+\r
+                                               // Apply visual aids\r
+                                               tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+                                               break;\r
+\r
+                                       case "mceTableMergeCells":\r
+                                               var rows = new Array();\r
+                                               var sel = inst.getSel();\r
+                                               var grid = getTableGrid(tableElm);\r
+\r
+                                               if (tinyMCE.isMSIE || sel.rangeCount == 1) {\r
+                                                       if (user_interface) {\r
+                                                               // Setup template\r
+                                                               var template = new Array();\r
+                                                               var sp = getColRowSpan(tdElm);\r
+\r
+                                                               template['file'] = '../../plugins/table/merge_cells.htm';\r
+                                                               template['width'] = 250;\r
+                                                               template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0);\r
+\r
+                                                               // Language specific width and height addons\r
+                                                               template['width'] += tinyMCE.getLang('lang_table_merge_cells_delta_width', 0);\r
+                                                               template['height'] += tinyMCE.getLang('lang_table_merge_cells_delta_height', 0);\r
+\r
+                                                               // Open window\r
+                                                               tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : "update", numcols : sp.colspan, numrows : sp.rowspan});\r
+\r
+                                                               return true;\r
+                                                       } else {\r
+                                                               var numRows = parseInt(value['numrows']);\r
+                                                               var numCols = parseInt(value['numcols']);\r
+                                                               var cpos = getCellPos(grid, tdElm);\r
+\r
+                                                               if (("" + numRows) == "NaN")\r
+                                                                       numRows = 1;\r
+\r
+                                                               if (("" + numCols) == "NaN")\r
+                                                                       numCols = 1;\r
+\r
+                                                               // Get rows and cells\r
+                                                               var tRows = tableElm.rows;\r
+                                                               for (var y=cpos.rowindex; y<grid.length; y++) {\r
+                                                                       var rowCells = new Array();\r
+\r
+                                                                       for (var x=cpos.cellindex; x<grid[y].length; x++) {\r
+                                                                               var td = getCell(grid, y, x);\r
+\r
+                                                                               if (td && !inArray(rows, td) && !inArray(rowCells, td)) {\r
+                                                                                       var cp = getCellPos(grid, td);\r
+\r
+                                                                                       // Within range\r
+                                                                                       if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)\r
+                                                                                               rowCells[rowCells.length] = td;\r
+                                                                               }\r
+                                                                       }\r
+\r
+                                                                       if (rowCells.length > 0)\r
+                                                                               rows[rows.length] = rowCells;\r
+                                                               }\r
+\r
+                                                               //return true;\r
+                                                       }\r
+                                               } else {\r
+                                                       var cells = new Array();\r
+                                                       var sel = inst.getSel();\r
+                                                       var lastTR = null;\r
+                                                       var curRow = null;\r
+                                                       var x1 = -1, y1 = -1, x2, y2;\r
+\r
+                                                       // Only one cell selected, whats the point?\r
+                                                       if (sel.rangeCount < 2)\r
+                                                               return true;\r
+\r
+                                                       // Get all selected cells\r
+                                                       for (var i=0; i<sel.rangeCount; i++) {\r
+                                                               var rng = sel.getRangeAt(i);\r
+                                                               var tdElm = rng.startContainer.childNodes[rng.startOffset];\r
+\r
+                                                               if (!tdElm)\r
+                                                                       break;\r
+\r
+                                                               if (tdElm.nodeName == "TD")\r
+                                                                       cells[cells.length] = tdElm;\r
+                                                       }\r
+\r
+                                                       // Get rows and cells\r
+                                                       var tRows = tableElm.rows;\r
+                                                       for (var y=0; y<tRows.length; y++) {\r
+                                                               var rowCells = new Array();\r
+\r
+                                                               for (var x=0; x<tRows[y].cells.length; x++) {\r
+                                                                       var td = tRows[y].cells[x];\r
+\r
+                                                                       for (var i=0; i<cells.length; i++) {\r
+                                                                               if (td == cells[i]) {\r
+                                                                                       rowCells[rowCells.length] = td;\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+\r
+                                                               if (rowCells.length > 0)\r
+                                                                       rows[rows.length] = rowCells;\r
+                                                       }\r
+\r
+                                                       // Find selected cells in grid and box\r
+                                                       var curRow = new Array();\r
+                                                       var lastTR = null;\r
+                                                       for (var y=0; y<grid.length; y++) {\r
+                                                               for (var x=0; x<grid[y].length; x++) {\r
+                                                                       grid[y][x]._selected = false;\r
+\r
+                                                                       for (var i=0; i<cells.length; i++) {\r
+                                                                               if (grid[y][x] == cells[i]) {\r
+                                                                                       // Get start pos\r
+                                                                                       if (x1 == -1) {\r
+                                                                                               x1 = x;\r
+                                                                                               y1 = y;\r
+                                                                                       }\r
+\r
+                                                                                       // Get end pos\r
+                                                                                       x2 = x;\r
+                                                                                       y2 = y;\r
+\r
+                                                                                       grid[y][x]._selected = true;\r
+                                                                               }\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+\r
+                                                       // Is there gaps, if so deny\r
+                                                       for (var y=y1; y<=y2; y++) {\r
+                                                               for (var x=x1; x<=x2; x++) {\r
+                                                                       if (!grid[y][x]._selected) {\r
+                                                                               alert("Invalid selection for merge.");\r
+                                                                               return true;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               // Validate selection and get total rowspan and colspan\r
+                                               var rowSpan = 1, colSpan = 1;\r
+\r
+                                               // Validate horizontal and get total colspan\r
+                                               var lastRowSpan = -1;\r
+                                               for (var y=0; y<rows.length; y++) {\r
+                                                       var rowColSpan = 0;\r
+\r
+                                                       for (var x=0; x<rows[y].length; x++) {\r
+                                                               var sd = getColRowSpan(rows[y][x]);\r
+\r
+                                                               rowColSpan += sd['colspan'];\r
+\r
+                                                               if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {\r
+                                                                       alert("Invalid selection for merge.");\r
+                                                                       return true;\r
+                                                               }\r
+\r
+                                                               lastRowSpan = sd['rowspan'];\r
+                                                       }\r
+\r
+                                                       if (rowColSpan > colSpan)\r
+                                                               colSpan = rowColSpan;\r
+\r
+                                                       lastRowSpan = -1;\r
+                                               }\r
+\r
+                                               // Validate vertical and get total rowspan\r
+                                               var lastColSpan = -1;\r
+                                               for (var x=0; x<rows[0].length; x++) {\r
+                                                       var colRowSpan = 0;\r
+\r
+                                                       for (var y=0; y<rows.length; y++) {\r
+                                                               var sd = getColRowSpan(rows[y][x]);\r
+\r
+                                                               colRowSpan += sd['rowspan'];\r
+\r
+                                                               if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {\r
+                                                                       alert("Invalid selection for merge.");\r
+                                                                       return true;\r
+                                                               }\r
+\r
+                                                               lastColSpan = sd['colspan'];\r
+                                                       }\r
+\r
+                                                       if (colRowSpan > rowSpan)\r
+                                                               rowSpan = colRowSpan;\r
+\r
+                                                       lastColSpan = -1;\r
+                                               }\r
+\r
+                                               // Setup td\r
+                                               tdElm = rows[0][0];\r
+                                               tdElm.rowSpan = rowSpan;\r
+                                               tdElm.colSpan = colSpan;\r
+\r
+                                               // Merge cells\r
+                                               for (var y=0; y<rows.length; y++) {\r
+                                                       for (var x=0; x<rows[y].length; x++) {\r
+                                                               var html = rows[y][x].innerHTML;\r
+                                                               var chk = tinyMCE.regexpReplace(html, "[ \t\r\n]", "");\r
+\r
+                                                               if (chk != "<br/>" && chk != "<br>" && chk != "&nbsp;" && (x+y > 0))\r
+                                                                       tdElm.innerHTML += html;\r
+\r
+                                                               // Not current cell\r
+                                                               if (rows[y][x] != tdElm && !rows[y][x]._deleted) {\r
+                                                                       var cpos = getCellPos(grid, rows[y][x]);\r
+                                                                       var tr = rows[y][x].parentNode;\r
+\r
+                                                                       tr.removeChild(rows[y][x]);\r
+                                                                       rows[y][x]._deleted = true;\r
+\r
+                                                                       // Empty TR, remove it\r
+                                                                       if (!tr.hasChildNodes()) {\r
+                                                                               tr.parentNode.removeChild(tr);\r
+\r
+                                                                               var lastCell = null;\r
+                                                                               for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) {\r
+                                                                                       if (cellElm != lastCell && cellElm.rowSpan > 1)\r
+                                                                                               cellElm.rowSpan--;\r
+\r
+                                                                                       lastCell = cellElm;\r
+                                                                               }\r
+\r
+                                                                               if (tdElm.rowSpan > 1)\r
+                                                                                       tdElm.rowSpan--;\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               break;\r
+                                       }\r
+\r
+                                       tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+                                       tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance);\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       inst.repaint();\r
+                               }\r
+\r
+                       return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("table", TinyMCE_TablePlugin);\r
diff --git a/media/tiny_mce/plugins/table/images/buttons.gif b/media/tiny_mce/plugins/table/images/buttons.gif
new file mode 100755 (executable)
index 0000000..56a7396
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/buttons.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table.gif b/media/tiny_mce/plugins/table/images/table.gif
new file mode 100755 (executable)
index 0000000..2911830
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_cell_props.gif b/media/tiny_mce/plugins/table/images/table_cell_props.gif
new file mode 100755 (executable)
index 0000000..bee7ed6
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_cell_props.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_delete.gif b/media/tiny_mce/plugins/table/images/table_delete.gif
new file mode 100755 (executable)
index 0000000..2a00e6a
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_delete.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_delete_col.gif b/media/tiny_mce/plugins/table/images/table_delete_col.gif
new file mode 100755 (executable)
index 0000000..260aa04
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_delete_col.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_delete_row.gif b/media/tiny_mce/plugins/table/images/table_delete_row.gif
new file mode 100755 (executable)
index 0000000..2fb5f2b
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_delete_row.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_insert_col_after.gif b/media/tiny_mce/plugins/table/images/table_insert_col_after.gif
new file mode 100755 (executable)
index 0000000..8505808
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_insert_col_after.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_insert_col_before.gif b/media/tiny_mce/plugins/table/images/table_insert_col_before.gif
new file mode 100755 (executable)
index 0000000..b669d4f
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_insert_col_before.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_insert_row_after.gif b/media/tiny_mce/plugins/table/images/table_insert_row_after.gif
new file mode 100755 (executable)
index 0000000..b9c1446
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_insert_row_after.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_insert_row_before.gif b/media/tiny_mce/plugins/table/images/table_insert_row_before.gif
new file mode 100755 (executable)
index 0000000..157d373
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_insert_row_before.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_merge_cells.gif b/media/tiny_mce/plugins/table/images/table_merge_cells.gif
new file mode 100755 (executable)
index 0000000..6834e61
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_merge_cells.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_row_props.gif b/media/tiny_mce/plugins/table/images/table_row_props.gif
new file mode 100755 (executable)
index 0000000..e5c7cc3
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_row_props.gif differ
diff --git a/media/tiny_mce/plugins/table/images/table_split_cells.gif b/media/tiny_mce/plugins/table/images/table_split_cells.gif
new file mode 100755 (executable)
index 0000000..8ccb1b5
Binary files /dev/null and b/media/tiny_mce/plugins/table/images/table_split_cells.gif differ
diff --git a/media/tiny_mce/plugins/table/jscripts/cell.js b/media/tiny_mce/plugins/table/jscripts/cell.js
new file mode 100755 (executable)
index 0000000..436eaad
--- /dev/null
@@ -0,0 +1,249 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor')\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(tinyMCE.getAttrib(tdElm, "style"));\r
+\r
+       // Get table cell data\r
+       var celltype = tdElm.nodeName.toLowerCase();\r
+       var align = tinyMCE.getAttrib(tdElm, 'align');\r
+       var valign = tinyMCE.getAttrib(tdElm, 'valign');\r
+       var width = trimSize(getStyle(tdElm, 'width', 'width'));\r
+       var height = trimSize(getStyle(tdElm, 'height', 'height'));\r
+       var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor'));\r
+       var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor'));\r
+       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tdElm, 'class'), false);\r
+       var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var id = tinyMCE.getAttrib(tdElm, 'id');\r
+       var lang = tinyMCE.getAttrib(tdElm, 'lang');\r
+       var dir = tinyMCE.getAttrib(tdElm, 'dir');\r
+       var scope = tinyMCE.getAttrib(tdElm, 'scope');\r
+\r
+       // Setup form\r
+       addClassesToList('class', 'table_cell_styles');\r
+       formObj.bordercolor.value = bordercolor;\r
+       formObj.bgcolor.value = bgcolor;\r
+       formObj.backgroundimage.value = backgroundimage;\r
+       formObj.width.value = width;\r
+       formObj.height.value = height;\r
+       formObj.id.value = id;\r
+       formObj.lang.value = lang;\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'valign', valign);\r
+       selectByValue(formObj, 'class', className);\r
+       selectByValue(formObj, 'celltype', celltype);\r
+       selectByValue(formObj, 'dir', dir);\r
+       selectByValue(formObj, 'scope', scope);\r
+\r
+       // Resize some elements\r
+       if (isVisible('backgroundimagebrowser'))\r
+               document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+       updateColor('bordercolor_pick', 'bordercolor');\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+}\r
+\r
+function updateAction() {\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");\r
+       var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");\r
+       var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+       var formObj = document.forms[0];\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+\r
+       switch (getSelectValue(formObj, 'action')) {\r
+               case "cell":\r
+                       var celltype = getSelectValue(formObj, 'celltype');\r
+                       var scope = getSelectValue(formObj, 'scope');\r
+\r
+                       if (tinyMCE.getParam("accessibility_warnings")) {\r
+                               if (celltype == "th" && scope == "")\r
+                                       var answer = confirm(tinyMCE.getLang('lang_table_missing_scope', '', true));\r
+                               else\r
+                                       var answer = true;\r
+\r
+                               if (!answer)\r
+                                       return;\r
+                       }\r
+\r
+                       updateCell(tdElm);\r
+                       break;\r
+\r
+               case "row":\r
+                       var cell = trElm.firstChild;\r
+\r
+                       if (cell.nodeName != "TD" && cell.nodeName != "TH")\r
+                               cell = nextCell(cell);\r
+\r
+                       do {\r
+                               cell = updateCell(cell, true);\r
+                       } while ((cell = nextCell(cell)) != null);\r
+\r
+                       break;\r
+\r
+               case "all":\r
+                       var rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       for (var i=0; i<rows.length; i++) {\r
+                               var cell = rows[i].firstChild;\r
+\r
+                               if (cell.nodeName != "TD" && cell.nodeName != "TH")\r
+                                       cell = nextCell(cell);\r
+\r
+                               do {\r
+                                       cell = updateCell(cell, true);\r
+                               } while ((cell = nextCell(cell)) != null);\r
+                       }\r
+\r
+                       break;\r
+       }\r
+\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       tinyMCE.triggerNodeChange();\r
+       inst.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function nextCell(elm) {\r
+       while ((elm = elm.nextSibling) != null) {\r
+               if (elm.nodeName == "TD" || elm.nodeName == "TH")\r
+                       return elm;\r
+       }\r
+\r
+       return null;\r
+}\r
+\r
+function updateCell(td, skip_id) {\r
+       var inst = tinyMCE.selectedInstance;\r
+       var formObj = document.forms[0];\r
+       var curCellType = td.nodeName.toLowerCase();\r
+       var celltype = getSelectValue(formObj, 'celltype');\r
+       var doc = inst.getDoc();\r
+\r
+       if (!skip_id)\r
+               td.setAttribute('id', formObj.id.value);\r
+\r
+       td.setAttribute('align', formObj.align.value);\r
+       td.setAttribute('vAlign', formObj.valign.value);\r
+       td.setAttribute('lang', formObj.lang.value);\r
+       td.setAttribute('dir', getSelectValue(formObj, 'dir'));\r
+       td.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));\r
+       td.setAttribute('scope', formObj.scope.value);\r
+       tinyMCE.setAttrib(td, 'class', getSelectValue(formObj, 'class'));\r
+\r
+       // Clear deprecated attributes\r
+       tinyMCE.setAttrib(td, 'width', '');\r
+       tinyMCE.setAttrib(td, 'height', '');\r
+       tinyMCE.setAttrib(td, 'bgColor', '');\r
+       tinyMCE.setAttrib(td, 'borderColor', '');\r
+       tinyMCE.setAttrib(td, 'background', '');\r
+\r
+       // Set styles\r
+       td.style.width = getCSSSize(formObj.width.value);\r
+       td.style.height = getCSSSize(formObj.height.value);\r
+       if (formObj.bordercolor.value != "") {\r
+               td.style.borderColor = formObj.bordercolor.value;\r
+               td.style.borderStyle = td.style.borderStyle == "" ? "solid" : td.style.borderStyle;\r
+               td.style.borderWidth = td.style.borderWidth == "" ? "1px" : td.style.borderWidth;\r
+       } else\r
+               td.style.borderColor = '';\r
+\r
+       td.style.backgroundColor = formObj.bgcolor.value;\r
+\r
+       if (formObj.backgroundimage.value != "")\r
+               td.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";\r
+       else\r
+               td.style.backgroundImage = '';\r
+\r
+       if (curCellType != celltype) {\r
+               // changing to a different node type\r
+               var newCell = doc.createElement(celltype);\r
+\r
+               for (var c=0; c<td.childNodes.length; c++)\r
+                       newCell.appendChild(td.childNodes[c].cloneNode(1));\r
+\r
+               for (var a=0; a<td.attributes.length; a++) {\r
+                       var attr = td.attributes[a];\r
+                       newCell.setAttribute(attr.name, attr.value);\r
+               }\r
+\r
+               td.parentNode.replaceChild(newCell, td);\r
+               td = newCell;\r
+       }\r
+\r
+       return td;\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       var width = formObj.width.value;\r
+       if (width != "")\r
+               st['width'] = getCSSSize(width);\r
+       else\r
+               st['width'] = "";\r
+\r
+       var height = formObj.height.value;\r
+       if (height != "")\r
+               st['height'] = getCSSSize(height);\r
+       else\r
+               st['height'] = "";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+       st['border-color'] = formObj.bordercolor.value;\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       else\r
+               formObj.backgroundimage.value = '';\r
+\r
+       if (st['width'])\r
+               formObj.width.value = trimSize(st['width']);\r
+\r
+       if (st['height'])\r
+               formObj.height.value = trimSize(st['height']);\r
+\r
+       if (st['background-color']) {\r
+               formObj.bgcolor.value = st['background-color'];\r
+               updateColor('bgcolor_pick','bgcolor');\r
+       }\r
+\r
+       if (st['border-color']) {\r
+               formObj.bordercolor.value = st['border-color'];\r
+               updateColor('bordercolor_pick','bordercolor');\r
+       }\r
+}\r
diff --git a/media/tiny_mce/plugins/table/jscripts/merge_cells.js b/media/tiny_mce/plugins/table/jscripts/merge_cells.js
new file mode 100755 (executable)
index 0000000..06cbb27
--- /dev/null
@@ -0,0 +1,24 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       formObj.numcols.value = tinyMCE.getWindowArg('numcols', 1);\r
+       formObj.numrows.value = tinyMCE.getWindowArg('numrows', 1);\r
+}\r
+\r
+function mergeCells() {\r
+       var args = new Array();\r
+       var formObj = document.forms[0];\r
+\r
+       if (!AutoValidator.validate(formObj)) {\r
+               alert(tinyMCE.getLang('lang_invalid_data'));\r
+               return false;\r
+       }\r
+\r
+       args["numcols"] = formObj.numcols.value;\r
+       args["numrows"] = formObj.numrows.value;\r
+\r
+       tinyMCEPopup.execCommand("mceTableMergeCells", false, args);\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/media/tiny_mce/plugins/table/jscripts/row.js b/media/tiny_mce/plugins/table/jscripts/row.js
new file mode 100755 (executable)
index 0000000..395ddf0
--- /dev/null
@@ -0,0 +1,200 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(tinyMCE.getAttrib(trElm, "style"));\r
+\r
+       // Get table row data\r
+       var rowtype = trElm.parentNode.nodeName.toLowerCase();\r
+       var align = tinyMCE.getAttrib(trElm, 'align');\r
+       var valign = tinyMCE.getAttrib(trElm, 'valign');\r
+       var height = trimSize(getStyle(trElm, 'height', 'height'));\r
+       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(trElm, 'class'), false);\r
+       var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor'));\r
+       var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;\r
+       var id = tinyMCE.getAttrib(trElm, 'id');\r
+       var lang = tinyMCE.getAttrib(trElm, 'lang');\r
+       var dir = tinyMCE.getAttrib(trElm, 'dir');\r
+\r
+       // Setup form\r
+       addClassesToList('class', 'table_row_styles');\r
+       formObj.bgcolor.value = bgcolor;\r
+       formObj.backgroundimage.value = backgroundimage;\r
+       formObj.height.value = height;\r
+       formObj.id.value = id;\r
+       formObj.lang.value = lang;\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'valign', valign);\r
+       selectByValue(formObj, 'class', className);\r
+       selectByValue(formObj, 'rowtype', rowtype);\r
+       selectByValue(formObj, 'dir', dir);\r
+\r
+       // Resize some elements\r
+       if (isVisible('backgroundimagebrowser'))\r
+               document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+}\r
+\r
+function updateAction() {\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       var inst = tinyMCE.selectedInstance;\r
+       var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");\r
+       var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+       var formObj = document.forms[0];\r
+       var action = getSelectValue(formObj, 'action');\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+\r
+       switch (action) {\r
+               case "row":\r
+                       updateRow(trElm);\r
+                       break;\r
+\r
+               case "all":\r
+                       var rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       for (var i=0; i<rows.length; i++)\r
+                               updateRow(rows[i], true);\r
+\r
+                       break;\r
+\r
+               case "odd":\r
+               case "even":\r
+                       var rows = tableElm.getElementsByTagName("tr");\r
+\r
+                       for (var i=0; i<rows.length; i++) {\r
+                               if ((i % 2 == 0 && action == "odd") || (i % 2 != 0 && action == "even"))\r
+                                       updateRow(rows[i], true, true);\r
+                       }\r
+\r
+                       break;\r
+       }\r
+\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       tinyMCE.triggerNodeChange();\r
+       inst.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function updateRow(tr_elm, skip_id, skip_parent) {\r
+       var inst = tinyMCE.selectedInstance;\r
+       var formObj = document.forms[0];\r
+       var curRowType = tr_elm.parentNode.nodeName.toLowerCase();\r
+       var rowtype = getSelectValue(formObj, 'rowtype');\r
+       var doc = inst.getDoc();\r
+\r
+       // Update row element\r
+       if (!skip_id)\r
+               tr_elm.setAttribute('id', formObj.id.value);\r
+\r
+       tr_elm.setAttribute('align', getSelectValue(formObj, 'align'));\r
+       tr_elm.setAttribute('vAlign', getSelectValue(formObj, 'valign'));\r
+       tr_elm.setAttribute('lang', formObj.lang.value);\r
+       tr_elm.setAttribute('dir', getSelectValue(formObj, 'dir'));\r
+       tr_elm.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));\r
+       tinyMCE.setAttrib(tr_elm, 'class', getSelectValue(formObj, 'class'));\r
+\r
+       // Clear deprecated attributes\r
+       tr_elm.setAttribute('background', '');\r
+       tr_elm.setAttribute('bgColor', '');\r
+       tr_elm.setAttribute('height', '');\r
+\r
+       // Set styles\r
+       tr_elm.style.height = getCSSSize(formObj.height.value);\r
+       tr_elm.style.backgroundColor = formObj.bgcolor.value;\r
+\r
+       if (formObj.backgroundimage.value != "")\r
+               tr_elm.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";\r
+       else\r
+               tr_elm.style.backgroundImage = '';\r
+\r
+       // Setup new rowtype\r
+       if (curRowType != rowtype && !skip_parent) {\r
+               // first, clone the node we are working on\r
+               var newRow = tr_elm.cloneNode(1);\r
+\r
+               // next, find the parent of its new destination (creating it if necessary)\r
+               var theTable = tinyMCE.getParentElement(tr_elm, "table");\r
+               var dest = rowtype;\r
+               var newParent = null;\r
+               for (var i = 0; i < theTable.childNodes.length; i++) {\r
+                       if (theTable.childNodes[i].nodeName.toLowerCase() == dest)\r
+                               newParent = theTable.childNodes[i];\r
+               }\r
+\r
+               if (newParent == null) {\r
+                       newParent = doc.createElement(dest);\r
+\r
+                       if (dest == "thead")\r
+                               theTable.insertBefore(newParent, theTable.firstChild);\r
+                       else\r
+                               theTable.appendChild(newParent);\r
+               }\r
+\r
+               // append the row to the new parent\r
+               newParent.appendChild(newRow);\r
+\r
+               // remove the original\r
+               tr_elm.parentNode.removeChild(tr_elm);\r
+\r
+               // set tr_elm to the new node\r
+               tr_elm = newRow;\r
+       }\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       else\r
+               formObj.backgroundimage.value = '';\r
+\r
+       if (st['height'])\r
+               formObj.height.value = trimSize(st['height']);\r
+\r
+       if (st['background-color']) {\r
+               formObj.bgcolor.value = st['background-color'];\r
+               updateColor('bgcolor_pick','bgcolor');\r
+       }\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       var height = formObj.height.value;\r
+       if (height != "")\r
+               st['height'] = getCSSSize(height);\r
+       else\r
+               st['height'] = "";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
diff --git a/media/tiny_mce/plugins/table/jscripts/table.js b/media/tiny_mce/plugins/table/jscripts/table.js
new file mode 100755 (executable)
index 0000000..4a0ee3b
--- /dev/null
@@ -0,0 +1,364 @@
+var action, orgTableWidth, orgTableHeight;\r
+\r
+function insertTable() {\r
+       var formObj = document.forms[0];\r
+       var inst = tinyMCE.selectedInstance;\r
+       var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption;\r
+       var html = '', capEl;\r
+       var elm = tinyMCE.tableElm;\r
+       var cellLimit, rowLimit, colLimit;\r
+\r
+       if (!AutoValidator.validate(formObj)) {\r
+               alert(tinyMCE.getLang('lang_invalid_data'));\r
+               return false;\r
+       }\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+\r
+       // Get form data\r
+       cols = formObj.elements['cols'].value;\r
+       rows = formObj.elements['rows'].value;\r
+       border = formObj.elements['border'].value != "" ? formObj.elements['border'].value  : 0;\r
+       cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : "";\r
+       cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : "";\r
+       align = formObj.elements['align'].options[formObj.elements['align'].selectedIndex].value;\r
+       width = formObj.elements['width'].value;\r
+       height = formObj.elements['height'].value;\r
+       bordercolor = formObj.elements['bordercolor'].value;\r
+       bgcolor = formObj.elements['bgcolor'].value;\r
+       className = formObj.elements['class'].options[formObj.elements['class'].selectedIndex].value;\r
+       id = formObj.elements['id'].value;\r
+       summary = formObj.elements['summary'].value;\r
+       style = formObj.elements['style'].value;\r
+       dir = formObj.elements['dir'].value;\r
+       lang = formObj.elements['lang'].value;\r
+       background = formObj.elements['backgroundimage'].value;\r
+       caption = formObj.elements['caption'].checked;\r
+\r
+       cellLimit = tinyMCE.getParam('table_cell_limit', false);\r
+       rowLimit = tinyMCE.getParam('table_row_limit', false);\r
+       colLimit = tinyMCE.getParam('table_col_limit', false);\r
+\r
+       // Validate table size\r
+       if (colLimit && cols > colLimit) {\r
+               alert(tinyMCE.getLang('lang_table_col_limit', '', true, {cols : colLimit}));\r
+               return false;\r
+       } else if (rowLimit && rows > rowLimit) {\r
+               alert(tinyMCE.getLang('lang_table_row_limit', '', true, {rows : rowLimit}));\r
+               return false;\r
+       } else if (cellLimit && cols * rows > cellLimit) {\r
+               alert(tinyMCE.getLang('lang_table_cell_limit', '', true, {cells : cellLimit}));\r
+               return false;\r
+       }\r
+\r
+       // Update table\r
+       if (action == "update") {\r
+               inst.execCommand('mceBeginUndoLevel');\r
+\r
+               tinyMCE.setAttrib(elm, 'cellPadding', cellpadding, true);\r
+               tinyMCE.setAttrib(elm, 'cellSpacing', cellspacing, true);\r
+               tinyMCE.setAttrib(elm, 'border', border, true);\r
+               tinyMCE.setAttrib(elm, 'align', align);\r
+               tinyMCE.setAttrib(elm, 'class', className);\r
+               tinyMCE.setAttrib(elm, 'style', style);\r
+               tinyMCE.setAttrib(elm, 'id', id);\r
+               tinyMCE.setAttrib(elm, 'summary', summary);\r
+               tinyMCE.setAttrib(elm, 'dir', dir);\r
+               tinyMCE.setAttrib(elm, 'lang', lang);\r
+\r
+               capEl = elm.getElementsByTagName('caption')[0];\r
+\r
+               if (capEl && !caption)\r
+                       capEl.parentNode.removeChild(capEl);\r
+\r
+               if (!capEl && caption) {\r
+                       capEl = elm.ownerDocument.createElement('caption');\r
+                       capEl.innerHTML = '&nbsp;';\r
+                       elm.insertBefore(capEl, elm.firstChild);\r
+               }\r
+\r
+               // Not inline styles\r
+               if (!tinyMCE.getParam("inline_styles"))\r
+                       tinyMCE.setAttrib(elm, 'width', width, true);\r
+\r
+               // Remove these since they are not valid XHTML\r
+               tinyMCE.setAttrib(elm, 'borderColor', '');\r
+               tinyMCE.setAttrib(elm, 'bgColor', '');\r
+               tinyMCE.setAttrib(elm, 'background', '');\r
+               tinyMCE.setAttrib(elm, 'height', '');\r
+\r
+               if (background != '')\r
+                       elm.style.backgroundImage = "url('" + background + "')";\r
+               else\r
+                       elm.style.backgroundImage = '';\r
+\r
+               if (tinyMCE.getParam("inline_styles"))\r
+                       elm.style.borderWidth = border + "px";\r
+\r
+               if (tinyMCE.getParam("inline_styles")) {\r
+                       if (width != '')\r
+                               elm.style.width = getCSSSize(width);\r
+               }\r
+\r
+               if (bordercolor != "") {\r
+                       elm.style.borderColor = bordercolor;\r
+                       elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;\r
+                       elm.style.borderWidth = border == "" ? "1px" : border;\r
+               } else\r
+                       elm.style.borderColor = '';\r
+\r
+               elm.style.backgroundColor = bgcolor;\r
+               elm.style.height = getCSSSize(height);\r
+\r
+               tinyMCE.handleVisualAid(tinyMCE.tableElm, false, inst.visualAid, inst);\r
+\r
+               // Fix for stange MSIE align bug\r
+               tinyMCE.tableElm.outerHTML = tinyMCE.tableElm.outerHTML;\r
+\r
+               tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+               tinyMCE.triggerNodeChange();\r
+               inst.execCommand('mceEndUndoLevel');\r
+\r
+               // Repaint if dimensions changed\r
+               if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)\r
+                       inst.repaint();\r
+\r
+               tinyMCEPopup.close();\r
+               return true;\r
+       }\r
+\r
+       // Create new table\r
+       html += '<table';\r
+\r
+       html += makeAttrib('id', id);\r
+       html += makeAttrib('border', border);\r
+       html += makeAttrib('cellpadding', cellpadding);\r
+       html += makeAttrib('cellspacing', cellspacing);\r
+       html += makeAttrib('width', width);\r
+       //html += makeAttrib('height', height);\r
+       //html += makeAttrib('bordercolor', bordercolor);\r
+       //html += makeAttrib('bgcolor', bgcolor);\r
+       html += makeAttrib('align', align);\r
+       html += makeAttrib('class', tinyMCE.getVisualAidClass(className, border == 0));\r
+       html += makeAttrib('style', style);\r
+       html += makeAttrib('summary', summary);\r
+       html += makeAttrib('dir', dir);\r
+       html += makeAttrib('lang', lang);\r
+       html += '>';\r
+\r
+       if (caption)\r
+               html += '<caption>&nbsp;</caption>';\r
+\r
+       for (var y=0; y<rows; y++) {\r
+               html += "<tr>";\r
+\r
+               for (var x=0; x<cols; x++)\r
+                       html += '<td>&nbsp;</td>';\r
+\r
+               html += "</tr>";\r
+       }\r
+\r
+       html += "</table>";\r
+\r
+       inst.execCommand('mceBeginUndoLevel');\r
+       inst.execCommand('mceInsertContent', false, html);\r
+       tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual']);\r
+       inst.execCommand('mceEndUndoLevel');\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function makeAttrib(attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib];\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value == "")\r
+               return "";\r
+\r
+       // XML encode it\r
+       value = value.replace(/&/g, '&amp;');\r
+       value = value.replace(/\"/g, '&quot;');\r
+       value = value.replace(/</g, '&lt;');\r
+       value = value.replace(/>/g, '&gt;');\r
+\r
+       return ' ' + attrib + '="' + value + '"';\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');\r
+       document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');\r
+       document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');\r
+\r
+       var cols = 2, rows = 2, border = tinyMCE.getParam('table_default_border', '0'), cellpadding = tinyMCE.getParam('table_default_cellpadding', ''), cellspacing = tinyMCE.getParam('table_default_cellspacing', '');\r
+       var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";\r
+       var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "";\r
+       var inst = tinyMCE.selectedInstance;\r
+       var formObj = document.forms[0];\r
+       var elm = tinyMCE.getParentElement(inst.getFocusElement(), "table");\r
+\r
+       tinyMCE.tableElm = elm;\r
+       action = tinyMCE.getWindowArg('action');\r
+       if (action == null)\r
+               action = tinyMCE.tableElm ? "update" : "insert";\r
+\r
+       if (tinyMCE.tableElm && action != "insert") {\r
+               var rowsAr = tinyMCE.tableElm.rows;\r
+               var cols = 0;\r
+               for (var i=0; i<rowsAr.length; i++)\r
+                       if (rowsAr[i].cells.length > cols)\r
+                               cols = rowsAr[i].cells.length;\r
+\r
+               cols = cols;\r
+               rows = rowsAr.length;\r
+\r
+               st = tinyMCE.parseStyle(tinyMCE.getAttrib(tinyMCE.tableElm, "style"));\r
+               border = trimSize(getStyle(elm, 'border', 'borderWidth'));\r
+               cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', "");\r
+               cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', "");\r
+               width = trimSize(getStyle(elm, 'width', 'width'));\r
+               height = trimSize(getStyle(elm, 'height', 'height'));\r
+               bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor'));\r
+               bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor'));\r
+               align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align);\r
+               className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false);\r
+               id = tinyMCE.getAttrib(tinyMCE.tableElm, 'id');\r
+               summary = tinyMCE.getAttrib(tinyMCE.tableElm, 'summary');\r
+               style = tinyMCE.serializeStyle(st);\r
+               dir = tinyMCE.getAttrib(tinyMCE.tableElm, 'dir');\r
+               lang = tinyMCE.getAttrib(tinyMCE.tableElm, 'lang');\r
+               background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+               formObj.caption.checked = tinyMCE.tableElm.getElementsByTagName('caption').length > 0;\r
+\r
+               orgTableWidth = width;\r
+               orgTableHeight = height;\r
+\r
+               action = "update";\r
+       }\r
+\r
+       addClassesToList('class', "table_styles");\r
+\r
+       // Update form\r
+       selectByValue(formObj, 'align', align);\r
+       selectByValue(formObj, 'class', className);\r
+       formObj.cols.value = cols;\r
+       formObj.rows.value = rows;\r
+       formObj.border.value = border;\r
+       formObj.cellpadding.value = cellpadding;\r
+       formObj.cellspacing.value = cellspacing;\r
+       formObj.width.value = width;\r
+       formObj.height.value = height;\r
+       formObj.bordercolor.value = bordercolor;\r
+       formObj.bgcolor.value = bgcolor;\r
+       formObj.id.value = id;\r
+       formObj.summary.value = summary;\r
+       formObj.style.value = style;\r
+       formObj.dir.value = dir;\r
+       formObj.lang.value = lang;\r
+       formObj.backgroundimage.value = background;\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); \r
+\r
+       updateColor('bordercolor_pick', 'bordercolor');\r
+       updateColor('bgcolor_pick', 'bgcolor');\r
+\r
+       // Resize some elements\r
+       if (isVisible('backgroundimagebrowser'))\r
+               document.getElementById('backgroundimage').style.width = '180px';\r
+\r
+       // Disable some fields in update mode\r
+       if (action == "update") {\r
+               formObj.cols.disabled = true;\r
+               formObj.rows.disabled = true;\r
+       }\r
+}\r
+\r
+function changedSize() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       var width = formObj.width.value;\r
+       if (width != "")\r
+               st['width'] = tinyMCE.getParam("inline_styles") ? getCSSSize(width) : "";\r
+       else\r
+               st['width'] = "";\r
+\r
+       var height = formObj.height.value;\r
+       if (height != "")\r
+               st['height'] = getCSSSize(height);\r
+       else\r
+               st['height'] = "";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedBackgroundImage() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-image'] = "url('" + formObj.backgroundimage.value + "')";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedBorder() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       // Update border width if the element has a color\r
+       if (formObj.border.value != "" && formObj.bordercolor.value != "")\r
+               st['border-width'] = formObj.border.value + "px";\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedColor() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       st['background-color'] = formObj.bgcolor.value;\r
+\r
+       if (formObj.bordercolor.value != "") {\r
+               st['border-color'] = formObj.bordercolor.value;\r
+\r
+               // Add border-width if it's missing\r
+               if (!st['border-width'])\r
+                       st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px";\r
+       }\r
+\r
+       formObj.style.value = tinyMCE.serializeStyle(st);\r
+}\r
+\r
+function changedStyle() {\r
+       var formObj = document.forms[0];\r
+       var st = tinyMCE.parseStyle(formObj.style.value);\r
+\r
+       if (st['background-image'])\r
+               formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");\r
+       else\r
+               formObj.backgroundimage.value = '';\r
+\r
+       if (st['width'])\r
+               formObj.width.value = trimSize(st['width']);\r
+\r
+       if (st['height'])\r
+               formObj.height.value = trimSize(st['height']);\r
+\r
+       if (st['background-color']) {\r
+               formObj.bgcolor.value = st['background-color'];\r
+               updateColor('bgcolor_pick','bgcolor');\r
+       }\r
+\r
+       if (st['border-color']) {\r
+               formObj.bordercolor.value = st['border-color'];\r
+               updateColor('bordercolor_pick','bordercolor');\r
+       }\r
+}\r
diff --git a/media/tiny_mce/plugins/table/langs/en.js b/media/tiny_mce/plugins/table/langs/en.js
new file mode 100755 (executable)
index 0000000..e2fbba2
--- /dev/null
@@ -0,0 +1,79 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('table',{\r
+general_tab : 'General',\r
+advanced_tab : 'Advanced',\r
+general_props : 'General properties',\r
+advanced_props : 'Advanced properties',\r
+desc : 'Inserts a new table',\r
+row_before_desc : 'Insert row before',\r
+row_after_desc : 'Insert row after',\r
+delete_row_desc : 'Delete row',\r
+col_before_desc : 'Insert column before',\r
+col_after_desc : 'Insert column after',\r
+delete_col_desc : 'Remove column',\r
+rowtype : 'Row in table part',\r
+title : 'Insert/Modify table',\r
+width : 'Width',\r
+height : 'Height',\r
+cols : 'Columns',\r
+rows : 'Rows',\r
+cellspacing : 'Cellspacing',\r
+cellpadding : 'Cellpadding',\r
+border : 'Border',\r
+align : 'Alignment',\r
+align_default : 'Default',\r
+align_left : 'Left',\r
+align_right : 'Right',\r
+align_middle : 'Center',\r
+row_title : 'Table row properties',\r
+cell_title : 'Table cell properties',\r
+cell_type : 'Cell type',\r
+row_desc : 'Table row properties',\r
+cell_desc : 'Table cell properties',\r
+valign : 'Vertical alignment',\r
+align_top : 'Top',\r
+align_bottom : 'Bottom',\r
+props_desc : 'Table properties',\r
+bordercolor : 'Border color',\r
+bgcolor : 'Background color',\r
+merge_cells_title : 'Merge table cells',\r
+split_cells_desc : 'Split merged table cells',\r
+merge_cells_desc : 'Merge table cells',\r
+cut_row_desc : 'Cut table row',\r
+copy_row_desc : 'Copy table row',\r
+paste_row_before_desc : 'Paste table row before',\r
+paste_row_after_desc : 'Paste table row after',\r
+id : 'Id',\r
+style: 'Style',\r
+langdir : 'Language direction',\r
+langcode : 'Language code',\r
+mime : 'Target MIME type',\r
+ltr : 'Left to right',\r
+rtl : 'Right to left',\r
+bgimage : 'Background image',\r
+summary : 'Summary',\r
+td : "Data",\r
+th : "Header",\r
+cell_cell : 'Update current cell',\r
+cell_row : 'Update all cells in row',\r
+cell_all : 'Update all cells in table',\r
+row_row : 'Update current row',\r
+row_odd : 'Update odd rows in table',\r
+row_even : 'Update even rows in table',\r
+row_all : 'Update all rows in table',\r
+thead : 'Table Head',\r
+tbody : 'Table Body',\r
+tfoot : 'Table Foot',\r
+del : 'Delete table',\r
+scope : 'Scope',\r
+row : 'Row',\r
+col : 'Col',\r
+rowgroup : 'Row Group',\r
+colgroup : 'Col Group',\r
+col_limit : 'You\'ve exceeded the maximum number of columns of {$cols}.',\r
+row_limit : 'You\'ve exceeded the maximum number of rows of {$rows}.',\r
+cell_limit : 'You\'ve exceeded the maximum number of cells of {$cells}.',\r
+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.',\r
+caption : 'Table caption'\r
+});\r
diff --git a/media/tiny_mce/plugins/table/merge_cells.htm b/media/tiny_mce/plugins/table/merge_cells.htm
new file mode 100755 (executable)
index 0000000..10896bf
--- /dev/null
@@ -0,0 +1,38 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_merge_cells_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/merge_cells.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="margin: 8px" style="display: none">\r
+<form onsubmit="insertTable();return false;" action="#">\r
+       <fieldset>\r
+               <legend>{$lang_table_merge_cells_title}</legend>\r
+                 <table border="0" cellpadding="0" cellspacing="3" width="100%">\r
+                         <tr>\r
+                               <td>{$lang_table_cols}:</td>\r
+                               <td align="right"><input type="text" name="numcols" value="" class="number min1" style="width: 30px" /></td>\r
+                               <td>\r
+                         </tr>\r
+                         <tr>\r
+                               <td>{$lang_table_rows}:</td>\r
+                               <td align="right"><input type="text" name="numrows" value="" class="number min1" style="width: 30px" /></td>\r
+                         </tr>\r
+                 </table>\r
+       </fieldset>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="mergeCells();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/table/readme.txt b/media/tiny_mce/plugins/table/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/plugins/table/row.htm b/media/tiny_mce/plugins/table/row.htm
new file mode 100755 (executable)
index 0000000..64f2afc
--- /dev/null
@@ -0,0 +1,159 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_row_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/row.js"></script>\r
+       <link href="css/row.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="tablerow" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <form onsubmit="updateAction();return false;">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_table_general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_general_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="4" cellspacing="0">\r
+                                               <tr>\r
+                                                       <td><label for="rowtype">{$lang_table_rowtype}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="rowtype" name="rowtype">\r
+                                                                       <option value="thead">{$lang_table_thead}</option>\r
+                                                                       <option value="tbody">{$lang_table_tbody}</option>\r
+                                                                       <option value="tfoot">{$lang_table_tfoot}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="align">{$lang_table_align}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="align" name="align">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="center">{$lang_table_align_middle}</option>\r
+                                                                       <option value="left">{$lang_table_align_left}</option>\r
+                                                                       <option value="right">{$lang_table_align_right}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="valign">{$lang_table_valign}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="valign" name="valign">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="top">{$lang_table_align_top}</option>\r
+                                                                       <option value="middle">{$lang_table_align_middle}</option>\r
+                                                                       <option value="bottom">{$lang_table_align_bottom}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr id="styleSelectRow">\r
+                                                       <td><label for="class">{$lang_class_name}</label></td>\r
+                                                       <td class="col2">\r
+                                                               <select id="class" name="class">\r
+                                                                       <option value="" selected="selected">{$lang_not_set}</option>\r
+                                                               </select>\r
+                                                       </td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="height">{$lang_table_height}</label></td>\r
+                                                       <td class="col2"><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" /></td>\r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="id">{$lang_table_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="style">{$lang_table_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{$lang_table_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" style="width: 200px"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_table_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_table_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="lang">{$lang_table_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" style="width: 200px" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div>\r
+                               <select id="action" name="action">\r
+                                       <option value="row">{$lang_table_row_row}</option>\r
+                                       <option value="odd">{$lang_table_row_odd}</option>\r
+                                       <option value="even">{$lang_table_row_even}</option>\r
+                                       <option value="all">{$lang_table_row_all}</option>\r
+                               </select>\r
+                       </div>\r
+\r
+                       <div style="float: left">\r
+                               <div><input type="button" id="insert" name="insert" value="{$lang_update}" onclick="updateAction();" /></div>\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/table/table.htm b/media/tiny_mce/plugins/table/table.htm
new file mode 100755 (executable)
index 0000000..6c722db
--- /dev/null
@@ -0,0 +1,160 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_table_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/table.js"></script>\r
+       <link href="css/table.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="table" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <form onsubmit="insertTable();return false;" action="#">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_table_general_tab}</a></span></li>\r
+                               <li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{$lang_table_advanced_tab}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_general_props}</legend>\r
+\r
+                                         <table border="0" cellpadding="4" cellspacing="0" width="100%">\r
+                                                         <tr>\r
+                                                               <td><label id="colslabel" for="cols">{$lang_table_cols}</label></td>\r
+                                                               <td><input id="cols" name="cols" type="text" value="" size="3" maxlength="3" class="required number min1" /></td>\r
+                                                               <td><label id="rowslabel" for="rows">{$lang_table_rows}</label></td>\r
+                                                               <td><input id="rows" name="rows" type="text" value="" size="3" maxlength="3" class="required number min1" /></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td><label id="cellpaddinglabel" for="cellpadding">{$lang_table_cellpadding}</label></td>\r
+                                                               <td><input id="cellpadding" name="cellpadding" type="text" value="" size="3" maxlength="3" class="number" /></td>\r
+                                                               <td><label id="cellspacinglabel" for="cellspacing">{$lang_table_cellspacing}</label></td>\r
+                                                               <td><input id="cellspacing" name="cellspacing" type="text" value="" size="3" maxlength="3" class="number" /></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td><label id="alignlabel" for="align">{$lang_table_align}</label></td>\r
+                                                               <td><select id="align" name="align">\r
+                                                                       <option value="">{$lang_not_set}</option>\r
+                                                                       <option value="center">{$lang_table_align_middle}</option>\r
+                                                                       <option value="left">{$lang_table_align_left}</option>\r
+                                                                       <option value="right">{$lang_table_align_right}</option>\r
+                                                                 </select></td>\r
+                                                               <td><label id="borderlabel" for="border">{$lang_table_border}</label></td>\r
+                                                               <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="changedBorder();" class="number" /></td>\r
+                                                         </tr>\r
+                                                         <tr id="width_row">\r
+                                                               <td><label id="widthlabel" for="width">{$lang_table_width}</label></td>\r
+                                                               <td><input name="width" type="text" id="width" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td>\r
+                                                               <td><label id="heightlabel" for="height">{$lang_table_height}</label></td>\r
+                                                               <td><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td>\r
+                                                         </tr>\r
+                                                         <tr id="styleSelectRow">\r
+                                                               <td><label id="classlabel" for="class">{$lang_class_name}</label></td>\r
+                                                               <td colspan="3">\r
+                                                                <select id="class" name="class">\r
+                                                                       <option value="" selected>{$lang_not_set}</option>\r
+                                                                </select></td>\r
+                                                         </tr>\r
+                                                         <tr>\r
+                                                               <td class="column1"><label for="caption">{$lang_table_caption}</label></td> \r
+                                                               <td><input id="caption" name="caption" type="checkbox" value="true" /></td> \r
+                                                         </tr>\r
+                                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+\r
+                       <div id="advanced_panel" class="panel">\r
+                               <fieldset>\r
+                                       <legend>{$lang_table_advanced_props}</legend>\r
+\r
+                                       <table border="0" cellpadding="0" cellspacing="4">\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="id">{$lang_table_id}</label></td> \r
+                                                       <td><input id="id" name="id" type="text" value="" class="advfield" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="summary">{$lang_table_summary}</label></td> \r
+                                                       <td><input id="summary" name="summary" type="text" value="" class="advfield" /></td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label for="style">{$lang_table_style}</label></td>\r
+                                                       <td><input type="text" id="style" name="style" value="" class="advfield" onchange="changedStyle();" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="dir">{$lang_table_langdir}</label></td> \r
+                                                       <td>\r
+                                                               <select id="dir" name="dir" class="advfield"> \r
+                                                                               <option value="">{$lang_not_set}</option> \r
+                                                                               <option value="ltr">{$lang_table_ltr}</option> \r
+                                                                               <option value="rtl">{$lang_table_rtl}</option> \r
+                                                               </select>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label id="langlabel" for="lang">{$lang_table_langcode}</label></td> \r
+                                                       <td>\r
+                                                               <input id="lang" name="lang" type="text" value="" class="advfield" />\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="backgroundimage">{$lang_table_bgimage}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="backgroundimage" name="backgroundimage" type="text" value="" class="advfield" onchange="changedBackgroundImage();" /></td>\r
+                                                                               <td id="backgroundimagebrowsercontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bordercolor">{$lang_table_bordercolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>\r
+                                                                               <td id="bordercolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td class="column1"><label for="bgcolor">{$lang_table_bgcolor}</label></td> \r
+                                                       <td>\r
+                                                               <table border="0" cellpadding="0" cellspacing="0">\r
+                                                                       <tr>\r
+                                                                               <td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>\r
+                                                                               <td id="bgcolor_pickcontainer">&nbsp;</td>\r
+                                                                       </tr>\r
+                                                               </table>\r
+                                                       </td> \r
+                                               </tr>\r
+                                       </table>\r
+                               </fieldset>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertTable();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/template/blank.htm b/media/tiny_mce/plugins/template/blank.htm
new file mode 100755 (executable)
index 0000000..7d2f992
--- /dev/null
@@ -0,0 +1,23 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>blank_page</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />\r
+       <script type="text/javascript">\r
+               var tinyMCE = parent.tinyMCE, css = tinyMCE.getParam("content_css").split(','), i, u;\r
+\r
+               // Load content CSS files\r
+               for (i=0; i<css.length; i++) {\r
+                       u = css[i];\r
+\r
+                       // Fix relative\r
+                       if (u.charAt(0) != '/' && u.indexOf('://') == -1)\r
+                               u = tinyMCE.documentBasePath + "/" + u;\r
+\r
+                       document.write('<link href="' + u + '" rel="stylesheet" type="text/css" />');\r
+               }\r
+       </script>\r
+</head>\r
+<body id="mceTemplatePreview">\r
+\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/template/css/template.css b/media/tiny_mce/plugins/template/css/template.css
new file mode 100755 (executable)
index 0000000..2d23a49
--- /dev/null
@@ -0,0 +1,23 @@
+#frmbody {\r
+       padding: 10px;\r
+       background-color: #FFF;\r
+       border: 1px solid #CCC;\r
+}\r
+\r
+.frmRow {\r
+       margin-bottom: 10px;\r
+}\r
+\r
+#templatesrc {\r
+       border: none;\r
+       width: 320px;\r
+       height: 240px;\r
+}\r
+\r
+.title {\r
+       padding-bottom: 5px;\r
+}\r
+\r
+.mceActionPanel {\r
+       padding-top: 5px;\r
+}\r
diff --git a/media/tiny_mce/plugins/template/editor_plugin.js b/media/tiny_mce/plugins/template/editor_plugin.js
new file mode 100755 (executable)
index 0000000..7621af3
--- /dev/null
@@ -0,0 +1 @@
+tinyMCE.importPluginLanguagePack('template');var TinyMCE_TemplatePlugin={getInfo:function(){return{longname:'Template plugin',author:'Moxiecode Systems AB',authorurl:'http://www.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){var cdate,mdate,content,x=0,key,value,rvals,ds=inst.getData('template');cdate=tinyMCE.getParam("template_cdate_classes",'').split(/\s+/);mdate=tinyMCE.getParam("template_mdate_classes",'').split(/\s+/);content=tinyMCE.getParam("template_selected_content_classes",'').split(/\s+/);for(x=0;x<cdate.length;x++)TinyMCE_TemplatePlugin.functions[cdate[x]]=TinyMCE_TemplatePlugin.functions['cdate'];for(x=0;x<mdate.length;x++)TinyMCE_TemplatePlugin.functions[mdate[x]]=TinyMCE_TemplatePlugin.functions['mdate'];for(x=0;x<content.length;x++)TinyMCE_TemplatePlugin.functions[content[x]]=TinyMCE_TemplatePlugin.functions['selectedContent'];rvals=tinyMCE.getParam("template_replace_values",false);for(key in rvals){value=rvals[key];if(typeof value=="function")TinyMCE_TemplatePlugin.functions[key]=value;else TinyMCE_TemplatePlugin.functions[key]=TinyMCE_TemplatePlugin.functions['generateReplacer'](value)}rvals=tinyMCE.getParam("template_replace_values",false);ds.replace_items={};for(key in rvals)ds.replace_items[key]=rvals[key];inst.addShortcut('ctrl','t','lang_template_desc','mceTemplate');ds.currentAction="insert";ds.currentTmplNode=null},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){var nodeArray,current,newTmpl,x,inst=tinyMCE.getInstanceById(editor_id),ds=inst.getData('template'),telm;switch(command){case"mceTemplate":if(user_interface){tinyMCE.openWindow({file:'../../plugins/template/template.htm',width:tinyMCE.getParam('template_popup_width',750),height:tinyMCE.getParam('template_popup_height',600)},{editor_id:editor_id,resizable:"yes",scrollbars:"no",pluginObj:TinyMCE_TemplatePlugin})}else{telm=TinyMCE_TemplatePlugin._convertToNode(value.body);nodeArray=tinyMCE.selectElements(telm,'div',function(n){return tinyMCE.hasCSSClass(n,TinyMCE_TemplatePlugin.TMPL)});telm=nodeArray.length>0?nodeArray[0]:null;nodeArray=[];if(ds.currentAction=="insert"){if(telm){tinyMCE.execCommand('mceBeginUndoLevel');ds.currentAction="insert-new";TinyMCE_TemplatePlugin._insertTemplate(editor_id,telm,value.title,value.tsrc,true);ds.currentAction=="insert";tinyMCE.execCommand('mceEndUndoLevel');tinyMCE.execInstanceCommand(editor_id,'mceCleanup',false)}else tinyMCE.execCommand('mceInsertContent',false,this._replaceValues(value.body))}else{nodeArray=TinyMCE_TemplatePlugin._collectTemplateElements(ds.currentTmplNode);current=[];newTmpl=[];tinyMCE.getNodeTree(telm,newTmpl);for(x=0;x<nodeArray.length;x++)tinyMCE.getNodeTree(nodeArray[x],current);var _test=function(elm){var replaced=true;if(elm.className){var names=elm.className.split(/\s+/),c,n;for(c=0;c<names.length;c++){if(names[c].match(/^mce/i))continue;for(n=0;n<newTmpl.length;n++){replaced=false;if(newTmpl[n].className&&newTmpl[n].className.match(new RegExp(names[c],"gi"))){newTmpl[n].innerHTML=elm.innerHTML;replaced=true;break}}}}return replaced};var cont=true;var asked=false;for(x=0;x<current.length;x++){if(!_test(current[x])){cont=(asked||confirm("The new template has less elements than the currently selected content.\nIf you proceed you will loose content.\nAre you sure you want to proceed?","Proceed?"));asked=true;if(!cont)break}};if(cont){tinyMCE.execCommand('mceBeginUndoLevel');TinyMCE_TemplatePlugin._replaceTemplateContent(current[0],editor_id,telm,value.title,value.tsrc);tinyMCE.execCommand('mceEndUndoLevel');tinyMCE.execInstanceCommand(editor_id,'mceCleanup',false)}}tinyMCE.triggerNodeChange(true)}return true}return false},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var inst=tinyMCE.getInstanceById(editor_id),ds=inst.getData('template');if(tinyMCE.hasCSSClass(node,TinyMCE_TemplatePlugin.TMPL_ELEMENT)||tinyMCE.hasCSSClass(node.parentNode,TinyMCE_TemplatePlugin.TMPL_ELEMENT)){tinyMCE.switchClass(editor_id+'_template','mceButtonSelected');ds.currentAction="update";ds.currentTmplNode=node;return true}ds.currentAction="insert";ds.currentTmplNode=null;tinyMCE.switchClass(editor_id+'_template','mceButtonNormal');return false},cleanup:function(type,content,inst){var nodes=[];switch(type){case"get_from_editor":content=content.replace(new RegExp('<div class="'+TinyMCE_TemplatePlugin.TMPL+'">','gi'),'<!-- '+TinyMCE_TemplatePlugin.TMPL_BEGINS+' -->');content=content.replace(new RegExp('<div class="'+TinyMCE_TemplatePlugin.TMPL+'">(\s|&nbsp;|&#160;)?(<!-- '+TinyMCE_TemplatePlugin.TMPL_ENDS+' -->|\s)?</div>','gi'),'');content=content.replace(new RegExp('<!-- '+TinyMCE_TemplatePlugin.TMPL_ENDS+' --></div>','gi'),'<!-- '+TinyMCE_TemplatePlugin.TMPL_ENDS+' -->');break;case"insert_to_editor":content=content.replace(new RegExp('<!-- '+TinyMCE_TemplatePlugin.TMPL_BEGINS+' -->','gi'),'<div class="'+TinyMCE_TemplatePlugin.TMPL+'">');content=content.replace(new RegExp('<!-- '+TinyMCE_TemplatePlugin.TMPL_ENDS+' -->','gi'),'<!-- '+TinyMCE_TemplatePlugin.TMPL_ENDS+' --></div>');break;case"get_from_editor_dom":nodes=tinyMCE.selectNodes(content,function(n){return tinyMCE.hasCSSClass(n,TinyMCE_TemplatePlugin.TMPL_ELEMENT)});TinyMCE_TemplatePlugin._applyFunctions(nodes,type);break;case"insert_to_editor_dom":nodes=tinyMCE.selectNodes(content,function(n){return tinyMCE.hasCSSClass(n,TinyMCE_TemplatePlugin.TMPL_ELEMENT)});TinyMCE_TemplatePlugin._applyFunctions(nodes,type);break}return content},_convertToNode:function(html){var elm=document.createElement('div');elm.innerHTML=html;return elm},_prepareTemplateContent:function(elms){var x,n,nodes=[];if(!elms)return{};if(!elms.length)elms=[elms];for(x=0;x<elms.length;x++)tinyMCE.getNodeTree(elms[x],nodes,1);for(n=0;n<nodes.length;n++){tinyMCE.addCSSClass(nodes[n],TinyMCE_TemplatePlugin.TMPL_ELEMENT);TinyMCE_TemplatePlugin._applyFunctions(nodes[n],TinyMCE_TemplatePlugin.TMPL_TEMPLATE_EVENT)}return elms},_replaceValues:function(s){var t=this,ds=tinyMCE.selectedInstance.getData('template');return s.replace(/\{\$([^\}]+)\}/g,function(a,b){var it=ds.replace_items[b];if(it){if(typeof(it)!='function')return it}return b})},_applyFunctions:function(elms,editor_event){var x,elm,names,c,f;if(!elms)return{};if(!elms.length)elms=[elms];for(x=0;x<elms.length;x++){elm=elms[x];if(elm.className){names=elm.className.split(/\s+/);for(c=0;c<names.length;c++){if(names[c]==TinyMCE_TemplatePlugin.TMPL_ELEMENT)continue;f=(TinyMCE_TemplatePlugin.functions[names[c]]?TinyMCE_TemplatePlugin.functions[names[c]]:TinyMCE_TemplatePlugin.functions['blank']);f(elm,editor_event)}}}return elms},_collectTemplateElements:function(node){var nodeArray=[],p;p=tinyMCE.getParentElement(node,'DIV',function(n){return tinyMCE.hasCSSClass(n,TinyMCE_TemplatePlugin.TMPL)});if(p)tinyMCE.getNodeTree(p,nodeArray);return nodeArray},_replaceTemplateContent:function(currentNode,editor_id,newTemplate,title,tsrc){TinyMCE_TemplatePlugin._deleteTemplateContent(currentNode);TinyMCE_TemplatePlugin._insertTemplate(editor_id,newTemplate,title,tsrc,false)},_deleteTemplateContent:function(node){var p=tinyMCE.getParentElement(node,'DIV',function(n){return tinyMCE.hasCSSClass(n,TinyMCE_TemplatePlugin.TMPL)});if(p)p.parentNode.removeChild(p,true)},_insertTemplate:function(editor_id,elm,title,tsrc,incComments){var html;TinyMCE_TemplatePlugin._prepareTemplateContent(elm);html='<div class="'+TinyMCE_TemplatePlugin.TMPL+'">';html+=elm.innerHTML;html+='<!-- '+TinyMCE_TemplatePlugin.TMPL_ENDS+' --></div>';tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,html)},functions:{blank:function(elm,editor_event){},cdate:function(elm,editor_event){var d,dsrc;if(editor_event!=TinyMCE_TemplatePlugin.TMPL_TEMPLATE_EVENT)return;d=new Date();dsrc=elm.innerHTML.match(new RegExp("<!-- "+TinyMCE_TemplatePlugin.TMPL_DATE_SRC_ATTR+":(.*)  -->","gi"));if(dsrc)d=new Date(RegExp.$1);elm.innerHTML=TinyMCE_TemplatePlugin._getDateTime(d,tinyMCE.getParam("template_cdate_format",tinyMCE.getLang("lang_template_def_date_format")));elm.innerHTML+="<!-- "+TinyMCE_TemplatePlugin.TMPL_DATE_SRC_ATTR+":"+d.toUTCString()+"  -->"},mdate:function(elm,editor_event){var d=new Date();elm.innerHTML=TinyMCE_TemplatePlugin._getDateTime(d,tinyMCE.getParam("template_mdate_format",tinyMCE.getLang("lang_template_def_date_format")))},selectedContent:function(elm,editor_event){var ds=tinyMCE.selectedInstance.getData('template');if(editor_event!=TinyMCE_TemplatePlugin.TMPL_TEMPLATE_EVENT)return;if(ds.currentAction=="insert-new"&&!tinyMCE.hasCSSClass(elm,TinyMCE_TemplatePlugin.TMPL_SEL_HTML_DONE)){elm.innerHTML=tinyMCE.selectedInstance.selection.getSelectedHTML();tinyMCE.addCSSClass(elm,TinyMCE_TemplatePlugin.TMPL_SEL_HTML_DONE)}},generateReplacer:function(s){return function(elm,editor_event){elm.innerHTML=""+s}}},_getDateTime:function(d,fmt){if(!fmt)return"";function addZeros(value,len){var i;value=""+value;if(value.length<len){for(i=0;i<(len-value.length);i++)value="0"+value}return value}fmt=fmt.replace("%D","%m/%d/%y");fmt=fmt.replace("%r","%I:%M:%S %p");fmt=fmt.replace("%Y",""+d.getFullYear());fmt=fmt.replace("%y",""+d.getYear());fmt=fmt.replace("%m",addZeros(d.getMonth()+1,2));fmt=fmt.replace("%d",addZeros(d.getDate(),2));fmt=fmt.replace("%H",""+addZeros(d.getHours(),2));fmt=fmt.replace("%M",""+addZeros(d.getMinutes(),2));fmt=fmt.replace("%S",""+addZeros(d.getSeconds(),2));fmt=fmt.replace("%I",""+((d.getHours()+11)%12+1));fmt=fmt.replace("%p",""+(d.getHours()<12?"AM":"PM"));fmt=fmt.replace("%B",""+tinyMCE.getLang("lang_template_months_long")[d.getMonth()]);fmt=fmt.replace("%b",""+tinyMCE.getLang("lang_template_months_short")[d.getMonth()]);fmt=fmt.replace("%A",""+tinyMCE.getLang("lang_template_day_long")[d.getDay()]);fmt=fmt.replace("%a",""+tinyMCE.getLang("lang_template_day_short")[d.getDay()]);fmt=fmt.replace("%%","%");return fmt},TMPL_ELEMENT:'mceTmplElm',TMPL:'mceTmpl',TMPL_BEGINS:'mceTmplBegins',TMPL_SEL_HTML_DONE:'mceSelHTMLDone',TMPL_ENDS:'mceTmplEnds',TMPL_DATE_SRC_ATTR:'mcetmpldtesrc',TMPL_TEMPLATE_EVENT:'prepare_template'};tinyMCE.addPlugin("template",TinyMCE_TemplatePlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/template/editor_plugin_src.js b/media/tiny_mce/plugins/template/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..8daddd9
--- /dev/null
@@ -0,0 +1,551 @@
+/**\r
+ * $Id: editor_plugin_src.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+tinyMCE.importPluginLanguagePack('template');\r
+\r
+var TinyMCE_TemplatePlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Template plugin',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://www.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               var cdate, mdate, content, x = 0, key, value, rvals, ds = inst.getData('template');\r
+\r
+               // ensure the required elements and sttributes are added\r
+               //inst.cleanup.addRuleStr('*[' + TinyMCE_TemplatePlugin.TMPL_DATE_SRC_ATTR + '],div[title,tsrc]');\r
+\r
+               //setup template content functions\r
+               // creation date and modified date classes\r
+               cdate = tinyMCE.getParam("template_cdate_classes", '').split(/\s+/);\r
+               mdate = tinyMCE.getParam("template_mdate_classes", '').split(/\s+/);\r
+\r
+               // classes that specify where selected content should go\r
+               content = tinyMCE.getParam("template_selected_content_classes", '').split(/\s+/);\r
+\r
+               for (x = 0; x < cdate.length; x++)\r
+                       TinyMCE_TemplatePlugin.functions[cdate[x]] = TinyMCE_TemplatePlugin.functions['cdate']; \r
+\r
+               for (x = 0; x < mdate.length; x++)\r
+                       TinyMCE_TemplatePlugin.functions[mdate[x]] = TinyMCE_TemplatePlugin.functions['mdate'];\r
+\r
+               for (x = 0; x < content.length; x++)\r
+                       TinyMCE_TemplatePlugin.functions[content[x]] = TinyMCE_TemplatePlugin.functions['selectedContent'];\r
+\r
+               // special template functions for replacing template content\r
+               rvals = tinyMCE.getParam("template_replace_values", false);\r
+               for (key in rvals) {\r
+                       value = rvals[key];\r
+\r
+                       if (typeof value == "function")\r
+                               TinyMCE_TemplatePlugin.functions[key] = value;\r
+                       else\r
+                               TinyMCE_TemplatePlugin.functions[key] = TinyMCE_TemplatePlugin.functions['generateReplacer'](value);\r
+               }\r
+\r
+               // Setup replace_items\r
+               rvals = tinyMCE.getParam("template_replace_values", false);\r
+               ds.replace_items = {};\r
+\r
+               for (key in rvals)\r
+                       ds.replace_items[key] = rvals[key];\r
+\r
+               inst.addShortcut('ctrl', 't', 'lang_template_desc', 'mceTemplate');\r
+\r
+               // Setup data storage\r
+               ds.currentAction = "insert";\r
+               ds.currentTmplNode = null;\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "template":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_template_desc', '{$pluginurl}/images/template.gif', 'mceTemplate', true);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               var nodeArray, current, newTmpl, x, inst = tinyMCE.getInstanceById(editor_id), ds = inst.getData('template'), telm;\r
+\r
+               switch (command) {\r
+                       case "mceTemplate":\r
+                               if (user_interface) {\r
+                                       // called from toolbar button - show the popup\r
+                                       tinyMCE.openWindow({\r
+                                               file : '../../plugins/template/template.htm', // Relative to theme\r
+                                               width : tinyMCE.getParam('template_popup_width', 750),\r
+                                               height : tinyMCE.getParam('template_popup_height', 600)\r
+                                       }, {editor_id : editor_id, resizable : "yes", scrollbars : "no", pluginObj : TinyMCE_TemplatePlugin});\r
+                               } else {\r
+                                       // internal command do the template stuff\r
+\r
+                                       // get the returned HTML string from the pop-up and appened it to a DIV element\r
+                                       telm = TinyMCE_TemplatePlugin._convertToNode(value.body);\r
+\r
+                                       // Find template body\r
+                                       nodeArray = tinyMCE.selectElements(telm, 'div', function(n) {\r
+                                               return tinyMCE.hasCSSClass(n, TinyMCE_TemplatePlugin.TMPL);\r
+                                       });\r
+\r
+                                       telm = nodeArray.length > 0 ? nodeArray[0] : null;\r
+                                       nodeArray = [];\r
+\r
+                                       if (ds.currentAction == "insert") {\r
+                                               //insert new template after applying all the template content functions\r
+\r
+                                               // Is it a template or snippet\r
+                                               if (telm) {\r
+                                                       tinyMCE.execCommand('mceBeginUndoLevel');\r
+                                                       ds.currentAction = "insert-new";\r
+                                                       TinyMCE_TemplatePlugin._insertTemplate(editor_id, telm, value.title, value.tsrc, true);\r
+                                                       ds.currentAction == "insert";\r
+                                                       tinyMCE.execCommand('mceEndUndoLevel');\r
+                                                       tinyMCE.execInstanceCommand(editor_id, 'mceCleanup', false);\r
+                                               } else\r
+                                                       tinyMCE.execCommand('mceInsertContent', false, this._replaceValues(value.body));\r
+                                       } else {\r
+                                               // First collect the selected template in the editor\r
+                                               nodeArray = TinyMCE_TemplatePlugin._collectTemplateElements(ds.currentTmplNode);\r
+                                               current = [];\r
+                                               newTmpl = [];\r
+                                               tinyMCE.getNodeTree(telm, newTmpl);\r
+\r
+                                               for (x=0; x<nodeArray.length; x++)\r
+                                                       tinyMCE.getNodeTree(nodeArray[x], current);\r
+\r
+                                               /** \r
+                                                * inner function used in the loop below.\r
+                                                * compares the supplied HTML element to the new template to:\r
+                                                * - find a match with the new template and copy the element's content over\r
+                                                * - find no match and indicate content will be lost\r
+                                                */\r
+                                               var _test = function(elm) {\r
+                                                       var replaced = true;\r
+\r
+                                                       if (elm.className) {\r
+                                                               var names = elm.className.split(/\s+/), c, n;\r
+\r
+                                                               for (c = 0; c<names.length; c++) {\r
+                                                                       if (names[c].match(/^mce/i))\r
+                                                                               continue; // ignore all internal class names\r
+\r
+                                                                       for (n=0; n<newTmpl.length; n++){\r
+                                                                               replaced = false;\r
+\r
+                                                                               if (newTmpl[n].className && newTmpl[n].className.match(new RegExp(names[c], "gi"))) {\r
+                                                                                       newTmpl[n].innerHTML = elm.innerHTML;\r
+                                                                                       //if(tinyMCE.getAttrib(elm,TinyMCE_TemplatePlugin.TMPL_DATE_SRC_ATTR,"") != "") {\r
+                                                                                       //      tinyMCE.setAttrib(newTmpl[n], TinyMCE_TemplatePlugin.TMPL_DATE_SRC_ATTR, tinyMCE.getAttrib(elm,TinyMCE_TemplatePlugin.TMPL_DATE_SRC_ATTR)); \r
+                                                                                       //}\r
+                                                                                       replaced = true;\r
+                                                                                       break;\r
+                                                                               }\r
+\r
+                                                                       }\r
+                                                               }\r
+                                                       }\r
+       \r
+                                                       return replaced;\r
+                                               };\r
+\r
+                                               // comparison loop - first mis-match alerts user for confirmation.\r
+                                               var cont = true;\r
+                                               var asked = false;\r
+\r
+                                               for (x = 0; x < current.length; x++) {\r
+                                                       if(!_test(current[x])) {\r
+                                                               cont = (asked || confirm("The new template has less elements than the currently selected content.\nIf you proceed you will loose content.\nAre you sure you want to proceed?", "Proceed?"));\r
+                                                               asked = true;\r
+\r
+                                                               if (!cont)\r
+                                                                       break;\r
+                                                       }\r
+                                               };\r
+\r
+                                               // apply replacement if allowed to\r
+                                               if (cont) {\r
+                                                       tinyMCE.execCommand('mceBeginUndoLevel');\r
+                                                       TinyMCE_TemplatePlugin._replaceTemplateContent(current[0], editor_id, telm, value.title, value.tsrc);\r
+                                                       tinyMCE.execCommand('mceEndUndoLevel');\r
+                                                       tinyMCE.execInstanceCommand(editor_id, 'mceCleanup', false);\r
+                                               }\r
+                                       }\r
+\r
+                                       tinyMCE.triggerNodeChange(true);\r
+                               }\r
+\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), ds = inst.getData('template');\r
+\r
+               if (tinyMCE.hasCSSClass(node, TinyMCE_TemplatePlugin.TMPL_ELEMENT) || tinyMCE.hasCSSClass(node.parentNode, TinyMCE_TemplatePlugin.TMPL_ELEMENT)) {\r
+                       tinyMCE.switchClass(editor_id + '_template', 'mceButtonSelected');\r
+                       ds.currentAction = "update";\r
+                       ds.currentTmplNode = node;\r
+\r
+                       return true;\r
+               }\r
+\r
+               ds.currentAction = "insert";\r
+               ds.currentTmplNode = null;\r
+               tinyMCE.switchClass(editor_id + '_template', 'mceButtonNormal');\r
+\r
+               return false;\r
+       },\r
+\r
+       cleanup : function(type, content, inst) {\r
+               var nodes = [];\r
+\r
+               switch (type) {\r
+                       case "get_from_editor":\r
+                               // replace the opening wrapper div tag with a HTML comment\r
+                               content = content.replace(\r
+                                       new RegExp('<div class="' + TinyMCE_TemplatePlugin.TMPL + '">', 'gi'),\r
+                                       '<!-- ' + TinyMCE_TemplatePlugin.TMPL_BEGINS + ' -->'\r
+                               );\r
+\r
+                               // delete any empty template wrappers\r
+                               content = content.replace(\r
+                                       new RegExp('<div class="' + TinyMCE_TemplatePlugin.TMPL + '">(\s|&nbsp;|&#160;)?(<!-- ' + TinyMCE_TemplatePlugin.TMPL_ENDS + ' -->|\s)?</div>', 'gi'),\r
+                                       ''\r
+                               );\r
+\r
+                               // replace the closing wrapper tag\r
+                               content = content.replace(\r
+                                       new RegExp('<!-- ' + TinyMCE_TemplatePlugin.TMPL_ENDS + ' --></div>', 'gi'),\r
+                                       '<!-- ' + TinyMCE_TemplatePlugin.TMPL_ENDS + ' -->'\r
+                               );\r
+\r
+                               break;\r
+\r
+                       case "insert_to_editor":\r
+                               // replace HTML comment with DIV wrapper\r
+                               content = content.replace(\r
+                                       new RegExp('<!-- ' + TinyMCE_TemplatePlugin.TMPL_BEGINS + ' -->', 'gi'),\r
+                                       '<div class="' + TinyMCE_TemplatePlugin.TMPL + '">'\r
+                               );\r
+\r
+                               content = content.replace(\r
+                                       new RegExp('<!-- ' + TinyMCE_TemplatePlugin.TMPL_ENDS + ' -->', 'gi'),\r
+                                       '<!-- ' + TinyMCE_TemplatePlugin.TMPL_ENDS + ' --></div>'\r
+                               );\r
+\r
+                               break;\r
+\r
+                       case "get_from_editor_dom":\r
+                               // apply template content replacement functions\r
+                               nodes = tinyMCE.selectNodes(content, function(n) {\r
+                                               return tinyMCE.hasCSSClass(n, TinyMCE_TemplatePlugin.TMPL_ELEMENT);\r
+                                       }\r
+                               );\r
+\r
+                               TinyMCE_TemplatePlugin._applyFunctions(nodes, type);\r
+\r
+                               break;\r
+\r
+                       case "insert_to_editor_dom":\r
+                               // apply template content replacement functions\r
+                               nodes = tinyMCE.selectNodes(content, function(n) {\r
+                                               return tinyMCE.hasCSSClass(n, TinyMCE_TemplatePlugin.TMPL_ELEMENT);\r
+                                       }\r
+                               );\r
+\r
+                               TinyMCE_TemplatePlugin._applyFunctions(nodes, type);\r
+\r
+                               break;\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       // Private plugin internal methods\r
+\r
+       /**\r
+        * Creates a HTML DIV element and sets the innerHTML to equal the temlate innerHTML so that the template can be manipulated as DOM nodes.\r
+        *\r
+        * @param {string} Template innerHTML\r
+        * @return a HTML Element\r
+        * @type HTMLElement\r
+        */\r
+       _convertToNode : function(html) {\r
+               var elm = document.createElement('div');\r
+\r
+               elm.innerHTML = html;\r
+\r
+               return elm;\r
+       },\r
+\r
+       /**\r
+        * pass an array of template html elements and they will have the template class name added and any template functions applied\r
+        *\r
+        * @param {array} template HTML elements\r
+        * @return array of template HTML elements\r
+        * @type array\r
+        */\r
+       _prepareTemplateContent : function(elms) {\r
+               var x, n, nodes = [];\r
+\r
+               if (!elms)\r
+                       return {};\r
+\r
+               if (!elms.length)\r
+                       elms = [elms];\r
+\r
+               for (x = 0; x<elms.length; x++)\r
+                       tinyMCE.getNodeTree(elms[x], nodes, 1);\r
+\r
+               for (n = 0; n<nodes.length; n++) {\r
+                       tinyMCE.addCSSClass(nodes[n], TinyMCE_TemplatePlugin.TMPL_ELEMENT);\r
+                       TinyMCE_TemplatePlugin._applyFunctions(nodes[n], TinyMCE_TemplatePlugin.TMPL_TEMPLATE_EVENT);\r
+               }\r
+\r
+               return elms;\r
+       },\r
+\r
+       _replaceValues : function(s) {\r
+               var t = this, ds = tinyMCE.selectedInstance.getData('template');\r
+\r
+               return s.replace(/\{\$([^\}]+)\}/g, function(a, b) {\r
+                       var it = ds.replace_items[b];\r
+\r
+                       if (it) {\r
+                               // Only supports text for now\r
+                               if (typeof(it) != 'function')\r
+                                       return it;\r
+                       }\r
+\r
+                       return b;\r
+               });\r
+       },\r
+\r
+       /**\r
+        * Applies any special functions to the template elements\r
+        *\r
+        * @param {array} template HTML elements\r
+        * @return array of template HTML elements\r
+        * @type array\r
+        */\r
+       _applyFunctions : function(elms, editor_event) {\r
+               var x, elm, names, c, f;\r
+\r
+               if (!elms)\r
+                       return {};\r
+\r
+               if (!elms.length)\r
+                       elms = [elms];\r
+\r
+               for(x = 0; x < elms.length; x++) {\r
+                       elm = elms[x];\r
+\r
+                       if (elm.className){\r
+                               names = elm.className.split(/\s+/);\r
+\r
+                               for (c = 0; c < names.length; c++){\r
+                                       if (names[c] == TinyMCE_TemplatePlugin.TMPL_ELEMENT)\r
+                                               continue;\r
+\r
+                                       f = (TinyMCE_TemplatePlugin.functions[names[c]] ? TinyMCE_TemplatePlugin.functions[names[c]] : TinyMCE_TemplatePlugin.functions['blank']);\r
+                                       f(elm, editor_event);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return elms;\r
+       },\r
+\r
+       /**\r
+        * Given one node reference this function will collect all the nodes of the template to which it belongs.\r
+        * It does this by finding the parent template wrapper DIV and returning all child nodes.\r
+        *\r
+        * @param {HTMLElement} a HTMLElement which is part of a template\r
+        * @return array of template HTML elements\r
+        * @type array\r
+        */\r
+       _collectTemplateElements : function(node) {\r
+               var nodeArray = [], p;\r
+\r
+               p = tinyMCE.getParentElement(node, 'DIV', function(n) {\r
+                       return tinyMCE.hasCSSClass(n, TinyMCE_TemplatePlugin.TMPL);\r
+               });\r
+\r
+               if (p)\r
+                       tinyMCE.getNodeTree(p, nodeArray);\r
+\r
+               return nodeArray;\r
+       },\r
+\r
+       /**\r
+        * Simply calls TinyMCE_TemplatePlugin._deleteTemplateContent and then TinyMCE_TemplatePlugin._insertTemplate\r
+        *\r
+        * @param {HTMLElement} currently selected template node in editor\r
+        * @param {string} id of editor instance\r
+        * @param {HTMLElement} template contents as a HTMLElement (the parent DIV wrapper)\r
+        * @param {string} title of template (unused as yet)\r
+        * @param {string} source URI of the template file (unused as yet)\r
+        * @return array of template HTML elements\r
+        * @type array\r
+        */\r
+       _replaceTemplateContent : function(currentNode, editor_id, newTemplate, title, tsrc) {\r
+               TinyMCE_TemplatePlugin._deleteTemplateContent(currentNode);\r
+               TinyMCE_TemplatePlugin._insertTemplate(editor_id, newTemplate, title, tsrc, false);\r
+       },\r
+\r
+       /**\r
+        * Deletes a template from the editor content\r
+        * Finds the parent DIV wrapper and deletes it and all children\r
+        * @param {HTMLElement} currently selected template node in editor\r
+        */\r
+       _deleteTemplateContent : function(node) {\r
+               var p = tinyMCE.getParentElement(node, 'DIV', function(n) {\r
+                       return tinyMCE.hasCSSClass(n, TinyMCE_TemplatePlugin.TMPL);\r
+               });\r
+\r
+               if (p)\r
+                       p.parentNode.removeChild(p, true);\r
+       },\r
+\r
+       /**\r
+        *  Inserts a template into the specified editor\r
+        *\r
+        * @param {string} id of editor instance\r
+        * @param {HTMLElement} template contents as a HTMLElement (the parent DIV wrapper)\r
+        * @param {string} title of template (unused as yet)\r
+        * @param {string} source URI of the template file (unused as yet)\r
+        */\r
+       _insertTemplate : function(editor_id, elm, title, tsrc, incComments) {\r
+               var html;\r
+\r
+               TinyMCE_TemplatePlugin._prepareTemplateContent(elm);\r
+\r
+               html = '<div class="' + TinyMCE_TemplatePlugin.TMPL + '">';\r
+               html += elm.innerHTML;\r
+               html += '<!-- ' + TinyMCE_TemplatePlugin.TMPL_ENDS + ' --></div>';\r
+\r
+               tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, html);\r
+       },\r
+\r
+       /**\r
+        * template functions - functions for modifying template content\r
+        */\r
+       functions : { \r
+               blank : function(elm, editor_event) {},\r
+\r
+               cdate : function(elm, editor_event) {\r
+                       var d, dsrc;\r
+\r
+                       if (editor_event != TinyMCE_TemplatePlugin.TMPL_TEMPLATE_EVENT)\r
+                               return;\r
+\r
+                       d = new Date();\r
+                       // find out if the creation date was previously stored\r
+                       dsrc = elm.innerHTML.match(new RegExp("<!-- " + TinyMCE_TemplatePlugin.TMPL_DATE_SRC_ATTR + ":(.*)  -->", "gi"));\r
+\r
+                       if (dsrc)\r
+                               d = new Date(RegExp.$1);\r
+\r
+                       elm.innerHTML = TinyMCE_TemplatePlugin._getDateTime(d, tinyMCE.getParam("template_cdate_format", tinyMCE.getLang("lang_template_def_date_format")));\r
+                       //now we have to store the date value in a format easily read again, in case a future template change changes the date format...\r
+                       elm.innerHTML += "<!-- " + TinyMCE_TemplatePlugin.TMPL_DATE_SRC_ATTR + ":" + d.toUTCString() + "  -->";\r
+               },\r
+\r
+               mdate : function(elm, editor_event) {\r
+                       var d = new Date();\r
+                       elm.innerHTML = TinyMCE_TemplatePlugin._getDateTime(d, tinyMCE.getParam("template_mdate_format", tinyMCE.getLang("lang_template_def_date_format")));\r
+               },\r
+\r
+               /**\r
+                * This will insert the currently selected editor content into the template element.\r
+                * It only does this if the template inserted is a new one and if the element does not have the special class.\r
+                * The special class name prevents this from happening more than once.\r
+                */\r
+               selectedContent : function(elm, editor_event) {\r
+                       var ds = tinyMCE.selectedInstance.getData('template');\r
+       \r
+                       if (editor_event != TinyMCE_TemplatePlugin.TMPL_TEMPLATE_EVENT)\r
+                               return;\r
+\r
+                       if (ds.currentAction == "insert-new" && !tinyMCE.hasCSSClass(elm, TinyMCE_TemplatePlugin.TMPL_SEL_HTML_DONE)) {\r
+                               elm.innerHTML = tinyMCE.selectedInstance.selection.getSelectedHTML();\r
+                               tinyMCE.addCSSClass(elm, TinyMCE_TemplatePlugin.TMPL_SEL_HTML_DONE);\r
+                       }\r
+               },\r
+\r
+               /**\r
+                * When the plugin is initialised this generates the functions that insert configured strings into template elements.\r
+                */\r
+               generateReplacer : function(s) {\r
+                       return function(elm, editor_event) {elm.innerHTML = "" + s;};\r
+               }\r
+       },\r
+\r
+       /**\r
+        * formats a date according to the format string - straight from the 'insert date/time' plugin\r
+        *\r
+        * @param {Date} date object\r
+        * @param {string} format string\r
+        * @return formatted date\r
+        * @type string\r
+        */\r
+       _getDateTime : function(d,fmt) {\r
+                       if (!fmt)\r
+                               return "";\r
+\r
+                       function addZeros(value, len) {\r
+                               var i;\r
+\r
+                               value = "" + value;\r
+\r
+                               if (value.length < len) {\r
+                                       for (i=0; i<(len-value.length); i++)\r
+                                               value = "0" + value;\r
+                               }\r
+\r
+                               return value;\r
+                       }\r
+\r
+                       fmt = fmt.replace("%D", "%m/%d/%y");\r
+                       fmt = fmt.replace("%r", "%I:%M:%S %p");\r
+                       fmt = fmt.replace("%Y", "" + d.getFullYear());\r
+                       fmt = fmt.replace("%y", "" + d.getYear());\r
+                       fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));\r
+                       fmt = fmt.replace("%d", addZeros(d.getDate(), 2));\r
+                       fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));\r
+                       fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));\r
+                       fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));\r
+                       fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));\r
+                       fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));\r
+                       fmt = fmt.replace("%B", "" + tinyMCE.getLang("lang_template_months_long")[d.getMonth()]);\r
+                       fmt = fmt.replace("%b", "" + tinyMCE.getLang("lang_template_months_short")[d.getMonth()]);\r
+                       fmt = fmt.replace("%A", "" + tinyMCE.getLang("lang_template_day_long")[d.getDay()]);\r
+                       fmt = fmt.replace("%a", "" + tinyMCE.getLang("lang_template_day_short")[d.getDay()]);\r
+                       fmt = fmt.replace("%%", "%");\r
+\r
+                       return fmt;\r
+       },\r
+\r
+       TMPL_ELEMENT : 'mceTmplElm',\r
+       TMPL : 'mceTmpl',\r
+       TMPL_BEGINS : 'mceTmplBegins',\r
+       TMPL_SEL_HTML_DONE : 'mceSelHTMLDone',\r
+       TMPL_ENDS : 'mceTmplEnds',\r
+       TMPL_DATE_SRC_ATTR : 'mcetmpldtesrc',\r
+       TMPL_TEMPLATE_EVENT : 'prepare_template'\r
+};\r
+\r
+tinyMCE.addPlugin("template", TinyMCE_TemplatePlugin);\r
diff --git a/media/tiny_mce/plugins/template/images/template.gif b/media/tiny_mce/plugins/template/images/template.gif
new file mode 100755 (executable)
index 0000000..58c6610
Binary files /dev/null and b/media/tiny_mce/plugins/template/images/template.gif differ
diff --git a/media/tiny_mce/plugins/template/jscripts/template.js b/media/tiny_mce/plugins/template/jscripts/template.js
new file mode 100755 (executable)
index 0000000..4c95927
--- /dev/null
@@ -0,0 +1,143 @@
+// Import external list url javascript\r
+var url = tinyMCE.getParam("template_external_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+var TPU = { //Template Popup Utils\r
+       currentTemplateHTML : null,\r
+       templates : [],\r
+       inst : tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')),\r
+       plugin : tinyMCE.getWindowArg('pluginObj'),\r
+       data : tinyMCE.selectedInstance.getData('template'),\r
+\r
+       init : function() {\r
+               document.forms[0].insert.value = tinyMCE.getLang('lang_' + this.data.currentAction, 'Insert', true); \r
+               TPU.loadTemplatePaths();\r
+\r
+               if (this.data.currentAction == "update")\r
+                       document.getElementById('warning').innerHTML = tinyMCE.getLang('lang_template_warning');\r
+\r
+               this.resizeInputs();\r
+       },\r
+\r
+       loadTemplatePaths : function() {\r
+               var tsrc, sel, x, u;\r
+\r
+               tsrc = tinyMCE.getParam("template_templates", false);\r
+               sel = document.getElementById('tpath');\r
+\r
+               // Setup external template list\r
+               if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') {\r
+                       for (x=0, tsrc = []; x<tinyMCETemplateList.length; x++)\r
+                               tsrc.push({title : tinyMCETemplateList[x][0], src : tinyMCETemplateList[x][1], description : tinyMCETemplateList[x][2]});\r
+               }\r
+\r
+               for (x=0; x<tsrc.length; x++) {\r
+                       u = tsrc[x].src;\r
+\r
+                       // Force absolute\r
+                       if (u.indexOf('://') == -1 && u.indexOf('/') != 0)\r
+                               u = tinyMCE.documentBasePath + "/" + u;\r
+\r
+                       tsrc[x].src = u;\r
+               }\r
+\r
+               TPU.templates = tsrc;\r
+\r
+               for (x = 0; x < tsrc.length; x++)\r
+                       sel.options[sel.options.length] = new Option(tsrc[x].title, tsrc[x].src);\r
+       },\r
+\r
+       selectTemplate : function(o) {\r
+               var x, d = window.frames['templatesrc'].document;\r
+\r
+               this.currentTemplateHTML = this.plugin._replaceValues(this.getFileContents(o.value));\r
+\r
+               // Force complete document\r
+/*             if (!/<body/gi.test(this.currentTemplateHTML)) {\r
+                       this.currentTemplateHTML = '<html xmlns="http://www.w3.org/1999/xhtml">' + \r
+                               '<head>' + \r
+                                       '<title>blank_page</title>' + \r
+                                       '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' + \r
+                               '</head>' + \r
+                               '<body>' + \r
+                               this.currentTemplateHTML + \r
+                               '</body>' + \r
+                               '</html>';\r
+               }*/\r
+\r
+               // Write HTML to preview iframe\r
+               d.body.innerHTML = this.currentTemplateHTML;\r
+\r
+               // Display description\r
+               for (x = 0; x < TPU.templates.length; x++) {\r
+                       if (TPU.templates[x].src == o.value) {\r
+                               document.getElementById('tmpldesc').innerHTML = TPU.templates[x].description;\r
+                               break;\r
+                       }\r
+               }\r
+       },\r
+\r
+       insertTemplate : function() {\r
+               var sel, opt;\r
+\r
+               sel = document.getElementById('tpath');\r
+               opt = sel.options[sel.selectedIndex];\r
+\r
+               // Is it a template or snippet\r
+               if (TPU.currentTemplateHTML.indexOf('mceTmpl'))\r
+                       tinyMCEPopup.execCommand('mceTemplate', false, {title : opt.text, tsrc : opt.value, body : TPU.currentTemplateHTML});\r
+               else\r
+                       tinyMCEPopup.execCommand('mceInsertContent', false, TPU.currentTemplateHTML);\r
+\r
+               tinyMCEPopup.close();\r
+       },\r
+\r
+       getFileContents : function(u) {\r
+               var x, d, t = 'text/plain';\r
+\r
+               function g(s) {\r
+                       x = 0;\r
+\r
+                       try {\r
+                               x = new ActiveXObject(s);\r
+                       } catch (s) {\r
+                       }\r
+\r
+                       return x;\r
+               };\r
+\r
+               x = window.ActiveXObject ? g('Msxml2.XMLHTTP') || g('Microsoft.XMLHTTP') : new XMLHttpRequest();\r
+\r
+               // Synchronous AJAX load file\r
+               x.overrideMimeType && x.overrideMimeType(t);\r
+               x.open("GET", u, false);\r
+               x.send(null);\r
+\r
+               return x.responseText;\r
+       },\r
+\r
+       resizeInputs : function() {\r
+               var wHeight, wWidth, elm;\r
+\r
+               if (!self.innerWidth) {\r
+                       wHeight = document.body.clientHeight - 160;\r
+                       wWidth = document.body.clientWidth - 40;\r
+               } else {\r
+                       wHeight = self.innerHeight - 160;\r
+                       wWidth = self.innerWidth - 40;\r
+               }\r
+\r
+               elm = document.getElementById('templatesrc');\r
+\r
+               if (elm) {\r
+                       elm.style.height = Math.abs(wHeight) + 'px';\r
+                       elm.style.width  = Math.abs(wWidth - 5) + 'px';\r
+               }\r
+       }\r
+};\r
diff --git a/media/tiny_mce/plugins/template/langs/en.js b/media/tiny_mce/plugins/template/langs/en.js
new file mode 100755 (executable)
index 0000000..bdbf3ff
--- /dev/null
@@ -0,0 +1,16 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('template',{\r
+title : 'Templates',\r
+label : 'Template',\r
+desc_label : 'Description',\r
+desc : 'Insert predefined template content',\r
+select : 'Select a template',\r
+preview : 'Preview',\r
+warning : 'Warning: Updating a template with a different one may cause data loss.',\r
+def_date_format : '%Y-%m-%d %H:%M:%S',\r
+months_long : new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"),\r
+months_short : new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),\r
+day_long : new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"),\r
+day_short : new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")\r
+});\r
diff --git a/media/tiny_mce/plugins/template/template.htm b/media/tiny_mce/plugins/template/template.htm
new file mode 100755 (executable)
index 0000000..1e4a98a
--- /dev/null
@@ -0,0 +1,37 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_template_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/template.js"></script>\r
+       <link href="css/template.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('TPU.init();');" onresize="TPU.resizeInputs();"> \r
+       <form onsubmit="insert();return false;">\r
+               <div id="frmbody">\r
+                       <div class="title">{$lang_template_desc}</div>\r
+                       <div class="frmRow"><label for="tpath" title="{$lang_template_select}">{$lang_template_label}:</label>\r
+                       <select id="tpath" name="tpath" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="TPU.selectTemplate(this.options[this.selectedIndex]);">\r
+                               <option value="">{$lang_template_select}...</option>\r
+                       </select>\r
+                       <span id="warning"></span></div>\r
+                       <div class="frmRow"><label for="tdesc">{$lang_template_desc_label}:</label>\r
+                       <span id="tmpldesc"></span></div>\r
+                       <fieldset>\r
+                               <legend>{$lang_template_preview}</legend>\r
+                               <iframe id="templatesrc" name="templatesrc" src="blank.htm" width="690" height="400" frameborder="0"></iframe>\r
+                       </fieldset>\r
+               </div>\r
+               \r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="TPU.insertTemplate();" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body> \r
+</html> \r
diff --git a/media/tiny_mce/plugins/visualchars/editor_plugin.js b/media/tiny_mce/plugins/visualchars/editor_plugin.js
new file mode 100755 (executable)
index 0000000..a358754
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars',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<nl.length;i++){nv=nl[i].nodeValue;nv=nv.replace(/(\u00a0+)/g,'<span class="mceItemHiddenVisualChar">$1</span>');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<nl.length;i++)tinyMCE.setOuterHTML(nl[i],nl[i].innerHTML.replace(/(&middot;|\u00b7)/g,'&nbsp;'),d)}}};tinyMCE.addPlugin("visualchars",TinyMCE_VisualCharsPlugin);
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/visualchars/editor_plugin_src.js b/media/tiny_mce/plugins/visualchars/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..fb7236d
--- /dev/null
@@ -0,0 +1,89 @@
+/**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('visualchars');\r
+\r
+var TinyMCE_VisualCharsPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Visual characters',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               inst.visualChars = {\r
+                       state : false\r
+               };\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "visualchars":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_visualchars_desc', '{$pluginurl}/images/visualchars.gif', 'mceVisualChars', false);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               switch (command) {\r
+                       case "mceVisualChars":\r
+                               this._toggleVisualChars(editor_id, inst);\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       cleanup : function(type, content, inst) {\r
+               if (type == "insert_to_editor_dom" || type == "get_from_editor_dom") {\r
+                       inst.visualChars.state = true;\r
+                       this._toggleVisualChars(inst.editorId, inst);\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       // Private plugin internal methods\r
+\r
+       _toggleVisualChars : function(editor_id, inst) {\r
+               var nl, i, h, d = inst.getDoc(), b = inst.getBody(), nv, s = inst.selection, bo;\r
+\r
+               inst.visualChars.state = !inst.visualChars.state;\r
+\r
+               bo = s.getBookmark(true);\r
+\r
+               tinyMCE.switchClass(editor_id + '_visualchars', inst.visualChars.state ? 'mceButtonSelected' : 'mceButtonNormal');\r
+\r
+               if (inst.visualChars.state) {\r
+                       nl = tinyMCE.selectNodes(b, function(n) {return n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1;});\r
+\r
+                       for (i=0; i<nl.length; i++) {\r
+                               nv = nl[i].nodeValue;\r
+                               nv = nv.replace(/(\u00a0+)/g, '<span class="mceItemHiddenVisualChar">$1</span>');\r
+                               nv = nv.replace(/\u00a0/g, '\u00b7');\r
+                               tinyMCE.setOuterHTML(nl[i], nv, d);\r
+                       }\r
+               } else {\r
+                       nl = tinyMCE.selectNodes(b, function(n) {return n.nodeType == 1 && n.nodeName == 'SPAN' && n.className == 'mceItemHiddenVisualChar';});\r
+\r
+                       for (i=0; i<nl.length; i++)\r
+                               tinyMCE.setOuterHTML(nl[i], nl[i].innerHTML.replace(/(&middot;|\u00b7)/g, '&nbsp;'), d);\r
+               }\r
+\r
+               //s.moveToBookmark(bo);\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("visualchars", TinyMCE_VisualCharsPlugin);\r
diff --git a/media/tiny_mce/plugins/visualchars/images/visualchars.gif b/media/tiny_mce/plugins/visualchars/images/visualchars.gif
new file mode 100755 (executable)
index 0000000..3b4293e
Binary files /dev/null and b/media/tiny_mce/plugins/visualchars/images/visualchars.gif differ
diff --git a/media/tiny_mce/plugins/visualchars/langs/en.js b/media/tiny_mce/plugins/visualchars/langs/en.js
new file mode 100755 (executable)
index 0000000..a82a4ee
--- /dev/null
@@ -0,0 +1,5 @@
+// EN lang variables\r
+\r
+tinyMCE.addToLang('visualchars',{\r
+desc : 'Visual control characters on/off.'\r
+});\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/abbr.htm b/media/tiny_mce/plugins/xhtmlxtras/abbr.htm
new file mode 100755 (executable)
index 0000000..30b0d1c
--- /dev/null
@@ -0,0 +1,148 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_xhtmlxtras_title_abbr_element}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/element_common.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/abbr.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertAbbr();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_xhtmlxtras_general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{$lang_xhtmlxtras_events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{$lang_xhtmlxtras_attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{$lang_xhtmlxtras_attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{$lang_xhtmlxtras_attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{$lang_xhtmlxtras_attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{$lang_xhtmlxtras_attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                               <option value="ltr">{$lang_xhtmlxtras_attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{$lang_xhtmlxtras_attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{$lang_xhtmlxtras_attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertAbbr();" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" value="{$lang_xhtmlxtras_remove}" onclick="removeAbbr();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/acronym.htm b/media/tiny_mce/plugins/xhtmlxtras/acronym.htm
new file mode 100755 (executable)
index 0000000..193760e
--- /dev/null
@@ -0,0 +1,148 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_xhtmlxtras_title_acronym_element}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/element_common.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/acronym.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertAcronym();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_xhtmlxtras_general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{$lang_xhtmlxtras_events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{$lang_xhtmlxtras_attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{$lang_xhtmlxtras_attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{$lang_xhtmlxtras_attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{$lang_xhtmlxtras_attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{$lang_xhtmlxtras_attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                               <option value="ltr">{$lang_xhtmlxtras_attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{$lang_xhtmlxtras_attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{$lang_xhtmlxtras_attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertAcronym();" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" value="{$lang_xhtmlxtras_remove}" onclick="removeAcronym();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/attributes.htm b/media/tiny_mce/plugins/xhtmlxtras/attributes.htm
new file mode 100755 (executable)
index 0000000..aaf1dee
--- /dev/null
@@ -0,0 +1,153 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_xhtmlxtras_attribs_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/attributes.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/attributes.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertAction();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_xhtmlxtras_attribute_attrib_tab}</a></span></li>\r
+                       <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{$lang_xhtmlxtras_attribute_events_tab}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_attribute_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{$lang_xhtmlxtras_attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{$lang_xhtmlxtras_attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td><label id="classlabel" for="classlist">{$lang_class_name}</label></td>\r
+                                               <td>\r
+                                                       <select id="classlist" name="classlist" class="mceEditableSelect">\r
+                                                               <option value="" selected>{$lang_not_set}</option>\r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{$lang_xhtmlxtras_attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{$lang_xhtmlxtras_attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir"> \r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                               <option value="ltr">{$lang_xhtmlxtras_option_ltr}</option> \r
+                                                               <option value="rtl">{$lang_xhtmlxtras_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{$lang_xhtmlxtras_attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" />\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                                       <td><label id="tabindexlabel" for="tabindex">{$lang_xhtmlxtras_attribute_label_tabindex}</label></td>\r
+                                                       <td><input type="text" id="tabindex" name="tabindex" value="" /></td>\r
+                                               </tr>\r
+\r
+                                               <tr>\r
+                                                       <td><label id="accesskeylabel" for="accesskey">{$lang_xhtmlxtras_attribute_label_accesskey}</label></td>\r
+                                                       <td><input type="text" id="accesskey" name="accesskey" value="" /></td>\r
+                                               </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_attribute_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertAction();" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/cite.htm b/media/tiny_mce/plugins/xhtmlxtras/cite.htm
new file mode 100755 (executable)
index 0000000..c72538c
--- /dev/null
@@ -0,0 +1,148 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_xhtmlxtras_title_cite_element}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/element_common.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/cite.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertCite();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_xhtmlxtras_general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{$lang_xhtmlxtras_events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{$lang_xhtmlxtras_attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{$lang_xhtmlxtras_attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{$lang_xhtmlxtras_attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{$lang_xhtmlxtras_attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{$lang_xhtmlxtras_attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                               <option value="ltr">{$lang_xhtmlxtras_attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{$lang_xhtmlxtras_attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{$lang_xhtmlxtras_attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertCite();" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" value="{$lang_xhtmlxtras_remove}" onclick="removeCite();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/css/attributes.css b/media/tiny_mce/plugins/xhtmlxtras/css/attributes.css
new file mode 100755 (executable)
index 0000000..9a6a235
--- /dev/null
@@ -0,0 +1,11 @@
+.panel_wrapper div.current {\r
+       height: 290px;\r
+}\r
+\r
+#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey {\r
+       width: 200px;\r
+}\r
+\r
+#events_panel input {\r
+       width: 200px;\r
+}\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/css/popup.css b/media/tiny_mce/plugins/xhtmlxtras/css/popup.css
new file mode 100755 (executable)
index 0000000..ecdc370
--- /dev/null
@@ -0,0 +1,46 @@
+a.mceButtonNormal img, a.mceButtonSelected img {border: 1px solid #F0F0EE !important;}\r
+a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {border: 1px solid #0A246A !important;  cursor: default;  background-color: #B6BDD2;}\r
+\r
+img {\r
+       border: 0;\r
+}\r
+\r
+input.field, select.field {\r
+       width: 200px;\r
+}\r
+\r
+input.picker {\r
+       width: 179px;\r
+       margin-left: 5px;\r
+}\r
+\r
+input.disabled {\r
+       border-color: #F2F2F2;\r
+}\r
+\r
+img.picker {\r
+       vertical-align: text-bottom;\r
+       cursor: pointer;\r
+}\r
+\r
+h1 {\r
+       padding: 0 0 5px 0;\r
+}\r
+\r
+#remove {\r
+       font-weight: bold;\r
+       width: 90px;\r
+       height: 21px;\r
+       border: 0px;\r
+       background-image: url('../images/remove_button_bg.gif');\r
+       cursor: pointer;\r
+       margin-left: 3px;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 160px;\r
+}\r
+\r
+#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {\r
+       height: 220px;\r
+}\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css b/media/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css
new file mode 100755 (executable)
index 0000000..6838d90
--- /dev/null
@@ -0,0 +1,24 @@
+ins {\r
+       border-bottom: 1px solid green;\r
+       text-decoration: none;\r
+       color: green;\r
+}\r
+\r
+del {\r
+       color: Red;\r
+       text-decoration: line-through;\r
+}\r
+\r
+cite {\r
+       border-bottom: 1px dashed blue;\r
+}\r
+\r
+acronym {\r
+       border-bottom: 1px dotted #CCC;\r
+       cursor: help;\r
+}\r
+\r
+abbr, html\:abbr {\r
+       border-bottom: 1px dashed #CCC;\r
+       cursor: help;\r
+}\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/del.htm b/media/tiny_mce/plugins/xhtmlxtras/del.htm
new file mode 100755 (executable)
index 0000000..11a4d18
--- /dev/null
@@ -0,0 +1,169 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_xhtmlxtras_title_del_element}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/element_common.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/del.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="xhtmlxtrasins" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertDel();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_xhtmlxtras_general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{$lang_xhtmlxtras_events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_general_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="datetimelabel" for="datetime">{$lang_xhtmlxtras_attribute_label_datetime}</label>:</td>\r
+                                               <td>\r
+                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                               <tr> \r
+                                                                       <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field" /></td> \r
+                                                                       <td><a href="javascript:insertDateTime('datetime');" class="mceButtonNormal"><img src="images/date_time.gif" class="picker" alt="{$lang_xhtmlxtras_insert_date}" title="{$lang_xhtmlxtras_insert_date}" /></a></td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="citelabel" for="cite">{$lang_xhtmlxtras_attribute_label_cite}</label>:</td>\r
+                                               <td><input id="cite" name="cite" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{$lang_xhtmlxtras_attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{$lang_xhtmlxtras_attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{$lang_xhtmlxtras_attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{$lang_xhtmlxtras_attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{$lang_xhtmlxtras_attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                               <option value="ltr">{$lang_xhtmlxtras_attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{$lang_xhtmlxtras_attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{$lang_xhtmlxtras_attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertDel();" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" value="{$lang_xhtmlxtras_remove}" onclick="removeDel();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/media/tiny_mce/plugins/xhtmlxtras/editor_plugin.js
new file mode 100755 (executable)
index 0000000..8fa8055
--- /dev/null
@@ -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://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',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);case"attribs":return tinyMCE.getButtonHTML(cn,'lang_xhtmlxtras_attribs_desc','{$pluginurl}/images/attribs.gif','mceAttributes',true)}return""},execCommand:function(editor_id,element,command,user_interface,value){var template,inst,elm;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;case"mceAttributes":inst=tinyMCE.getInstanceById(editor_id);elm=inst.getFocusElement();if(elm&&elm.nodeName!=='BODY'&&elm.className.indexOf('mceItem')==-1){tinyMCE.openWindow({file:'../../plugins/xhtmlxtras/attributes.htm',width:380,height:370},{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(/<abbr([^>]+)>/gi,'<html:ABBR $1>');content=content.replace(/<\/abbr>/gi,'</html:ABBR>')}return content},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var elm=tinyMCE.getParentElement(node);if(node==null)return;tinyMCE.switchClass(editor_id+'_attribs','mceButtonDisabled');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')}if(elm&&elm.nodeName!='BODY'&&elm.className.indexOf('mceItem')==-1)tinyMCE.switchClass(editor_id+'_attribs','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/media/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/media/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..7e73466
--- /dev/null
@@ -0,0 +1,199 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import plugin specific language pack */\r
+tinyMCE.importPluginLanguagePack('xhtmlxtras');\r
+\r
+var TinyMCE_XHTMLXtrasPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'XHTML Xtras Plugin',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/xhtmlxtras/css/xhtmlxtras.css");\r
+       },\r
+\r
+       getControlHTML : function(cn) {\r
+               switch (cn) {\r
+                       case "cite":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_cite_desc', '{$pluginurl}/images/cite.gif', 'mceCite', true);\r
+\r
+                       case "acronym":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_acronym_desc', '{$pluginurl}/images/acronym.gif', 'mceAcronym', true);\r
+\r
+                       case "abbr":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_abbr_desc', '{$pluginurl}/images/abbr.gif', 'mceAbbr', true);\r
+\r
+                       case "del":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_del_desc', '{$pluginurl}/images/del.gif', 'mceDel', true);\r
+\r
+                       case "ins":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_ins_desc', '{$pluginurl}/images/ins.gif', 'mceIns', true);\r
+\r
+                       case "attribs":\r
+                               return tinyMCE.getButtonHTML(cn, 'lang_xhtmlxtras_attribs_desc', '{$pluginurl}/images/attribs.gif', 'mceAttributes', true);\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               var template, inst, elm;\r
+\r
+               switch (command) {\r
+                       case "mceCite":\r
+                               if (!this._anySel(editor_id))\r
+                                       return true;\r
+\r
+                               template = new Array();\r
+                               template['file'] = '../../plugins/xhtmlxtras/cite.htm';\r
+                               template['width'] = 350;\r
+                               template['height'] = 250;\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id});\r
+                               return true;\r
+\r
+                       case "mceAcronym":\r
+                               if (!this._anySel(editor_id))\r
+                                       return true;\r
+\r
+                               template = new Array();\r
+                               template['file'] = '../../plugins/xhtmlxtras/acronym.htm';\r
+                               template['width'] = 350;\r
+                               template['height'] = 250;\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id});\r
+                               return true;\r
+\r
+                       case "mceAbbr":\r
+                               if (!this._anySel(editor_id))\r
+                                       return true;\r
+\r
+                               template = new Array();\r
+                               template['file'] = '../../plugins/xhtmlxtras/abbr.htm';\r
+                               template['width'] = 350;\r
+                               template['height'] = 250;\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id});\r
+                               return true;\r
+\r
+                       case "mceIns":\r
+                               if (!this._anySel(editor_id))\r
+                                       return true;\r
+\r
+                               template = new Array();\r
+                               template['file'] = '../../plugins/xhtmlxtras/ins.htm';\r
+                               template['width'] = 350;\r
+                               template['height'] = 310;\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id});\r
+                               return true;\r
+\r
+                       case "mceDel":\r
+                               if (!this._anySel(editor_id))\r
+                                       return true;\r
+\r
+                               template = new Array();\r
+                               template['file'] = '../../plugins/xhtmlxtras/del.htm';\r
+                               template['width'] = 350;\r
+                               template['height'] = 310;\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id});\r
+                               return true;\r
+\r
+                       case "mceAttributes":\r
+                               inst = tinyMCE.getInstanceById(editor_id);\r
+                               elm = inst.getFocusElement();\r
+\r
+                               if (elm && elm.nodeName !== 'BODY' && elm.className.indexOf('mceItem') == -1) {\r
+                                       tinyMCE.openWindow({\r
+                                               file : '../../plugins/xhtmlxtras/attributes.htm',\r
+                                               width : 380,\r
+                                               height : 370\r
+                                       }, {editor_id : editor_id});\r
+                               }\r
+\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       cleanup : function(type, content, inst) {\r
+               if (type == 'insert_to_editor' && tinyMCE.isIE && !tinyMCE.isOpera) {\r
+                       content = content.replace(/<abbr([^>]+)>/gi, '<html:ABBR $1>');\r
+                       content = content.replace(/<\/abbr>/gi, '</html:ABBR>');\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node, undo_index,undo_levels, visual_aid, any_selection) {\r
+               var elm = tinyMCE.getParentElement(node);\r
+\r
+               if (node == null)\r
+                       return;\r
+\r
+               tinyMCE.switchClass(editor_id + '_attribs', 'mceButtonDisabled');\r
+\r
+               if (!any_selection) {\r
+                       // Disable the buttons\r
+                       tinyMCE.switchClass(editor_id + '_cite', 'mceButtonDisabled');\r
+                       tinyMCE.switchClass(editor_id + '_acronym', 'mceButtonDisabled');\r
+                       tinyMCE.switchClass(editor_id + '_abbr', 'mceButtonDisabled');\r
+                       tinyMCE.switchClass(editor_id + '_del', 'mceButtonDisabled');\r
+                       tinyMCE.switchClass(editor_id + '_ins', 'mceButtonDisabled');\r
+               } else {\r
+                       // A selection means the buttons should be active.\r
+                       tinyMCE.switchClass(editor_id + '_cite', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_acronym', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_abbr', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_del', 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_ins', 'mceButtonNormal');\r
+               }\r
+\r
+               if (elm && elm.nodeName != 'BODY' && elm.className.indexOf('mceItem') == -1)\r
+                       tinyMCE.switchClass(editor_id + '_attribs', 'mceButtonNormal');\r
+\r
+               switch (node.nodeName) {\r
+                       case "CITE":\r
+                               tinyMCE.switchClass(editor_id + '_cite', 'mceButtonSelected');\r
+                               return true;\r
+\r
+                       case "ACRONYM":\r
+                               tinyMCE.switchClass(editor_id + '_acronym', 'mceButtonSelected');\r
+                               return true;\r
+\r
+                       case "abbr": // IE\r
+                       case "HTML:ABBR": // FF\r
+                       case "ABBR":\r
+                               tinyMCE.switchClass(editor_id + '_abbr', 'mceButtonSelected');\r
+                               return true;\r
+\r
+                       case "DEL":\r
+                               tinyMCE.switchClass(editor_id + '_del', 'mceButtonSelected');\r
+                               return true;\r
+\r
+                       case "INS":\r
+                               tinyMCE.switchClass(editor_id + '_ins', 'mceButtonSelected');\r
+                               return true;\r
+               }\r
+\r
+               return true;\r
+       },\r
+\r
+       _anySel : function(editor_id) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), t = inst.selection.getSelectedText(), pe;\r
+\r
+               pe = tinyMCE.getParentElement(inst.getFocusElement(), 'CITE,ACRONYM,ABBR,HTML:ABBR,DEL,INS');\r
+\r
+               return pe || inst.getFocusElement().nodeName == "IMG" || (t && t.length > 0);\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("xhtmlxtras", TinyMCE_XHTMLXtrasPlugin);\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/images/abbr.gif b/media/tiny_mce/plugins/xhtmlxtras/images/abbr.gif
new file mode 100755 (executable)
index 0000000..d00d830
Binary files /dev/null and b/media/tiny_mce/plugins/xhtmlxtras/images/abbr.gif differ
diff --git a/media/tiny_mce/plugins/xhtmlxtras/images/acronym.gif b/media/tiny_mce/plugins/xhtmlxtras/images/acronym.gif
new file mode 100755 (executable)
index 0000000..df4c93b
Binary files /dev/null and b/media/tiny_mce/plugins/xhtmlxtras/images/acronym.gif differ
diff --git a/media/tiny_mce/plugins/xhtmlxtras/images/attribs.gif b/media/tiny_mce/plugins/xhtmlxtras/images/attribs.gif
new file mode 100755 (executable)
index 0000000..fe4a3b6
Binary files /dev/null and b/media/tiny_mce/plugins/xhtmlxtras/images/attribs.gif differ
diff --git a/media/tiny_mce/plugins/xhtmlxtras/images/cite.gif b/media/tiny_mce/plugins/xhtmlxtras/images/cite.gif
new file mode 100755 (executable)
index 0000000..585bcd1
Binary files /dev/null and b/media/tiny_mce/plugins/xhtmlxtras/images/cite.gif differ
diff --git a/media/tiny_mce/plugins/xhtmlxtras/images/date_time.gif b/media/tiny_mce/plugins/xhtmlxtras/images/date_time.gif
new file mode 100755 (executable)
index 0000000..8ad424d
Binary files /dev/null and b/media/tiny_mce/plugins/xhtmlxtras/images/date_time.gif differ
diff --git a/media/tiny_mce/plugins/xhtmlxtras/images/del.gif b/media/tiny_mce/plugins/xhtmlxtras/images/del.gif
new file mode 100755 (executable)
index 0000000..ba49408
Binary files /dev/null and b/media/tiny_mce/plugins/xhtmlxtras/images/del.gif differ
diff --git a/media/tiny_mce/plugins/xhtmlxtras/images/ins.gif b/media/tiny_mce/plugins/xhtmlxtras/images/ins.gif
new file mode 100755 (executable)
index 0000000..277a364
Binary files /dev/null and b/media/tiny_mce/plugins/xhtmlxtras/images/ins.gif differ
diff --git a/media/tiny_mce/plugins/xhtmlxtras/images/remove_button_bg.gif b/media/tiny_mce/plugins/xhtmlxtras/images/remove_button_bg.gif
new file mode 100755 (executable)
index 0000000..5a069a8
Binary files /dev/null and b/media/tiny_mce/plugins/xhtmlxtras/images/remove_button_bg.gif differ
diff --git a/media/tiny_mce/plugins/xhtmlxtras/ins.htm b/media/tiny_mce/plugins/xhtmlxtras/ins.htm
new file mode 100755 (executable)
index 0000000..0aeb076
--- /dev/null
@@ -0,0 +1,169 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_xhtmlxtras_title_ins_element}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/editable_selects.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/element_common.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/ins.js"></script>\r
+       <link rel="stylesheet" type="text/css" href="css/popup.css" />\r
+       <base target="_self" />\r
+</head>\r
+<body id="xhtmlxtrasins" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertIns();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_xhtmlxtras_general_tab}</a></span></li>\r
+                       <!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{$lang_xhtmlxtras_events_tab}</a></span></li> -->\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_general_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="datetimelabel" for="datetime">{$lang_xhtmlxtras_attribute_label_datetime}</label>:</td> \r
+                                               <td>\r
+                                                       <table border="0" cellspacing="0" cellpadding="0">\r
+                                                               <tr> \r
+                                                                       <td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field" /></td> \r
+                                                                       <td><a href="javascript:insertDateTime('datetime');" class="mceButtonNormal"><img src="images/date_time.gif" class="picker" alt="{$lang_xhtmlxtras_insert_date}" title="{$lang_xhtmlxtras_insert_date}" /></a></td>\r
+                                                               </tr>\r
+                                                       </table>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="citelabel" for="cite">{$lang_xhtmlxtras_attribute_label_cite}</label>:</td> \r
+                                               <td><input id="cite" name="cite" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_attrib_tab}</legend>\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label id="titlelabel" for="title">{$lang_xhtmlxtras_attribute_label_title}</label>:</td> \r
+                                               <td><input id="title" name="title" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="idlabel" for="id">{$lang_xhtmlxtras_attribute_label_id}</label>:</td> \r
+                                               <td><input id="id" name="id" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="classlabel" for="class">{$lang_xhtmlxtras_attribute_label_class}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="class" name="class" class="field mceEditableSelect">\r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                       </select>\r
+                                               </td>\r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="stylelabel" for="class">{$lang_xhtmlxtras_attribute_label_style}</label>:</td> \r
+                                               <td><input id="style" name="style" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="dirlabel" for="dir">{$lang_xhtmlxtras_attribute_label_langdir}</label>:</td> \r
+                                               <td>\r
+                                                       <select id="dir" name="dir" class="field"> \r
+                                                               <option value="">{$lang_xhtmlxtras_not_set}</option> \r
+                                                               <option value="ltr">{$lang_xhtmlxtras_attribute_option_ltr}</option> \r
+                                                               <option value="rtl">{$lang_xhtmlxtras_attribute_option_rtl}</option> \r
+                                                       </select>\r
+                                               </td> \r
+                                       </tr>\r
+                                       <tr>\r
+                                               <td class="label"><label id="langlabel" for="lang">{$lang_xhtmlxtras_attribute_label_langcode}</label>:</td> \r
+                                               <td>\r
+                                                       <input id="lang" name="lang" type="text" value="" class="field" />\r
+                                               </td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+               <div id="events_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_xhtmlxtras_fieldset_events_tab}</legend>\r
+\r
+                               <table border="0" cellpadding="0" cellspacing="4">\r
+                                       <tr>\r
+                                               <td class="label"><label for="onfocus">onfocus</label>:</td> \r
+                                               <td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onblur">onblur</label>:</td> \r
+                                               <td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onclick">onclick</label>:</td> \r
+                                               <td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="ondblclick">ondblclick</label>:</td> \r
+                                               <td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousedown">onmousedown</label>:</td> \r
+                                               <td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseup">onmouseup</label>:</td> \r
+                                               <td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseover">onmouseover</label>:</td> \r
+                                               <td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmousemove">onmousemove</label>:</td> \r
+                                               <td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onmouseout">onmouseout</label>:</td> \r
+                                               <td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeypress">onkeypress</label>:</td> \r
+                                               <td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeydown">onkeydown</label>:</td> \r
+                                               <td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+\r
+                                       <tr>\r
+                                               <td class="label"><label for="onkeyup">onkeyup</label>:</td> \r
+                                               <td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> \r
+                                       </tr>\r
+                               </table>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertIns();" />\r
+               </div>\r
+               <div style="float: left">\r
+                       <input type="button" id="remove" name="remove" value="{$lang_xhtmlxtras_remove}" onclick="removeIns();" style="display: none;" />\r
+               </div>\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/plugins/xhtmlxtras/jscripts/abbr.js b/media/tiny_mce/plugins/xhtmlxtras/jscripts/abbr.js
new file mode 100755 (executable)
index 0000000..3f6853c
--- /dev/null
@@ -0,0 +1,29 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       SXE.initElementDialog('abbr');\r
+       if (SXE.currentAction == "update") {\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function insertAbbr() {\r
+       SXE.insertElement(tinyMCE.isIE && !tinyMCE.isOpera ? 'html:ABBR' : 'abbr');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeAbbr() {\r
+       SXE.removeElement('abbr');\r
+       tinyMCEPopup.close();\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/xhtmlxtras/jscripts/acronym.js b/media/tiny_mce/plugins/xhtmlxtras/jscripts/acronym.js
new file mode 100755 (executable)
index 0000000..36d76ee
--- /dev/null
@@ -0,0 +1,29 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       SXE.initElementDialog('acronym');\r
+       if (SXE.currentAction == "update") {\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function insertAcronym() {\r
+       SXE.insertElement('acronym');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeAcronym() {\r
+       SXE.removeElement('acronym');\r
+       tinyMCEPopup.close();\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/xhtmlxtras/jscripts/attributes.js b/media/tiny_mce/plugins/xhtmlxtras/jscripts/attributes.js
new file mode 100755 (executable)
index 0000000..ad886e5
--- /dev/null
@@ -0,0 +1,130 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2006, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\r
+\r
+       var f = document.forms[0];\r
+       \r
+       var onclick = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onclick'));\r
+\r
+       setFormValue('title', tinyMCE.getAttrib(elm, 'title'));\r
+       setFormValue('id', tinyMCE.getAttrib(elm, 'id'));\r
+       setFormValue('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style"))));\r
+       setFormValue('dir', tinyMCE.getAttrib(elm, 'dir'));\r
+       setFormValue('lang', tinyMCE.getAttrib(elm, 'lang'));\r
+       setFormValue('tabindex', tinyMCE.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));\r
+       setFormValue('accesskey', tinyMCE.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));\r
+       setFormValue('onfocus', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onfocus')));\r
+       setFormValue('onblur', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onblur')));\r
+       setFormValue('onclick', onclick);\r
+       setFormValue('ondblclick', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'ondblclick')));\r
+       setFormValue('onmousedown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousedown')));\r
+       setFormValue('onmouseup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseup')));\r
+       setFormValue('onmouseover', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover')));\r
+       setFormValue('onmousemove', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousemove')));\r
+       setFormValue('onmouseout', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout')));\r
+       setFormValue('onkeypress', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeypress')));\r
+       setFormValue('onkeydown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeydown')));\r
+       setFormValue('onkeyup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeyup')));\r
+       \r
+       className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(elm, 'class'), false);\r
+               \r
+       addClassesToList('classlist', 'advlink_styles');\r
+       selectByValue(f, 'classlist', className, true);\r
+       \r
+       TinyMCE_EditableSelects.init();\r
+}\r
+\r
+function setFormValue(name, value) {\r
+       if(value && document.forms[0].elements[name]){\r
+               document.forms[0].elements[name].value = value;\r
+       }\r
+}\r
+\r
+function insertAction() {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var elm = inst.getFocusElement();\r
+\r
+       tinyMCEPopup.execCommand("mceBeginUndoLevel");  \r
+       tinyMCEPopup.restoreSelection();\r
+       \r
+       setAllAttribs(elm);\r
+       \r
+       tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       tinyMCE._setEventsEnabled(inst.getBody(), false);\r
+       tinyMCEPopup.execCommand("mceEndUndoLevel");\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function setAttrib(elm, attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib.toLowerCase()];\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value != "") {\r
+               tinyMCE.setAttrib(elm, attrib.toLowerCase(), value);\r
+\r
+               if (attrib == "style")\r
+                       attrib = "style.cssText";\r
+\r
+               if (attrib.substring(0, 2) == 'on')\r
+                       value = 'return true;' + value;\r
+\r
+               if (attrib == "class")\r
+                       attrib = "className";\r
+\r
+               eval('elm.' + attrib + "=value;");\r
+       } else\r
+               elm.removeAttribute(attrib);\r
+}\r
+\r
+function setAllAttribs(elm) {\r
+       var f = document.forms[0];\r
+\r
+       setAttrib(elm, 'title');\r
+       setAttrib(elm, 'id');\r
+       setAttrib(elm, 'style');\r
+       setAttrib(elm, 'class', getSelectValue(f, 'classlist'));\r
+       setAttrib(elm, 'dir');\r
+       setAttrib(elm, 'lang');\r
+       setAttrib(elm, 'tabindex');\r
+       setAttrib(elm, 'accesskey');\r
+       setAttrib(elm, 'onfocus');\r
+       setAttrib(elm, 'onblur');\r
+       setAttrib(elm, 'onclick');\r
+       setAttrib(elm, 'ondblclick');\r
+       setAttrib(elm, 'onmousedown');\r
+       setAttrib(elm, 'onmouseup');\r
+       setAttrib(elm, 'onmouseover');\r
+       setAttrib(elm, 'onmousemove');\r
+       setAttrib(elm, 'onmouseout');\r
+       setAttrib(elm, 'onkeypress');\r
+       setAttrib(elm, 'onkeydown');\r
+       setAttrib(elm, 'onkeyup');\r
+\r
+       // Refresh in old MSIE\r
+       if (tinyMCE.isMSIE5)\r
+               elm.outerHTML = elm.outerHTML;\r
+}\r
+\r
+function insertAttribute() {\r
+       tinyMCEPopup.close();\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/xhtmlxtras/jscripts/cite.js b/media/tiny_mce/plugins/xhtmlxtras/jscripts/cite.js
new file mode 100755 (executable)
index 0000000..4804db4
--- /dev/null
@@ -0,0 +1,29 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       SXE.initElementDialog('cite');\r
+       if (SXE.currentAction == "update") {\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function insertCite() {\r
+       SXE.insertElement('cite');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeCite() {\r
+       SXE.removeElement('cite');\r
+       tinyMCEPopup.close();\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/xhtmlxtras/jscripts/del.js b/media/tiny_mce/plugins/xhtmlxtras/jscripts/del.js
new file mode 100755 (executable)
index 0000000..08e2f16
--- /dev/null
@@ -0,0 +1,54 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       SXE.initElementDialog('del');\r
+       if (SXE.currentAction == "update") {\r
+               setFormValue('datetime', tinyMCE.getAttrib(SXE.updateElement, 'datetime'));\r
+               setFormValue('cite', tinyMCE.getAttrib(SXE.updateElement, 'cite'));\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function setElementAttribs(elm) {\r
+       setAllCommonAttribs(elm);\r
+       setAttrib(elm, 'datetime');\r
+       setAttrib(elm, 'cite');\r
+}\r
+\r
+function insertDel() {\r
+       var elm = tinyMCE.getParentElement(SXE.focusElement, 'del');\r
+\r
+       tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
+       if (elm == null) {\r
+               var s = SXE.inst.selection.getSelectedHTML();\r
+               if(s.length > 0) {\r
+                       tinyMCEPopup.execCommand('mceInsertContent', false, '<del id="#sxe_temp_del#">' + s + '</del>');\r
+                       var elementArray = tinyMCE.getElementsByAttributeValue(SXE.inst.getBody(), 'del', 'id', '#sxe_temp_del#');\r
+                       for (var i=0; i<elementArray.length; i++) {\r
+                               var elm = elementArray[i];\r
+                               setElementAttribs(elm);\r
+                       }\r
+               }\r
+       } else {\r
+               setElementAttribs(elm);\r
+       }\r
+       tinyMCE.triggerNodeChange();\r
+       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeDel() {\r
+       SXE.removeElement('del');\r
+       tinyMCEPopup.close();\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/xhtmlxtras/jscripts/element_common.js b/media/tiny_mce/plugins/xhtmlxtras/jscripts/element_common.js
new file mode 100755 (executable)
index 0000000..40e5860
--- /dev/null
@@ -0,0 +1,241 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function initCommonAttributes(elm) {\r
+       var formObj = document.forms[0];\r
+\r
+       // Setup form data for common element attributes\r
+       setFormValue('title', tinyMCE.getAttrib(elm, 'title'));\r
+       setFormValue('id', tinyMCE.getAttrib(elm, 'id'));\r
+       selectByValue(formObj, 'class', tinyMCE.getAttrib(elm, 'class'), true);\r
+       setFormValue('style', tinyMCE.getAttrib(elm, 'style'));\r
+       selectByValue(formObj, 'dir', tinyMCE.getAttrib(elm, 'dir'));\r
+       setFormValue('lang', tinyMCE.getAttrib(elm, 'lang'));\r
+       setFormValue('onfocus', tinyMCE.getAttrib(elm, 'onfocus'));\r
+       setFormValue('onblur', tinyMCE.getAttrib(elm, 'onblur'));\r
+       setFormValue('onclick', tinyMCE.getAttrib(elm, 'onclick'));\r
+       setFormValue('ondblclick', tinyMCE.getAttrib(elm, 'ondblclick'));\r
+       setFormValue('onmousedown', tinyMCE.getAttrib(elm, 'onmousedown'));\r
+       setFormValue('onmouseup', tinyMCE.getAttrib(elm, 'onmouseup'));\r
+       setFormValue('onmouseover', tinyMCE.getAttrib(elm, 'onmouseover'));\r
+       setFormValue('onmousemove', tinyMCE.getAttrib(elm, 'onmousemove'));\r
+       setFormValue('onmouseout', tinyMCE.getAttrib(elm, 'onmouseout'));\r
+       setFormValue('onkeypress', tinyMCE.getAttrib(elm, 'onkeypress'));\r
+       setFormValue('onkeydown', tinyMCE.getAttrib(elm, 'onkeydown'));\r
+       setFormValue('onkeyup', tinyMCE.getAttrib(elm, 'onkeyup'));\r
+}\r
+\r
+function setFormValue(name, value) {\r
+       if(document.forms[0].elements[name]) document.forms[0].elements[name].value = value;\r
+}\r
+\r
+function insertDateTime(id) {\r
+       document.getElementById(id).value = getDateTime(new Date(), "%Y-%m-%dT%H:%M:%S");\r
+}\r
+\r
+function getDateTime(d, fmt) {\r
+       fmt = fmt.replace("%D", "%m/%d/%y");\r
+       fmt = fmt.replace("%r", "%I:%M:%S %p");\r
+       fmt = fmt.replace("%Y", "" + d.getFullYear());\r
+       fmt = fmt.replace("%y", "" + d.getYear());\r
+       fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));\r
+       fmt = fmt.replace("%d", addZeros(d.getDate(), 2));\r
+       fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));\r
+       fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));\r
+       fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));\r
+       fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));\r
+       fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));\r
+       fmt = fmt.replace("%%", "%");\r
+\r
+       return fmt;\r
+}\r
+\r
+function addZeros(value, len) {\r
+       var i;\r
+\r
+       value = "" + value;\r
+\r
+       if (value.length < len) {\r
+               for (i=0; i<(len-value.length); i++)\r
+                       value = "0" + value;\r
+       }\r
+\r
+       return value;\r
+}\r
+\r
+function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {\r
+       if (!form_obj || !form_obj.elements[field_name])\r
+               return;\r
+\r
+       var sel = form_obj.elements[field_name];\r
+\r
+       var found = false;\r
+       for (var i=0; i<sel.options.length; i++) {\r
+               var option = sel.options[i];\r
+\r
+               if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {\r
+                       option.selected = true;\r
+                       found = true;\r
+               } else\r
+                       option.selected = false;\r
+       }\r
+\r
+       if (!found && add_custom && value != '') {\r
+               var option = new Option('Value: ' + value, value);\r
+               option.selected = true;\r
+               sel.options[sel.options.length] = option;\r
+       }\r
+\r
+       return found;\r
+}\r
+\r
+function setAttrib(elm, attrib, value) {\r
+       var formObj = document.forms[0];\r
+       var valueElm = formObj.elements[attrib.toLowerCase()];\r
+\r
+       if (typeof(value) == "undefined" || value == null) {\r
+               value = "";\r
+\r
+               if (valueElm)\r
+                       value = valueElm.value;\r
+       }\r
+\r
+       if (value != "") {\r
+               if (attrib == "style")\r
+                       attrib = "style.cssText";\r
+\r
+               if (attrib.substring(0, 2) == 'on')\r
+                       value = 'return true;' + value;\r
+\r
+               if (attrib == "class") {\r
+                       tinyMCE.addCSSClass(elm, value);\r
+                       return;\r
+               }\r
+\r
+               elm.setAttribute(attrib.toLowerCase(), value);\r
+       } else\r
+               elm.removeAttribute(attrib);\r
+}\r
+\r
+function setAllCommonAttribs(elm) {\r
+       setAttrib(elm, 'title');\r
+       setAttrib(elm, 'id');\r
+       setAttrib(elm, 'class');\r
+       setAttrib(elm, 'style');\r
+       setAttrib(elm, 'dir');\r
+       setAttrib(elm, 'lang');\r
+       /*setAttrib(elm, 'onfocus');\r
+       setAttrib(elm, 'onblur');\r
+       setAttrib(elm, 'onclick');\r
+       setAttrib(elm, 'ondblclick');\r
+       setAttrib(elm, 'onmousedown');\r
+       setAttrib(elm, 'onmouseup');\r
+       setAttrib(elm, 'onmouseover');\r
+       setAttrib(elm, 'onmousemove');\r
+       setAttrib(elm, 'onmouseout');\r
+       setAttrib(elm, 'onkeypress');\r
+       setAttrib(elm, 'onkeydown');\r
+       setAttrib(elm, 'onkeyup');*/\r
+}\r
+\r
+SXE = {\r
+       currentAction : "insert",\r
+       inst : tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')),\r
+       updateElement : null\r
+}\r
+\r
+SXE.focusElement = SXE.inst.getFocusElement();\r
+\r
+SXE.initElementDialog = function(element_name) {\r
+       addClassesToList('class', 'xhtmlxtras_styles');\r
+       TinyMCE_EditableSelects.init();\r
+\r
+       element_name = element_name.toLowerCase();\r
+       var elm = tinyMCE.getParentElement(SXE.focusElement, element_name);\r
+       if (elm != null && elm.nodeName == element_name.toUpperCase()) {\r
+               SXE.currentAction = "update";\r
+       }\r
+\r
+       if (SXE.currentAction == "update") {\r
+               initCommonAttributes(elm);\r
+               SXE.updateElement = elm;\r
+       }\r
+\r
+       document.forms[0].insert.value = tinyMCE.getLang('lang_' + SXE.currentAction, 'Insert', true); \r
+}\r
+\r
+SXE.insertElement = function(element_name) {\r
+       var elm = tinyMCE.getParentElement(SXE.focusElement, element_name), h, tagName;\r
+\r
+       tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
+       if (elm == null) {\r
+               var s = SXE.inst.selection.getSelectedHTML();\r
+               if(s.length > 0) {\r
+                       tagName = element_name;\r
+\r
+                       if (tinyMCE.isIE && !tinyMCE.isOpera && element_name.indexOf('html:') == 0)\r
+                               element_name = element_name.substring(5).toLowerCase();\r
+\r
+                       h = '<' + tagName + ' id="#sxe_temp_' + element_name + '#">' + s + '</' + tagName + '>';\r
+\r
+                       tinyMCEPopup.execCommand('mceInsertContent', false, h);\r
+\r
+                       var elementArray = tinyMCE.getElementsByAttributeValue(SXE.inst.getBody(), element_name, 'id', '#sxe_temp_' + element_name + '#');\r
+                       for (var i=0; i<elementArray.length; i++) {\r
+                               var elm = elementArray[i];\r
+\r
+                               elm.id = '';\r
+                               elm.setAttribute('id', '');\r
+                               elm.removeAttribute('id');\r
+\r
+                               setAllCommonAttribs(elm);\r
+                       }\r
+               }\r
+       } else {\r
+               setAllCommonAttribs(elm);\r
+       }\r
+       tinyMCE.triggerNodeChange();\r
+       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
+}\r
+\r
+SXE.removeElement = function(element_name){\r
+       element_name = element_name.toLowerCase();\r
+       elm = tinyMCE.getParentElement(SXE.focusElement, element_name);\r
+       if(elm && elm.nodeName == element_name.toUpperCase()){\r
+               tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
+               tinyMCE.execCommand('mceRemoveNode', false, elm);\r
+               tinyMCE.triggerNodeChange();\r
+               tinyMCEPopup.execCommand('mceEndUndoLevel');\r
+       }\r
+}\r
+\r
+SXE.showRemoveButton = function() {\r
+               document.getElementById("remove").style.display = 'block';\r
+}\r
+\r
+SXE.containsClass = function(elm,cl) {\r
+       return (elm.className.indexOf(cl) > -1) ? true : false;\r
+}\r
+\r
+SXE.removeClass = function(elm,cl) {\r
+       if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) {\r
+               return true;\r
+       }\r
+       var classNames = elm.className.split(" ");\r
+       var newClassNames = "";\r
+       for (var x = 0, cnl = classNames.length; x < cnl; x++) {\r
+               if (classNames[x] != cl) {\r
+                       newClassNames += (classNames[x] + " ");\r
+               }\r
+       }\r
+       elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end\r
+}\r
+\r
+SXE.addClass = function(elm,cl) {\r
+       if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl;\r
+       return true;\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/xhtmlxtras/jscripts/ins.js b/media/tiny_mce/plugins/xhtmlxtras/jscripts/ins.js
new file mode 100755 (executable)
index 0000000..8fdc364
--- /dev/null
@@ -0,0 +1,53 @@
+ /**\r
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $\r
+ *\r
+ * @author Moxiecode - based on work by Andrew Tetlaw\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function preinit() {\r
+       // Initialize\r
+       tinyMCE.setWindowArg('mce_windowresize', false);\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       SXE.initElementDialog('ins');\r
+       if (SXE.currentAction == "update") {\r
+               setFormValue('datetime', tinyMCE.getAttrib(SXE.updateElement, 'datetime'));\r
+               setFormValue('cite', tinyMCE.getAttrib(SXE.updateElement, 'cite'));\r
+               SXE.showRemoveButton();\r
+       }\r
+}\r
+\r
+function setElementAttribs(elm) {\r
+       setAllCommonAttribs(elm);\r
+       setAttrib(elm, 'datetime');\r
+       setAttrib(elm, 'cite');\r
+}\r
+\r
+function insertIns() {\r
+       var elm = tinyMCE.getParentElement(SXE.focusElement, 'ins');\r
+       tinyMCEPopup.execCommand('mceBeginUndoLevel');\r
+       if (elm == null) {\r
+               var s = SXE.inst.selection.getSelectedHTML();\r
+               if(s.length > 0) {\r
+                       tinyMCEPopup.execCommand('mceInsertContent', false, '<ins id="#sxe_temp_ins#">' + s + '</ins>');\r
+                       var elementArray = tinyMCE.getElementsByAttributeValue(SXE.inst.getBody(), 'ins', 'id', '#sxe_temp_ins#');\r
+                       for (var i=0; i<elementArray.length; i++) {\r
+                               var elm = elementArray[i];\r
+                               setElementAttribs(elm);\r
+                       }\r
+               }\r
+       } else {\r
+               setElementAttribs(elm);\r
+       }\r
+       tinyMCE.triggerNodeChange();\r
+       tinyMCEPopup.execCommand('mceEndUndoLevel');\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function removeIns() {\r
+       SXE.removeElement('ins');\r
+       tinyMCEPopup.close();\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/plugins/xhtmlxtras/langs/en.js b/media/tiny_mce/plugins/xhtmlxtras/langs/en.js
new file mode 100755 (executable)
index 0000000..50d244c
--- /dev/null
@@ -0,0 +1,42 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('xhtmlxtras',{\r
+cite_desc : 'Citation',\r
+abbr_desc : 'Abbreviation',\r
+acronym_desc : 'Acronym',\r
+del_desc : 'Deletion',\r
+ins_desc : 'Insertion',\r
+attribute_label_title : 'Title',\r
+attribute_label_id : 'ID',\r
+attribute_label_class : 'Class',\r
+attribute_label_style : 'Style',\r
+attribute_label_cite : 'Cite',\r
+attribute_label_datetime : 'Date/Time',\r
+attribute_label_langdir : 'Text Direction',\r
+attribute_option_ltr : 'Left to right',\r
+attribute_option_rtl : 'Right to left',\r
+attribute_label_langcode : 'Language',\r
+attribute_label_tabindex : 'TabIndex',\r
+attribute_label_accesskey : 'AccessKey',\r
+attribute_label_cite : 'Cite',\r
+attribute_events_tab : 'Events',\r
+attribute_attrib_tab : 'Attributes',\r
+general_tab : 'General',\r
+attrib_tab : 'Attributes',\r
+events_tab : 'Events',\r
+fieldset_general_tab : 'General Settings',\r
+fieldset_attrib_tab : 'Element Attributes',\r
+fieldset_events_tab : 'Element Events',\r
+title_ins_element : 'Insertion Element',\r
+title_del_element : 'Deletion Element',\r
+title_acronym_element : 'Acronym Element',\r
+title_abbr_element : 'Abbreviation Element',\r
+title_cite_element : 'Citation Element',\r
+remove : 'Remove',\r
+not_set : '--not set--',\r
+insert_date : 'Insert current date/time',\r
+option_ltr : 'Left to right',\r
+option_rtl : 'Right to left',\r
+attribs_desc : 'Insert/Edit Attributes',\r
+attribs_title : 'Insert/Edit Attributes'\r
+});\r
diff --git a/media/tiny_mce/plugins/zoom/editor_plugin.js b/media/tiny_mce/plugins/zoom/editor_plugin.js
new file mode 100755 (executable)
index 0000000..ee3dd8e
--- /dev/null
@@ -0,0 +1 @@
+var TinyMCE_ZoomPlugin={getInfo:function(){return{longname:'Zoom',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/zoom',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(control_name){if(!tinyMCE.isMSIE||tinyMCE.isMSIE5_0||tinyMCE.isOpera)return"";switch(control_name){case"zoom":return'<select id="{$editor_id}_zoomSelect" name="{$editor_id}_zoomSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceZoom\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+'<option value="100%">+ 100%</option>'+'<option value="150%">+ 150%</option>'+'<option value="200%">+ 200%</option>'+'<option value="250%">+ 250%</option>'+'</select>'}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/media/tiny_mce/plugins/zoom/editor_plugin_src.js b/media/tiny_mce/plugins/zoom/editor_plugin_src.js
new file mode 100755 (executable)
index 0000000..cd09872
--- /dev/null
@@ -0,0 +1,56 @@
+/**\r
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+var TinyMCE_ZoomPlugin = {\r
+       getInfo : function() {\r
+               return {\r
+                       longname : 'Zoom',\r
+                       author : 'Moxiecode Systems AB',\r
+                       authorurl : 'http://tinymce.moxiecode.com',\r
+                       infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/zoom',\r
+                       version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion\r
+               };\r
+       },\r
+\r
+       /**\r
+        * Returns the HTML contents of the zoom control.\r
+        */\r
+       getControlHTML : function(control_name) {\r
+               if (!tinyMCE.isMSIE || tinyMCE.isMSIE5_0 || tinyMCE.isOpera)\r
+                       return "";\r
+\r
+               switch (control_name) {\r
+                       case "zoom":\r
+                               return '<select id="{$editor_id}_zoomSelect" name="{$editor_id}_zoomSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceZoom\',false,this.options[this.selectedIndex].value);" class="mceSelectList">' + \r
+                                               '<option value="100%">+ 100%</option>' + \r
+                                               '<option value="150%">+ 150%</option>' + \r
+                                               '<option value="200%">+ 200%</option>' + \r
+                                               '<option value="250%">+ 250%</option>' + \r
+                                               '</select>';\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Executes the mceZoom command.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               // Handle commands\r
+               switch (command) {\r
+                       case "mceZoom":\r
+                               tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom = value;\r
+                               tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom = value;\r
+                               return true;\r
+               }\r
+\r
+               // Pass to next handler in chain\r
+               return false;\r
+       }\r
+};\r
+\r
+tinyMCE.addPlugin("zoom", TinyMCE_ZoomPlugin);\r
diff --git a/media/tiny_mce/plugins/zoom/readme.txt b/media/tiny_mce/plugins/zoom/readme.txt
new file mode 100755 (executable)
index 0000000..4fdb78a
--- /dev/null
@@ -0,0 +1 @@
+Check the TinyMCE documentation for details on this plugin.\r
diff --git a/media/tiny_mce/themes/advanced/about.htm b/media/tiny_mce/themes/advanced/about.htm
new file mode 100755 (executable)
index 0000000..6918488
--- /dev/null
@@ -0,0 +1,52 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_about_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/about.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body id="about" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+               <div class="tabs">\r
+                       <ul>\r
+                               <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_about}</a></span></li>\r
+                               <li id="help_tab"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{$lang_help}</a></span></li>\r
+                               <li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{$lang_plugins}</a></span></li>\r
+                       </ul>\r
+               </div>\r
+\r
+               <div class="panel_wrapper">\r
+                       <div id="general_panel" class="panel current">\r
+                               <h3>{$lang_about_title}</h3>\r
+                               <p>Version: {$tinymce_version} ({$tinymce_releasedate})</p>\r
+                               <p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under <a href="../../license.txt" target="_blank">LGPL</a>\r
+                               by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p>\r
+                               <p>Copyright &copy; 2003-2007, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p>\r
+                               <p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p>\r
+\r
+                               <div id="buttoncontainer"></div>\r
+                       </div>\r
+\r
+                       <div id="plugins_panel" class="panel">\r
+                               <div id="pluginscontainer">\r
+                                       <h3>{$lang_loaded_plugins}</h3>\r
+\r
+                                       <div id="plugintablecontainer">\r
+                                       </div>\r
+\r
+                                       <p>&nbsp;</p>\r
+                               </div>\r
+                       </div>\r
+\r
+                       <div id="help_panel" class="panel noscroll" style="overflow: visible;">\r
+                               <div id="iframecontainer"></div>\r
+                       </div>\r
+               </div>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: right">\r
+                               <input type="button" id="cancel" name="cancel" value="{$lang_close}" onclick="tinyMCEPopup.close();" />\r
+                       </div>\r
+               </div>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/themes/advanced/anchor.htm b/media/tiny_mce/themes/advanced/anchor.htm
new file mode 100755 (executable)
index 0000000..53d7969
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_anchor_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/anchor.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertAnchor();return false;" action="#">\r
+\r
+       <table border="0" cellpadding="4" cellspacing="0">\r
+               <tr>\r
+                       <td colspan="2" class="title">{$lang_insert_anchor_title}</td>\r
+               </tr>\r
+               <tr>\r
+                       <td nowrap="nowrap">{$lang_insert_anchor_name}:</td>\r
+                       <td><input name="anchorName" type="text" id="anchorName" value="" style="width: 200px" /></td>\r
+               </tr>\r
+       </table>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_update}" onclick="insertAnchor();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/themes/advanced/charmap.htm b/media/tiny_mce/themes/advanced/charmap.htm
new file mode 100755 (executable)
index 0000000..9aed1d4
--- /dev/null
@@ -0,0 +1,53 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_theme_charmap_title}</title>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/charmap.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<table align="center" border="0" cellspacing="0" cellpadding="2">\r
+    <tr>\r
+        <td colspan="2" class="title">{$lang_theme_charmap_title}</td>\r
+    </tr>\r
+    <tr>\r
+        <td rowspan="2" align="left" valign="top">\r
+            <script language="javascript" type="text/javascript">renderCharMapHTML();</script>\r
+        </td>\r
+        <td width="100" align="center" valign="top">\r
+            <table border="0" cellpadding="0" cellspacing="0" width="100" style="height: 100px">\r
+                <tr>\r
+                    <td class="charmapOver" style="font-size: 40px; height:80px;" id="codeV">&nbsp;</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 10px; font-family: Arial, Helvetica, sans-serif; text-align:center;" id="codeN">&nbsp;</td>\r
+                </tr>\r
+            </table>\r
+        </td>\r
+    </tr>\r
+    <tr>\r
+        <td valign="bottom" style="padding-bottom: 3px;">\r
+            <table width="100" align="center" border="0" cellpadding="2" cellspacing="0">\r
+                <tr>\r
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">HTML-Code</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeA" align="center">&nbsp;</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 1px;">&nbsp;</td>\r
+                </tr>\r
+                <tr>\r
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">NUM-Code</td>\r
+                </tr>\r
+                <tr>\r
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeB" align="center">&nbsp;</td>\r
+                </tr>\r
+            </table>\r
+        </td>\r
+    </tr>\r
+</table>\r
+\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/themes/advanced/color_picker.htm b/media/tiny_mce/themes/advanced/color_picker.htm
new file mode 100755 (executable)
index 0000000..668d744
--- /dev/null
@@ -0,0 +1,74 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_theme_colorpicker_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/color_picker.js"></script>\r
+       <link href="css/colorpicker.css" rel="stylesheet" type="text/css" />\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="picker_tab" class="current"><span><a href="javascript:mcTabs.displayTab('picker_tab','picker_panel');" onmousedown="return false;">{$lang_color_picker_tab}</a></span></li>\r
+                       <li id="rgb_tab"><span><a href="#" onclick="generateWebColors();mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{$lang_web_colors_tab}</a></span></li>\r
+                       <li id="named_tab"><span><a  href="#" onclick="generateNamedColors();javascript:mcTabs.displayTab('named_tab','named_panel');" onmousedown="return false;">{$lang_named_colors_tab}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="picker_panel" class="panel current">\r
+                       <fieldset>\r
+                               <legend>{$lang_color_picker}</legend>\r
+                               <div id="picker">\r
+                                       <img id="colorpicker" src="images/colors.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" />\r
+\r
+                                       <div id="light">\r
+                                               <!-- Will be filled with divs -->\r
+                                       </div>\r
+\r
+                                       <br style="clear: both" />\r
+                               </div>\r
+                       </fieldset>\r
+               </div>\r
+\r
+               <div id="rgb_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_web_colors}</legend>\r
+                               <div id="webcolors">\r
+                                       <!-- Gets filled with web safe colors-->\r
+                               </div>\r
+\r
+                               <br style="clear: both" />\r
+                       </fieldset>\r
+               </div>\r
+\r
+               <div id="named_panel" class="panel">\r
+                       <fieldset>\r
+                               <legend>{$lang_named_colors}</legend>\r
+                               <div id="namedcolors">\r
+                                       <!-- Gets filled with named colors-->\r
+                               </div>\r
+\r
+                               <br style="clear: both" />\r
+\r
+                               <div id="colornamecontainer">\r
+                                       {$lang_color_name} <span id="colorname"></span>\r
+                               </div>\r
+                       </fieldset>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_theme_colorpicker_apply}" onclick="insertAction();" />\r
+               </div>\r
+\r
+               <div id="preview"></div>\r
+\r
+               <div id="previewblock">\r
+                       <label for="color">{$lang_color}</label> <input id="color" type="text" size="8" maxlength="8" class="text" />\r
+               </div>\r
+       </div>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/themes/advanced/css/colorpicker.css b/media/tiny_mce/themes/advanced/css/colorpicker.css
new file mode 100755 (executable)
index 0000000..4b0360b
--- /dev/null
@@ -0,0 +1,53 @@
+/* Colorpicker dialog specific CSS */\r
+\r
+#preview {\r
+       float: right;\r
+       width: 50px;\r
+       height: 14px;\r
+       line-height: 1px;\r
+       border: 1px solid black;\r
+       margin-left: 5px;\r
+}\r
+\r
+#colorpicker {\r
+       float: left;\r
+       cursor: crosshair;\r
+}\r
+\r
+#light {\r
+       border: 1px solid gray;\r
+       margin-left: 5px;\r
+       float: left;\r
+       width: 15px;\r
+       cursor: crosshair;\r
+}\r
+\r
+#light div {\r
+       overflow: hidden;\r
+}\r
+\r
+#previewblock {\r
+       float: right;\r
+       padding-left: 10px;\r
+       height: 20px;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       height: 175px;\r
+}\r
+\r
+#namedcolors {\r
+       width: 150px;\r
+}\r
+\r
+#namedcolors a {\r
+       display: block;\r
+       float: left;\r
+       width: 10px; height: 10px;\r
+       margin: 1px 1px 0 0;\r
+       overflow: hidden;\r
+}\r
+\r
+#colornamecontainer {\r
+       margin-top: 5px;\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/themes/advanced/css/editor_content.css b/media/tiny_mce/themes/advanced/css/editor_content.css
new file mode 100755 (executable)
index 0000000..182e791
--- /dev/null
@@ -0,0 +1,58 @@
+/* This file contains the CSS data for the editable area(iframe) of TinyMCE */\r
+/* You can extend this CSS by adding your own CSS file with the the content_css option */\r
+\r
+body, td, pre {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+body {\r
+       background-color: #FFFFFF;\r
+}\r
+\r
+.mceVisualAid {\r
+       border: 1px dashed #BBBBBB !important;\r
+}\r
+\r
+div.mceVisualAid {\r
+       background-image:url('../images/spacer.gif');\r
+       visibility: visible !important;\r
+}\r
+\r
+.mceItemAnchor {\r
+       width: 12px;\r
+       line-height: 6px;\r
+       overflow: hidden;\r
+       padding-left: 12px;\r
+       background-image: url('../images/anchor_symbol.gif');\r
+       background-position: bottom;\r
+       background-repeat: no-repeat;\r
+}\r
+\r
+/* Important is needed in Gecko browsers inorder to style links */\r
+/*\r
+a {\r
+       color: green !important;\r
+}\r
+*/\r
+\r
+/* Style selection range colors in Gecko browsers */\r
+/*\r
+::-moz-selection {\r
+       background-color: red;\r
+       color: green;\r
+}\r
+*/\r
+\r
+/* MSIE specific */\r
+\r
+* html body {\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+}\r
diff --git a/media/tiny_mce/themes/advanced/css/editor_popup.css b/media/tiny_mce/themes/advanced/css/editor_popup.css
new file mode 100755 (executable)
index 0000000..f8d3550
--- /dev/null
@@ -0,0 +1,331 @@
+/* This file contains the CSS data for all popups in TinyMCE */\r
+\r
+body {\r
+       background-color: #F0F0EE;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+       margin: 8px;\r
+}\r
+\r
+td {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+}\r
+\r
+input {\r
+       background: #FFFFFF;\r
+       border: 1px solid #cccccc;\r
+}\r
+\r
+td, input, select, textarea {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+input, select, textarea {\r
+       border: 1px solid #808080;\r
+}\r
+\r
+.input_noborder {\r
+       border: 0;\r
+}\r
+\r
+#insert, .updateButton {\r
+   font-weight: bold;\r
+   width: 90px;\r
+   height: 21px;\r
+   border: 0;\r
+   background-image: url('../images/insert_button_bg.gif');\r
+   cursor: pointer;\r
+}\r
+\r
+#cancel {\r
+   font-weight: bold;\r
+   width: 90px;\r
+   height: 21px;\r
+   border: 0;\r
+   background-image: url('../images/cancel_button_bg.gif');\r
+   cursor: pointer;\r
+}\r
+\r
+/* Mozilla only style */\r
+html>body #insert, html>body #cancel {\r
+       padding-bottom: 2px;\r
+}\r
+\r
+.title {\r
+       font-size: 12px;\r
+       font-weight: bold;\r
+       color: #2B6FB6;\r
+}\r
+\r
+table.charmap {\r
+       border-style: solid;\r
+       border-width: 1px;\r
+       border-color: #AAAAAA;\r
+}\r
+\r
+td.charmap, td.charmapOver {\r
+       color: #000000;\r
+       border-color: #AAAAAA;\r
+       border-style: solid;\r
+       border-width: 1px;\r
+       text-align: center;\r
+       font-size: 12px;\r
+}\r
+\r
+td.charmapOver {\r
+       background-color: #CCCCCC;\r
+       cursor: default;\r
+}\r
+\r
+a.charmap {\r
+       color: #000000;\r
+       text-decoration: none\r
+}\r
+\r
+.wordWrapCode {\r
+       vertical-align: middle;\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+}\r
+\r
+input.radio {\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+       vertical-align: middle;\r
+}\r
+\r
+input.checkbox {\r
+       border: 1px none #000000;\r
+       background-color: transparent;\r
+       vertical-align: middle;\r
+}\r
+\r
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {\r
+       margin-left: 1px;\r
+}\r
+\r
+.mceButtonNormal {\r
+       border-top: 1px solid;\r
+       border-left: 1px solid;\r
+       border-bottom: 1px solid;\r
+       border-right: 1px solid;\r
+       border-color: #F0F0EE;\r
+       cursor: default;\r
+}\r
+\r
+.mceButtonOver {\r
+       border: 1px solid #0A246A;\r
+       cursor: default;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+.mceButtonDown {\r
+       cursor: default;\r
+       border: 1px solid #0A246A;\r
+       background-color: #8592B5;\r
+}\r
+\r
+.mceButtonDisabled {\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
+       -moz-opacity:0.3;\r
+       opacity: 0.3;\r
+       border-top: 1px solid;\r
+       border-left: 1px solid;\r
+       border-bottom: 1px solid;\r
+       border-right: 1px solid;\r
+       border-color: #F0F0EE;\r
+       cursor: default;\r
+}\r
+\r
+.mceActionPanel {\r
+       margin-top: 5px;\r
+}\r
+\r
+/* Tabs classes */\r
+\r
+.tabs {\r
+       float: left;\r
+       width: 100%;\r
+       line-height: normal;\r
+       background-image: url("../images/xp/tabs_bg.gif");\r
+}\r
+\r
+.tabs ul {\r
+       margin: 0;\r
+       padding: 0 0 0;\r
+       list-style: none;\r
+}\r
+\r
+.tabs li {\r
+       float: left;\r
+       background: url("../images/xp/tab_bg.gif") no-repeat left top;\r
+       margin: 0;\r
+       margin-left: 0;\r
+       margin-right: 2px;\r
+       padding: 0 0 0 10px;\r
+       line-height: 18px;\r
+}\r
+\r
+.tabs li.current {\r
+       background: url("../images/xp/tab_sel_bg.gif") no-repeat left top;\r
+       margin-right: 2px;\r
+}\r
+\r
+.tabs span {\r
+       float: left;\r
+       display: block;\r
+       background: url("../images/xp/tab_end.gif") no-repeat right top;\r
+       padding: 0px 10px 0 0;\r
+}\r
+\r
+.tabs .current span {\r
+       background: url("../images/xp/tab_sel_end.gif") no-repeat right top;\r
+}\r
+\r
+.tabs a {\r
+       text-decoration: none;\r
+       font-family: Verdana, Arial;\r
+       font-size: 10px;\r
+}\r
+\r
+.tabs a:link, .tabs a:visited, .tabs a:hover {\r
+       color: black;\r
+}\r
+\r
+.tabs a:hover {\r
+}\r
+\r
+.tabs .current {\r
+}\r
+\r
+.tabs .current a, .tabs .current a:link, .tabs .current a:visited {\r
+}\r
+\r
+.panel_wrapper div.panel {\r
+       display: none;\r
+}\r
+\r
+.panel_wrapper div.current {\r
+       display: block;\r
+       width: 100%;\r
+       height: 300px;\r
+       overflow: visible; /* Should be auto but that breaks Safari */\r
+}\r
+\r
+.panel_wrapper {\r
+       border: 1px solid #919B9C;\r
+       border-top: 0px;\r
+       padding: 10px;\r
+       padding-top: 5px;\r
+       clear: both;\r
+       background-color: white;\r
+}\r
+\r
+fieldset {\r
+       border: 1px solid #919B9C;\r
+       font-family: Verdana, Arial;\r
+       font-size: 10px;\r
+       padding: 0;\r
+       margin: 0;\r
+       padding: 4px;\r
+}\r
+\r
+legend {\r
+       color: #2B6FB6;\r
+       font-weight: bold;\r
+}\r
+\r
+.properties {\r
+       width: 100%;\r
+}\r
+\r
+.properties .column1 {\r
+}\r
+\r
+.properties .column2 {\r
+       text-align: left;\r
+}\r
+\r
+a:link, a:visited {\r
+       color: black;\r
+}\r
+\r
+a:hover {\r
+       color: #2B6FB6;\r
+}\r
+\r
+#plugintable thead {\r
+       font-weight: bold;\r
+       background-color: #DDDDDD;\r
+}\r
+\r
+#plugintable, #about #plugintable td {\r
+       border: 1px solid #919B9C;\r
+}\r
+\r
+#plugintable {\r
+       width: 99%;\r
+       margin-top: 10px;\r
+}\r
+\r
+#pluginscontainer {\r
+       height: 290px;\r
+       overflow: auto;\r
+}\r
+\r
+/* MSIE Specific styles */\r
+\r
+* html .panel_wrapper {\r
+       width: 100%;\r
+}\r
+\r
+.column {\r
+       float: left;\r
+}\r
+\r
+h1, h2, h3, h4 {\r
+       color: #2B6FB6;\r
+       margin: 0;\r
+       padding: 0;\r
+       padding-top: 5px;\r
+}\r
+\r
+h3 {\r
+       font-size: 14px;\r
+}\r
+\r
+#link .panel_wrapper, #link div.current {\r
+       height: 125px;\r
+}\r
+\r
+#image .panel_wrapper, #image div.current {\r
+       height: 190px;\r
+}\r
+\r
+label.msg { display: none; }\r
+label.invalid { color: #EE0000; display: inline; }\r
+input.invalid { border: 1px solid #EE0000; }\r
+\r
+/* Disables the advanced tab in the table plugin. */\r
+/*\r
+#table #advanced_tab {\r
+       display: none;\r
+}\r
+*/\r
+\r
+/* Disables the border input field and label in the table plugin. */\r
+/*\r
+#table #border, #table #borderlabel {\r
+       display: none;\r
+}\r
+*/\r
diff --git a/media/tiny_mce/themes/advanced/css/editor_ui.css b/media/tiny_mce/themes/advanced/css/editor_ui.css
new file mode 100755 (executable)
index 0000000..851837d
--- /dev/null
@@ -0,0 +1,97 @@
+/* This file contains the CSS data for the editor UI of TinyMCE instances */\r
+\r
+.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover {border: 0; margin: 0; padding: 0; background: transparent;}\r
+.mceSeparatorLine {border: 0; padding: 0; margin-left: 4px; margin-right: 2px;}\r
+.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;}\r
+.mceLabel, .mceLabelDisabled {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt;}\r
+.mceLabel {color: #000000;}\r
+.mceLabelDisabled {cursor: text; color: #999999;}\r
+.mceEditor {background: #F0F0EE; border: 1px solid #cccccc; padding: 0; margin: 0;}\r
+.mceEditorArea { font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; background: #FFFFFF; padding: 0; margin: 0; }\r
+.mceToolbarTop, .mceToolbarBottom {background: #F0F0EE; line-height: 1px; font-size: 1px;}\r
+.mceToolbarTop {border-bottom: 1px solid #cccccc; padding-bottom: 1px;}\r
+.mceToolbarBottom {border-top: 1px solid #cccccc;}\r
+.mceToolbarContainer {display: block; position: relative; left: 0; top: 0; width: 100%;}\r
+.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar {height: 20px;}\r
+.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;}\r
+.mceStatusbarTop {border-bottom: 1px solid #cccccc;}\r
+.mceStatusbarBottom {border-top: 1px solid #cccccc;}\r
+.mceStatusbar {border-bottom: 1px solid #cccccc;}\r
+.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {text-decoration: none; font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; color: #000000;}\r
+.mcePathItem:hover {text-decoration: underline;}\r
+.mceStatusbarPathText {float: left;}\r
+.mceStatusbarResize {float: right; background-image: url('../images/statusbar_resize.gif'); background-repeat: no-repeat; width: 11px; height: 20px; cursor: se-resize;}\r
+.mceResizeBox {width: 10px; height: 10px; display: none; border: 1px dotted gray; margin: 0; padding: 0;}\r
+.mceEditorIframe {border: 0;}\r
+\r
+/* Button CSS rules */\r
+\r
+a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img {width: 20px; height: 20px; cursor: default; margin-top: 1px; margin-left: 1px;}\r
+a.mceButtonDisabled img {border: 0 !important;}\r
+a.mceButtonNormal img, a.mceButtonSelected img {border: 1px solid #F0F0EE !important;}\r
+a.mceButtonSelected img {border: 1px solid #6779AA !important; background-color: #D4D5D8;}\r
+a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {border: 1px solid #0A246A !important; cursor: default; background-color: #B6BDD2;}\r
+a.mceButtonDisabled img {-moz-opacity:0.3; opacity: 0.3; border: 1px solid #F0F0EE !important; cursor: default;}\r
+a.mceTiledButton img {background-image: url('../images/buttons.gif'); background-repeat: no-repeat;}\r
+\r
+/* Menu button CSS rules */\r
+\r
+span.mceMenuButton img, span.mceMenuButtonSelected img {border: 1px solid #F0F0EE; margin-left: 1px;}\r
+span.mceMenuButtonSelected img {border: 1px solid #6779AA; background-color: #B6BDD2;}\r
+span.mceMenuButtonSelected img.mceMenuButton {border: 1px solid #F0F0EE; background-color: transparent;}\r
+span.mceMenuButton img.mceMenuButton, span.mceMenuButtonSelected img.mceMenuButton {border-left: 0; margin-left: 0;}\r
+span.mceMenuButton:hover img, span.mceMenuButtonSelected:hover img {border: 1px solid #0A246A; background-color: #B6BDD2;}\r
+span.mceMenuButton:hover img.mceMenuButton, span.mceMenuButtonSelected:hover img.mceMenuButton {border-left: 0;}\r
+span.mceMenuButtonFocus img {border: 1px solid gray; border-right: 0; margin-left: 1px; background-color: #F5F4F2;}\r
+span.mceMenuButtonFocus img.mceMenuButton {border: 1px solid gray; border-left: 1px solid #F5F4F2; margin-left: 0;}\r
+span.mceMenuHover img {border: 1px solid #0A246A; background-color: #B6BDD2;}\r
+span.mceMenuButtonSelected.mceMenuHover img.mceMenuButton {border: 1px solid #0A246A; background-color: #B6BDD2; border-left: 0;}\r
+\r
+/* Menu */\r
+\r
+.mceMenu {position: absolute; left: 0; top: 0; display: none; z-index: 1000; background-color: white; border: 1px solid gray; font-weight: normal;}\r
+.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;}\r
+.mceMenu a:hover {background-color: #B6BDD2; color: black; text-decoration: none !important;}\r
+.mceMenu span {padding-left: 10px; padding-right: 10px; display: block; line-height: 20px;}\r
+.mceMenuSeparator {border-bottom: 1px solid gray; background-color: gray; height: 1px;}\r
+.mceMenuTitle span {padding-left: 5px;}\r
+.mceMenuTitle {background-color: #DDDDDD; font-weight: bold;}\r
+.mceMenuDisabled {color: gray;}\r
+span.mceMenuSelectedItem {background-image: url('../images/menu_check.gif'); background-repeat: no-repeat; background-position: 5px 8px; padding-left: 20px;}\r
+span.mceMenuCheckItem {padding-left: 20px;}\r
+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;}\r
+.mceColors table, .mceColors td {margin: 0; padding: 2px;}\r
+a.mceMoreColors {width: auto; padding: 0; margin: 0 3px 3px 3px; text-align: center; border: 1px solid white; text-decoration: none !important;}\r
+.mceColorPreview {position: absolute; overflow:hidden; left: 0; top: 0; margin-left: 3px; margin-top: 15px; width: 16px; height: 4px; background-color: red;}\r
+a.mceMoreColors:hover {border: 1px solid #0A246A;}\r
+.mceColors td a {width: 9px; height: 9px; overflow: hidden; border: 1px solid #808080;}\r
+\r
+/* MSIE 6 specific rules */\r
+\r
+* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;}\r
+* html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;}\r
+* html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;}\r
+* html a.mceButtonNormal, * html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;}\r
+* html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;}\r
+* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;}\r
+* html .mceSelectList {margin-top: 2px;}\r
+* html span.mceMenuButton, * html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;}\r
+* html span.mceMenuButton img, * html span.mceMenuButtonSelected img, * html span.mceMenuButtonFocus img {position: relative; top: 1px;}\r
+* html a.mceMoreColors {width: auto;}\r
+* html .mceColors td a {width: 10px; height: 10px;}\r
+* html .mceColorPreview {margin-left: 2px; margin-top: 14px;}\r
+\r
+/* MSIE 7 specific rules */\r
+\r
+*: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;}\r
+*:first-child+html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;}\r
+*:first-child+html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;}\r
+*:first-child+html a.mceButtonNormal, *:first-child+html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;}\r
+*:first-child+html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;}\r
+*:first-child+html a.mceButtonNormal:hover, *:first-child+html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;}\r
+*:first-child+html .mceSelectList {margin-top: 2px;}\r
+*:first-child+html span.mceMenuButton, *:first-child+html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;}\r
+*:first-child+html span.mceMenuButton img, *:first-child+html span.mceMenuButtonSelected img, *:first-child+html span.mceMenuButtonFocus img {position: relative; top: 1px;}\r
+*:first-child+html a.mceMoreColors {width: 137px;}\r
+*:first-child+html .mceColors td a {width: 10px; height: 10px;}\r
+*:first-child+html .mceColorPreview {margin: 0; padding-left: 4px; margin-top: 14px; width: 14px;}\r
diff --git a/media/tiny_mce/themes/advanced/docs/en/about.htm b/media/tiny_mce/themes/advanced/docs/en/about.htm
new file mode 100755 (executable)
index 0000000..a6957a6
--- /dev/null
@@ -0,0 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>About TinyMCE</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">About TinyMCE</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla \r
+that enables you to edit HTML contents in a more user friendly way. It has common \r
+features that are found in most word processors and should not be difficult to \r
+use.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/media/tiny_mce/themes/advanced/docs/en/common_buttons.htm b/media/tiny_mce/themes/advanced/docs/en/common_buttons.htm
new file mode 100755 (executable)
index 0000000..518b285
--- /dev/null
@@ -0,0 +1,162 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Common buttons</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Common buttons</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Below is a short description about each button.\r
+<br>\r
+<br>\r
+<table border="1" cellpadding="3" cellspacing="0">\r
+  <tr>\r
+    <td><img src="../../images/bold.gif" width="20" height="20" alt="Bold text icon" /></td>\r
+    <td>Bold text style (Ctrl+B).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/italic.gif" width="20" height="20" alt="Italic text icon" /></td>\r
+    <td>Italic text style (Ctrl+I).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/underline.gif" width="20" height="20" alt="Underline text icon." /></td>\r
+    <td>Underline text style (Ctrl+U).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/strikethrough.gif" width="20" height="20" alt="Strikethrough text icon." /></td>\r
+    <td>Strikethrough text style.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyleft.gif" width="20" height="20" alt="Align left icon." /></td>\r
+    <td>Align left.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifycenter.gif" width="20" height="20" alt="Align center icon." /></td>\r
+    <td>Align center.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyright.gif" width="20" height="20" alt="Align right icon." /></td>\r
+    <td>Align right.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/justifyfull.gif" width="20" height="20" alt="Align full icon." /></td>\r
+    <td>Align full.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/bullist.gif" width="20" height="20" alt="Unordered list/bullet list icon." /></td>\r
+    <td>Unordered list/bullet list.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/numlist.gif" width="20" height="20" alt="Ordered list/numbered list icon." /></td>\r
+    <td>Ordered list/numbered list</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/outdent.gif" width="20" height="20" alt="Outdent/decrease indentation icon." /></td>\r
+    <td>Outdent/decrease indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/indent.gif" width="20" height="20" alt="Indent/increase indentation icon." /></td>\r
+    <td>Indent/increase indentation.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/undo.gif" width="20" height="20" alt="Undo the last operation." /></td>\r
+    <td>Undo the last operation (Ctrl+Z).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/redo.gif" width="20" height="20" alt="Redo the last operation icon." /></td>\r
+    <td>Redo the last operation (Ctrl+Y).</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/link.gif" width="20" height="20" alt="Insert a new link icon." /></td>\r
+    <td>Insert a new link, read more about this function in the <a href="insert_link_button.htm">Insert \r
+      link section</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/unlink.gif" width="20" height="20" alt="Unlinks the current selection icon." /></td>\r
+    <td>Unlinks the current selection/removes all selected links.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/anchor.gif" width="20" height="20" alt="Insert a new anchor icon." /></td>\r
+    <td>Insert a new anchor, read more about this function in the <a href="insert_anchor_button.htm">Insert anchor section.</a></td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/image.gif" width="20" height="20" alt="Insert a new image icon." /></td>\r
+    <td>Insert a new image, read more about this function in the <a href="insert_image_button.htm">Insert \r
+      image section</a>.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/cleanup.gif" width="20" height="20" alt="Cleanup code icon." /></td>\r
+    <td>Cleanup code/Removes unwanted formating. This function is useful when \r
+      you copy contents from for example a office product.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/help.gif" width="20" height="20" alt="Show help icon." /></td>\r
+    <td>Shows this help window.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/code.gif" width="20" height="20" alt="Source code editor icon." /></td>\r
+    <td>Opens HTML source code editor. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table.gif" width="20" height="20" alt="Insert table icon." /></td>\r
+    <td>Inserts a new table at the current location. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_insert_row_before.gif" width="20" height="20" alt="Adds a row above icon." /></td>\r
+    <td>Adds a row above the current one. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_insert_row_after.gif" width="20" height="20" alt="Adds a row under icon." /></td>\r
+    <td>Adds a row under the current one. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_delete_row.gif" width="20" height="20" alt="Remove row icon." /></td>\r
+    <td>Removes the row. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_insert_col_before.gif" width="20" height="20" alt="Add column before icon." /></td>\r
+    <td>Adds a column before the current one.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_insert_col_after.gif" width="20" height="20" alt="Add column after icon." /></td>\r
+    <td>Adds a column after the current one.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../../../plugins/table/images/table_delete_col.gif" width="20" height="20" alt="Remove column icon." /></td>\r
+    <td>Removes the current column.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/hr.gif" width="20" height="20" alt="Insert horizontal ruler icon." /></td>\r
+    <td>Inserts a new horizontal ruler </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/removeformat.gif" width="20" height="20" alt="Remove formatting icon." /></td>\r
+    <td>Removes formatting from the selection. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sub.gif" width="20" height="20" alt="Subscript icon." /></td>\r
+    <td>Makes the selection to be subscript. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><img src="../../images/sup.gif" width="20" height="20" alt="Superscript icon." /></td>\r
+    <td>Makes the selection to be superscripted. </td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade="noshade" />\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+</BODY>\r
+</HTML>\r
diff --git a/media/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm b/media/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm
new file mode 100755 (executable)
index 0000000..f4070a3
--- /dev/null
@@ -0,0 +1,45 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert table button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Create accessible content</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<p>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. </p>\r
+\r
+<p><strong>Things you can do to make your content accessible:</strong></p>\r
+<ol>\r
+<li><strong>Include an Image Description:</strong> 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. <br /><br /></li>\r
+\r
+<li> <strong>Add Scope to data table header cells:</strong> 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. <br /><br /></li>\r
+\r
+<li><strong> Structure content with properly nested headings:</strong> 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.<br /><br /></li>\r
+\r
+<li><strong> Include alternate content:</strong> 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.<br /><br /></li>\r
+\r
+<li><strong> Check accessbility: </strong> When the AChecker plugin is installed with TinyMCE, click on the Check Accessibility button to generate a report of potential accessibility problems.<br /><br /></li>\r
+\r
+</ol>\r
+\r
+<p>See the <a href="http://checker.atrc.utoronto.ca" target="_new">AChecker Web Site</a> for further details about creating content that will be accessible to all users.<br />\r
+</p>\r
+\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/media/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif b/media/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif
new file mode 100755 (executable)
index 0000000..5b5f528
Binary files /dev/null and b/media/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif differ
diff --git a/media/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif b/media/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif
new file mode 100755 (executable)
index 0000000..cdc617e
Binary files /dev/null and b/media/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif differ
diff --git a/media/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif b/media/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif
new file mode 100755 (executable)
index 0000000..7bad758
Binary files /dev/null and b/media/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif differ
diff --git a/media/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif b/media/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif
new file mode 100755 (executable)
index 0000000..6a032c5
Binary files /dev/null and b/media/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif differ
diff --git a/media/tiny_mce/themes/advanced/docs/en/index.htm b/media/tiny_mce/themes/advanced/docs/en/index.htm
new file mode 100755 (executable)
index 0000000..9810a93
--- /dev/null
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Help Index</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+<BODY onload="window.focus();">\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Table of contents</span></td>\r
+    <td align="right">&nbsp;</td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+Click the links below to go to the different help sections. \r
+<ul class="toc_ul">\r
+  <li class="toc_li"><a href="about.htm">About TinyMCE</a></li>\r
+  <li class="toc_li"><a href="common_buttons.htm">Common buttons</a></li>\r
+  <li class="toc_li"><a href="insert_image_button.htm">Insert image button</a></li>\r
+  <li class="toc_li"><a href="insert_link_button.htm">Insert link button</a></li>\r
+  <li class="toc_li"><a href="insert_anchor_button.htm">Insert anchor button</a></li>\r
+  <li class="toc_li"><a href="insert_table_button.htm">Insert table button</a></li>\r
+ <li class="toc_li"><a href="create_accessible_content.htm">Create accessible content</a></li>\r
+</ul>\r
+<hr noshade>\r
+</BODY>\r
+</HTML>\r
diff --git a/media/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm b/media/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm
new file mode 100755 (executable)
index 0000000..332cbc6
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert anchor button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert anchor button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+This button opens a new window with the insert/edit anchor function.<br>\r
+<br>\r
+<img src="images/insert_anchor_window.gif" width="330" height="139" alt="Anchor dialog/window" /><br>\r
+<br>\r
+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. <br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/media/tiny_mce/themes/advanced/docs/en/insert_image_button.htm b/media/tiny_mce/themes/advanced/docs/en/insert_image_button.htm
new file mode 100755 (executable)
index 0000000..1529648
--- /dev/null
@@ -0,0 +1,65 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert image button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert image button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+The insert image button opens the window shown below.<br>\r
+<br>\r
+<img src="images/insert_image_window.gif" alt="Insert image dialog/window" /><br>\r
+<br>\r
+You simply enter a URL to the image you want to link to and enter a image description, \r
+this is then displayed as an alternative text descripton of the image on the page.<br>\r
+<br>\r
+<strong>Field descriptions:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Image URL </strong></td>\r
+    <td>URL/path to the image.</td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Image description </strong></td>\r
+    <td>Alternative description of image contents.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Dimentions</strong></td>\r
+    <td>Image width/height. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignment</strong></td>\r
+    <td>Image alignment, useful when wrapping text around images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Border</strong></td>\r
+    <td>Border thickness. </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>VSpace</strong></td>\r
+    <td>Vertical space, useful when wrapping text around images.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>HSpace</strong></td>\r
+    <td>Horizontal space, useful when wrapping text around images.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/media/tiny_mce/themes/advanced/docs/en/insert_link_button.htm b/media/tiny_mce/themes/advanced/docs/en/insert_link_button.htm
new file mode 100755 (executable)
index 0000000..4f64450
--- /dev/null
@@ -0,0 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert link button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert link button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+This button opens a new window with the insert/edit link function.<br>\r
+<br>\r
+<img src="images/insert_link_window.gif" width="330" height="159" alt="Insert link dialog/window" /><br>\r
+<br>\r
+There are two fields in this window the first one &quot;Link URL&quot; is the \r
+URL of the link. The target enables you to select how the link is to be opened.<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/media/tiny_mce/themes/advanced/docs/en/insert_table_button.htm b/media/tiny_mce/themes/advanced/docs/en/insert_table_button.htm
new file mode 100755 (executable)
index 0000000..f352a05
--- /dev/null
@@ -0,0 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<HEAD>\r
+<TITLE>Insert table button</TITLE>\r
+<link href="style.css" rel="stylesheet" type="text/css">\r
+</HEAD>\r
+\r
+<BODY>\r
+\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">\r
+  <tr> \r
+    <td><span class="title">Insert table button</span></td>\r
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>\r
+  </tr>\r
+</table>\r
+<hr noshade>\r
+<br>\r
+The insert table button opens the window shown below. This action enables you to create tables. <br>\r
+<br>\r
+<img src="images/insert_table_window.gif" width="340" height="229" alt="Image of table window" /><br>\r
+<br>\r
+<strong>Field descriptions:</strong><br>\r
+<table border="1" cellspacing="0">\r
+  <tr>\r
+    <td width="150"><strong>Columns</strong></td>\r
+    <td>Number of columns in the  table. </td>\r
+  </tr>\r
+  <tr>\r
+    <td width="150"><strong>Rows</strong></td>\r
+    <td>Number of rows in the new table.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellpadding</strong></td>\r
+    <td>Cellpadding of the table . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Cellspacing</strong></td>\r
+    <td>Cellspacing of the table .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Alignment</strong></td>\r
+    <td>Table alignment . </td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Border</strong></td>\r
+    <td>Border thinkness of table.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Width</strong></td>\r
+    <td>Width in pixels of table .</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Height</strong></td>\r
+    <td>Height in pixels of table.</td>\r
+  </tr>\r
+  <tr>\r
+    <td><strong>Class</strong></td>\r
+    <td>Style or CSS class of table.</td>\r
+  </tr>\r
+</table>\r
+<br>\r
+<br>\r
+<hr noshade>\r
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">\r
+  <tr> \r
+    <td>Go to: <a href="index.htm">Table of contents</a></td>\r
+    <td align="right"><a href="#">Top</a></td>\r
+  </tr>\r
+</table>\r
+<br>\r
+</BODY>\r
+</HTML>\r
diff --git a/media/tiny_mce/themes/advanced/docs/en/style.css b/media/tiny_mce/themes/advanced/docs/en/style.css
new file mode 100755 (executable)
index 0000000..ebc0538
--- /dev/null
@@ -0,0 +1,28 @@
+body { background-color: #FFFFFF; }\r
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }\r
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }\r
+.subtitle { font-size: 12px; font-weight: bold; }\r
+\r
+.toc_ul, .toc_li { margin-left: 8px; line-height: 16px; }\r
+.step_ol, .step_li { margin-left: 11px; line-height: 16px; }\r
+img { border: #000000 solid 1px; }\r
+\r
+a:visited { color: #666666; text-decoration: underline; }\r
+a:active { color: #666666; text-decoration: underline; }\r
+a:hover { color: #666666; text-decoration: underline; }\r
+a { color: #666666; text-decoration: underline; }\r
+\r
+.pageheader { border: #E0E0E0 solid 1px; }\r
+.pagefooter { border: #E0E0E0 solid 1px; }\r
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.samplecontent { font-size: 10px; }\r
+\r
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }\r
+.codecontent { font-size: 10px; }\r
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }\r
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }\r
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }\r
+\r
+hr { height: 1px; }\r
+\r
diff --git a/media/tiny_mce/themes/advanced/editor_template.js b/media/tiny_mce/themes/advanced/editor_template.js
new file mode 100755 (executable)
index 0000000..6e781d7
--- /dev/null
@@ -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],['forecolorpicker','forecolor.gif','lang_theme_forecolor_desc','forecolorpicker',true],['backcolor','backcolor.gif','lang_theme_backcolor_desc','HiliteColor',true],['backcolorpicker','backcolor.gif','lang_theme_backcolor_desc','backcolorpicker',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;i<TinyMCE_AdvancedTheme._buttons.length;i++){but=TinyMCE_AdvancedTheme._buttons[i];if(but[0]==button_name&&(button_name=="forecolor"||button_name=="backcolor"))return tinyMCE.getMenuButtonHTML(but[0],but[2],'{$themeurl}/images/'+but[1],but[3]+"Menu",but[3],(but.length>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))}switch(button_name){case"formatselect":var html='<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';var formats=tinyMCE.getParam("theme_advanced_blockformats","p,address,pre,h1,h2,h3,h4,h5,h6",true).split(',');var lookup=[['p','{$lang_theme_paragraph}'],['address','{$lang_theme_address}'],['pre','{$lang_theme_pre}'],['h1','{$lang_theme_h1}'],['h2','{$lang_theme_h2}'],['h3','{$lang_theme_h3}'],['h4','{$lang_theme_h4}'],['h5','{$lang_theme_h5}'],['h6','{$lang_theme_h6}'],['div','{$lang_theme_div}'],['blockquote','{$lang_theme_blockquote}'],['code','{$lang_theme_code}'],['dt','{$lang_theme_dt}'],['dd','{$lang_theme_dd}'],['samp','{$lang_theme_samp}']];html+='<option value="">{$lang_theme_block}</option>';for(var i=0;i<formats.length;i++){for(var x=0;x<lookup.length;x++){if(formats[i]==lookup[x][0])html+='<option value="&lt;'+lookup[x][0]+'&gt;">'+lookup[x][1]+'</option>'}}html+='</select>';return html;case"styleselect":return'<select id="{$editor_id}_styleSelect" onmousedown="tinyMCE.themes.advanced._setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event,this,window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';case"fontselect":var fontHTML='<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';var iFonts='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 nFonts='Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sand;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';var fonts=tinyMCE.getParam("theme_advanced_fonts",nFonts).split(';');for(i=0;i<fonts.length;i++){if(fonts[i]!=''){var parts=fonts[i].split('=');fontHTML+='<option value="'+parts[1]+'">'+parts[0]+'</option>'}}fontHTML+='</select>';return fontHTML;case"fontsizeselect":return'<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+'<option value="0">{$lang_theme_font_size}</option>'+'<option value="1">1 (8 pt)</option>'+'<option value="2">2 (10 pt)</option>'+'<option value="3">3 (12 pt)</option>'+'<option value="4">4 (14 pt)</option>'+'<option value="5">5 (18 pt)</option>'+'<option value="6">6 (24 pt)</option>'+'<option value="7">7 (36 pt)</option>'+'</select>';case"|":case"separator":return'<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" alt="" />';case"spacer":return'<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" alt="" />';case"rowseparator":return'<br />'}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"forecolorpicker":this._pickColor(editor_id,'forecolor');return true;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"backcolorpicker":this._pickColor(editor_id,'HiliteColor');return true;case"mceColorPicker":if(user_interface){var template=[];if(!value['callback']&&!value['color'])value['color']=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=380;template['height']=250;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:value['color']})}else{var savedVal=tinyMCE.lastColorPickerValue,elm;if(savedVal['callback']){savedVal['callback'](value);return true}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<in_array.length;i++){skip=false;for(var j=0;j<remove_array.length;j++){if(in_array[i]==remove_array[j]){skip=true}}if(!skip){outArray[outArray.length]=in_array[i]}}return outArray}function addToArray(in_array,add_array){for(var i=0;i<add_array.length;i++){in_array[in_array.length]=add_array[i]}return in_array}var template=new Array();var deltaHeight=0;var resizing=tinyMCE.getParam("theme_advanced_resizing",false);var path=tinyMCE.getParam("theme_advanced_path",true);var statusbarHTML='<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: '+(path?"block":"none")+'">&#160;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: '+(resizing?"block":"none")+'" onmousedown="tinyMCE.themes.advanced._setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';var layoutManager=tinyMCE.getParam("theme_advanced_layout_manager","SimpleLayout");var styleSelectHTML='<option value="">{$lang_theme_style_select}</option>';if(settings['theme_advanced_styles']){var stylesAr=settings['theme_advanced_styles'].split(';');for(var i=0;i<stylesAr.length;i++){var key,value;key=stylesAr[i].split('=')[0];value=stylesAr[i].split('=')[1];styleSelectHTML+='<option value="'+value+'">'+key+'</option>'}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+='<a href="#" accesskey="q" title="'+tinyMCE.getLang("lang_toolbar_focus")+'"';if(!tinyMCE.getParam("accessibility_focus"))toolbarHTML+=' onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"';toolbarHTML+='></a>';for(var i=1;i<100;i++){var def=defVals["theme_advanced_buttons"+i];var buttons=tinyMCE.getParam("theme_advanced_buttons"+i,def==null?'':def,true,',');if(buttons.length==0)break;buttons=removeFromArray(buttons,tinyMCE.getParam("theme_advanced_disable","",true,','));buttons=addToArray(buttons,tinyMCE.getParam("theme_advanced_buttons"+i+"_add","",true,','));buttons=addToArray(tinyMCE.getParam("theme_advanced_buttons"+i+"_add_before","",true,','),buttons);for(var b=0;b<buttons.length;b++)toolbarHTML+=tinyMCE.getControlHTML(buttons[b]);if(buttons.length>0){toolbarHTML+="<br />";deltaHeight-=23}}toolbarHTML+='<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\''+editorId+'\').getWin().focus();"></a>';template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width_style};height:{$height_style}"><tbody>';if(toolbarLocation=="top")template['html']+='<tr><td dir="ltr" class="mceToolbarTop" align="'+toolbarAlign+'" height="1" nowrap="nowrap"><span id="'+editorId+'_toolbar" class="mceToolbarContainer">'+toolbarHTML+'</span></td></tr>';if(statusbarLocation=="top"){template['html']+='<tr><td class="mceStatusbarTop" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23}template['html']+='<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';if(toolbarLocation=="bottom")template['html']+='<tr><td dir="ltr" class="mceToolbarBottom" align="'+toolbarAlign+'" height="1"><span id="'+editorId+'_toolbar" class="mceToolbarContainer">'+toolbarHTML+'</span></td></tr>';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='<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';bod.appendChild(elm);deltaHeight=0;tinyMCE.getInstanceById(editorId).toolbarElement=elm;}else{tinyMCE.getInstanceById(editorId).toolbarElement=null}if(statusbarLocation=="bottom"){template['html']+='<tr><td class="mceStatusbarBottom" height="1">'+statusbarHTML+'</td></tr>';deltaHeight-=23}template['html']+='</tbody></table>';break;case"RowLayout":template['html']='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';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<containers.length;i++){if(containers[i]=="mceEditor")template['html']+='<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';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']+='<tr><td class="'+pathClass+'" height="1">'+statusbarHTML+'</td></tr>';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;j<curContainer.length;j++)curContainerHTML+=tinyMCE.getControlHTML(curContainer[j]);if(curContainer.length>0){curContainerHTML+="<br />";deltaHeight-=23}template['html']+='<tr><td class="'+curCSS+'" align="'+curAlign+'" height="1">'+curContainerHTML+'</td></tr>'}}template['html']+='</tbody></table>';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']+='<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);if(!template['delta_width'])template['delta_width']=0;if(!template['delta_height'])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')},removeInstance:function(inst){new TinyMCE_Layer(inst.editorId+'_fcMenu').remove();new TinyMCE_Layer(inst.editorId+'_bcMenu').remove()},hideInstance:function(inst){TinyMCE_AdvancedTheme._hideMenus(inst.editorId)},_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<select_elm.options.length;i++){var ov=""+select_elm.options[i].value;if(first_index&&ov.toLowerCase().indexOf(value.toLowerCase())==0){select_elm.selectedIndex=i;return true}if(ov==value){select_elm.selectedIndex=i;return true}}}return false};if(node==null)return;var pathElm=document.getElementById(editor_id+"_path");var inst=tinyMCE.getInstanceById(editor_id);var doc=inst.getDoc();TinyMCE_AdvancedTheme._hideMenus(editor_id);if(pathElm){var parentNode=node;var path=new Array();while(parentNode!=null){if(parentNode.nodeName.toUpperCase()=="BODY"){break}if(parentNode.nodeType==1&&tinyMCE.getAttrib(parentNode,"class").indexOf('mceItemHidden')==-1){path[path.length]=parentNode}parentNode=parentNode.parentNode}var html="";for(var i=path.length-1;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: "+tinyMCE.xmlEncode(st)+" "}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+tinyMCE.xmlEncode(face)+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+tinyMCE.xmlEncode(size)+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+tinyMCE.xmlEncode(color)+" "}if(tinyMCE.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(tinyMCE.getAttrib(path[i],'src')!=""){var src=tinyMCE.getAttrib(path[i],"mce_src");if(src=="")src=tinyMCE.getAttrib(path[i],"src");nodeData+="src: "+tinyMCE.xmlEncode(src)+" "}if(path[i].nodeName=='A'&&tinyMCE.getAttrib(path[i],'href')!=""){var href=tinyMCE.getAttrib(path[i],"mce_href");if(href=="")href=tinyMCE.getAttrib(path[i],"href");nodeData+="href: "+tinyMCE.xmlEncode(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+="#"+tinyMCE.xmlEncode(anchor);nodeData=""}if(tinyMCE.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+='<a title="'+nodeData+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" target="_self" class="mcePathItem">'+nodeName+'</a>';if(i>0){html+=" &raquo; "}}pathElm.innerHTML='<a href="#" accesskey="x"></a>'+tinyMCE.getLang('lang_theme_path')+": "+html+'&#160;'}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_index<undo_levels-1&&undo_levels>0))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<selectElm.options.length;i++){if(selectElm.options[i].value==classNode.className){index=i;breakOut=true;break}}}}while(!breakOut&&classNode!=null&&(classNode=classNode.parentNode)!=null);selectElm.selectedIndex=index}var selectElm=document.getElementById(editor_id+"_formatSelect");if(selectElm){var elm=tinyMCE.getParentElement(node,"p,div,h1,h2,h3,h4,h5,h6,pre,address");if(elm)selectByValue(selectElm,"<"+elm.nodeName.toLowerCase()+">");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;i<sizes.length;i++){if((''+sizes[i])==size){size=i;break}}}if(!selectByValue(selectElm,size))selectByValue(selectElm,"")}else selectByValue(selectElm,"0")}}alignNode=node;breakOut=false;do{if(!alignNode.getAttribute||!alignNode.getAttribute('align'))continue;switch(alignNode.getAttribute('align').toLowerCase()){case"left":tinyMCE.switchClass(editor_id+'_justifyleft','mceButtonSelected');breakOut=true;break;case"right":tinyMCE.switchClass(editor_id+'_justifyright','mceButtonSelected');breakOut=true;break;case"middle":case"center":tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonSelected');breakOut=true;break;case"justify":tinyMCE.switchClass(editor_id+'_justifyfull','mceButtonSelected');breakOut=true;break}}while(!breakOut&&(alignNode=alignNode.parentNode)!=null);var div=tinyMCE.getParentElement(node,"div");if(div&&div.style.textAlign=="center")tinyMCE.switchClass(editor_id+'_justifycenter','mceButtonSelected');if(!setup_content){var ar=new Array("Bold","_bold","Italic","_italic","Strikethrough","_strikethrough","superscript","_sup","subscript","_sub");for(var i=0;i<ar.length;i+=2){if(inst.queryCommandState(ar[i]))tinyMCE.switchClass(editor_id+ar[i+1],'mceButtonSelected')}if(inst.queryCommandState("Underline")&&(node.parentNode==null||node.parentNode.nodeName!="A"))tinyMCE.switchClass(editor_id+'_underline','mceButtonSelected')}do{switch(node.nodeName){case"UL":tinyMCE.switchClass(editor_id+'_bullist','mceButtonSelected');break;case"OL":tinyMCE.switchClass(editor_id+'_numlist','mceButtonSelected');break;case"HR":tinyMCE.switchClass(editor_id+'_hr','mceButtonSelected');break;case"IMG":if(tinyMCE.getAttrib(node,'name').indexOf('mce_')!=0&&tinyMCE.getAttrib(node,'class').indexOf('mceItem')==-1){tinyMCE.switchClass(editor_id+'_image','mceButtonSelected')}break}}while((node=node.parentNode)!=null)},_setupCSSClasses:function(editor_id){var i,selectElm;if(!TinyMCE_AdvancedTheme._autoImportCSSClasses)return;selectElm=document.getElementById(editor_id+'_styleSelect');if(selectElm&&selectElm.getAttribute('cssImported')!='true'){var csses=tinyMCE.getCSSClasses(editor_id);if(csses&&selectElm){for(i=0;i<csses.length;i++)selectElm.options[selectElm.options.length]=new Option(csses[i],csses[i])}if(csses!=null&&csses.length>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";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"}}inst.useCSS=false},_resizeEventHandler:function(e){var resizer=TinyMCE_AdvancedTheme._resizer;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);if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var expires=new Date();expires.setTime(expires.getTime()+3600000*24*30);TinyMCE_AdvancedTheme._setCookie("TinyMCE_"+editorId+"_width",""+(resizer.horizontal?resizer.width+dx:""),expires);TinyMCE_AdvancedTheme._setCookie("TinyMCE_"+editorId+"_height",""+(resizer.height+dy),expires)}break}},_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){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;editorArea.style.display="none";resizeBox.style.display="block";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='<span class="mceMenuLine"></span>';cl=tinyMCE.getParam(n,TinyMCE_AdvancedTheme._defColors).split(',');h+='<table class="mceColors"><tr>';for(i=0;i<cl.length;i++){c='tinyMCE.execInstanceCommand(\''+id+'\', \''+cm+'\', false, \'#'+cl[i]+'\');';h+='<td><a href="javascript:'+c+'" style="background-color: #'+cl[i]+'" onclick="'+c+';return false;"></a></td>';if((i+1)%8==0)h+='</tr><tr>'}h+='</tr></table>';if(tinyMCE.getParam("theme_advanced_more_colors",true))h+='<a href="javascript:void(0);" onclick="TinyMCE_AdvancedTheme._pickColor(\''+id+'\',\''+cm+'\');" class="mceMoreColors">'+tinyMCE.getLang('lang_more_colors')+'</a>';return h},_pickColor:function(id,cm){var inputColor,inst=tinyMCE.selectedInstance;if(cm=='forecolor'&&inst)inputColor=inst.foreColor;if((cm=='backcolor'||cm=='HiliteColor')&&inst)inputColor=inst.backColor;tinyMCE.execCommand('mceColorPicker',true,{color:inputColor,callback:function(c){tinyMCE.execInstanceCommand(id,cm,false,c)}})},_insertImage:function(src,alt,border,hspace,vspace,width,height,align,title,onmouseover,onmouseout){tinyMCE.execCommand("mceInsertContent",false,tinyMCE.createTagHTML('img',{src:tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'],src),mce_src:src,alt:alt,border:border,hspace:hspace,vspace:vspace,width:width,height:height,align:align,title:title,onmouseover:onmouseover,onmouseout:onmouseout}))},_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,'<a href="'+tinyMCE.uniqueURL+'">'+tinyMCE.selectedInstance.selection.getSelectedHTML()+'</a>')}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<elementArray.length;i++){var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, elementArray[i]);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(elementArray[i],'href',thref);tinyMCE.setAttrib(elementArray[i],'mce_href',mhref);tinyMCE.setAttrib(elementArray[i],'target',target);tinyMCE.setAttrib(elementArray[i],'title',title);tinyMCE.setAttrib(elementArray[i],'onclick',onclick);tinyMCE.setAttrib(elementArray[i],'class',style_class)}tinyMCE.linkElement=elementArray[0]}if(tinyMCE.linkElement){var mhref=href;href=eval(tinyMCE.settings['urlconverter_callback']+"(href, tinyMCE.linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(tinyMCE.linkElement,'href',href);tinyMCE.setAttrib(tinyMCE.linkElement,'mce_href',mhref);tinyMCE.setAttrib(tinyMCE.linkElement,'target',target);tinyMCE.setAttrib(tinyMCE.linkElement,'title',title);tinyMCE.setAttrib(tinyMCE.linkElement,'onclick',onclick);tinyMCE.setAttrib(tinyMCE.linkElement,'class',style_class)}tinyMCE.execCommand('mceEndUndoLevel')}};tinyMCE.addTheme("advanced",TinyMCE_AdvancedTheme);tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);
\ No newline at end of file
diff --git a/media/tiny_mce/themes/advanced/editor_template_src.js b/media/tiny_mce/themes/advanced/editor_template_src.js
new file mode 100755 (executable)
index 0000000..a0217d1
--- /dev/null
@@ -0,0 +1,1516 @@
+/**\r
+ * $Id: editor_template_src.js 256 2007-04-24 09:03:20Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/* Import theme specific language pack */\r
+tinyMCE.importThemeLanguagePack('advanced');\r
+\r
+var TinyMCE_AdvancedTheme = {\r
+       // Private theme fields\r
+       _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",\r
+       _autoImportCSSClasses : true,\r
+       _resizer : {},\r
+       _buttons : [\r
+               // Control id, button img, button title, command, user_interface, value\r
+               ['bold', '{$lang_bold_img}', 'lang_bold_desc', 'Bold'],\r
+               ['italic', '{$lang_italic_img}', 'lang_italic_desc', 'Italic'],\r
+               ['underline', '{$lang_underline_img}', 'lang_underline_desc', 'Underline'],\r
+               ['strikethrough', 'strikethrough.gif', 'lang_striketrough_desc', 'Strikethrough'],\r
+               ['justifyleft', 'justifyleft.gif', 'lang_justifyleft_desc', 'JustifyLeft'],\r
+               ['justifycenter', 'justifycenter.gif', 'lang_justifycenter_desc', 'JustifyCenter'],\r
+               ['justifyright', 'justifyright.gif', 'lang_justifyright_desc', 'JustifyRight'],\r
+               ['justifyfull', 'justifyfull.gif', 'lang_justifyfull_desc', 'JustifyFull'],\r
+               ['bullist', 'bullist.gif', 'lang_bullist_desc', 'InsertUnorderedList'],\r
+               ['numlist', 'numlist.gif', 'lang_numlist_desc', 'InsertOrderedList'],\r
+               ['outdent', 'outdent.gif', 'lang_outdent_desc', 'Outdent'],\r
+               ['indent', 'indent.gif', 'lang_indent_desc', 'Indent'],\r
+               ['cut', 'cut.gif', 'lang_cut_desc', 'Cut'],\r
+               ['copy', 'copy.gif', 'lang_copy_desc', 'Copy'],\r
+               ['paste', 'paste.gif', 'lang_paste_desc', 'Paste'],\r
+               ['undo', 'undo.gif', 'lang_undo_desc', 'Undo'],\r
+               ['redo', 'redo.gif', 'lang_redo_desc', 'Redo'],\r
+               ['link', 'link.gif', 'lang_link_desc', 'mceLink', true],\r
+               ['unlink', 'unlink.gif', 'lang_unlink_desc', 'unlink'],\r
+               ['image', 'image.gif', 'lang_image_desc', 'mceImage', true],\r
+               ['cleanup', 'cleanup.gif', 'lang_cleanup_desc', 'mceCleanup'],\r
+               ['help', 'help.gif', 'lang_help_desc', 'mceHelp'],\r
+               ['code', 'code.gif', 'lang_theme_code_desc', 'mceCodeEditor'],\r
+               ['hr', 'hr.gif', 'lang_theme_hr_desc', 'inserthorizontalrule'],\r
+               ['removeformat', 'removeformat.gif', 'lang_theme_removeformat_desc', 'removeformat'],\r
+               ['sub', 'sub.gif', 'lang_theme_sub_desc', 'subscript'],\r
+               ['sup', 'sup.gif', 'lang_theme_sup_desc', 'superscript'],\r
+               ['forecolor', 'forecolor.gif', 'lang_theme_forecolor_desc', 'forecolor', true],\r
+               ['forecolorpicker', 'forecolor.gif', 'lang_theme_forecolor_desc', 'forecolorpicker', true],\r
+               ['backcolor', 'backcolor.gif', 'lang_theme_backcolor_desc', 'HiliteColor', true],\r
+               ['backcolorpicker', 'backcolor.gif', 'lang_theme_backcolor_desc', 'backcolorpicker', true],\r
+               ['charmap', 'charmap.gif', 'lang_theme_charmap_desc', 'mceCharMap'],\r
+               ['visualaid', 'visualaid.gif', 'lang_theme_visualaid_desc', 'mceToggleVisualAid'],\r
+               ['anchor', 'anchor.gif', 'lang_theme_anchor_desc', 'mceInsertAnchor'],\r
+               ['newdocument', 'newdocument.gif', 'lang_newdocument_desc', 'mceNewDocument']\r
+       ],\r
+\r
+       _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',\r
+\r
+       /**\r
+        * Returns HTML code for the specificed control.\r
+        */\r
+       getControlHTML : function(button_name) {\r
+               var i, x, but;\r
+\r
+               // Lookup button in button list\r
+               for (i=0; i<TinyMCE_AdvancedTheme._buttons.length; i++) {\r
+                       but = TinyMCE_AdvancedTheme._buttons[i];\r
+\r
+                       if (but[0] == button_name && (button_name == "forecolor" || button_name == "backcolor"))\r
+                               return tinyMCE.getMenuButtonHTML(but[0], but[2], '{$themeurl}/images/' + but[1], but[3] + "Menu", but[3], (but.length > 4 ? but[4] : false), (but.length > 5 ? but[5] : null));\r
+\r
+                       if (but[0] == button_name)\r
+                               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));\r
+               }\r
+\r
+               // Custom controlls other than buttons\r
+               switch (button_name) {\r
+                       case "formatselect":\r
+                               var html = '<select id="{$editor_id}_formatSelect" name="{$editor_id}_formatSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FormatBlock\',false,this.options[this.selectedIndex].value);" class="mceSelectList">';\r
+                               var formats = tinyMCE.getParam("theme_advanced_blockformats", "p,address,pre,h1,h2,h3,h4,h5,h6", true).split(',');\r
+                               var lookup = [\r
+                                       ['p', '{$lang_theme_paragraph}'],\r
+                                       ['address', '{$lang_theme_address}'],\r
+                                       ['pre', '{$lang_theme_pre}'],\r
+                                       ['h1', '{$lang_theme_h1}'],\r
+                                       ['h2', '{$lang_theme_h2}'],\r
+                                       ['h3', '{$lang_theme_h3}'],\r
+                                       ['h4', '{$lang_theme_h4}'],\r
+                                       ['h5', '{$lang_theme_h5}'],\r
+                                       ['h6', '{$lang_theme_h6}'],\r
+                                       ['div', '{$lang_theme_div}'],\r
+                                       ['blockquote', '{$lang_theme_blockquote}'],\r
+                                       ['code', '{$lang_theme_code}'],\r
+                                       ['dt', '{$lang_theme_dt}'],\r
+                                       ['dd', '{$lang_theme_dd}'],\r
+                                       ['samp', '{$lang_theme_samp}']\r
+                               ];\r
+\r
+                               html += '<option value="">{$lang_theme_block}</option>';\r
+\r
+                               // Build format select\r
+                               for (var i=0; i<formats.length; i++) {\r
+                                       for (var x=0; x<lookup.length; x++) {\r
+                                               if (formats[i] == lookup[x][0])\r
+                                                       html += '<option value="&lt;' + lookup[x][0] + '&gt;">' + lookup[x][1] + '</option>';\r
+                                       }\r
+                               }\r
+\r
+                               html += '</select>';\r
+\r
+                               return html;\r
+\r
+                       case "styleselect":\r
+                               return '<select id="{$editor_id}_styleSelect" onmousedown="tinyMCE.themes.advanced._setupCSSClasses(\'{$editor_id}\');" name="{$editor_id}_styleSelect" onfocus="tinyMCE.addSelectAccessibility(event,this,window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSetCSSClass\',false,this.options[this.selectedIndex].value);" class="mceSelectList">{$style_select_options}</select>';\r
+\r
+                       case "fontselect":\r
+                               var fontHTML = '<select id="{$editor_id}_fontNameSelect" name="{$editor_id}_fontNameSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontName\',false,this.options[this.selectedIndex].value);" class="mceSelectList"><option value="">{$lang_theme_fontdefault}</option>';\r
+                               var iFonts = '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';\r
+                               var nFonts = 'Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sand;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats';\r
+                               var fonts = tinyMCE.getParam("theme_advanced_fonts", nFonts).split(';');\r
+                               for (i=0; i<fonts.length; i++) {\r
+                                       if (fonts[i] != '') {\r
+                                               var parts = fonts[i].split('=');\r
+                                               fontHTML += '<option value="' + parts[1] + '">' + parts[0] + '</option>';\r
+                                       }\r
+                               }\r
+\r
+                               fontHTML += '</select>';\r
+                               return fontHTML;\r
+\r
+                       case "fontsizeselect":\r
+                               return '<select id="{$editor_id}_fontSizeSelect" name="{$editor_id}_fontSizeSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'FontSize\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+\r
+                                               '<option value="0">{$lang_theme_font_size}</option>'+\r
+                                               '<option value="1">1 (8 pt)</option>'+\r
+                                               '<option value="2">2 (10 pt)</option>'+\r
+                                               '<option value="3">3 (12 pt)</option>'+\r
+                                               '<option value="4">4 (14 pt)</option>'+\r
+                                               '<option value="5">5 (18 pt)</option>'+\r
+                                               '<option value="6">6 (24 pt)</option>'+\r
+                                               '<option value="7">7 (36 pt)</option>'+\r
+                                               '</select>';\r
+\r
+                       case "|":\r
+                       case "separator":\r
+                               return '<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" alt="" />';\r
+\r
+                       case "spacer":\r
+                               return '<img src="{$themeurl}/images/separator.gif" width="2" height="15" border="0" class="mceSeparatorLine" style="vertical-align: middle" alt="" />';\r
+\r
+                       case "rowseparator":\r
+                               return '<br />';\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       /**\r
+        * Theme specific execcommand handling.\r
+        */\r
+       execCommand : function(editor_id, element, command, user_interface, value) {\r
+               switch (command) {\r
+                       case 'mceHelp':\r
+                               tinyMCE.openWindow({\r
+                                       file : 'about.htm',\r
+                                       width : 480,\r
+                                       height : 380\r
+                               }, {\r
+                                       tinymce_version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion,\r
+                                       tinymce_releasedate : tinyMCE.releaseDate,\r
+                                       inline : "yes"\r
+                               });\r
+                       return true;\r
+\r
+                       case "mceLink":\r
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+                               var doc = inst.getDoc();\r
+                               var selectedText = "";\r
+\r
+                               if (tinyMCE.isMSIE) {\r
+                                       var rng = doc.selection.createRange();\r
+                                       selectedText = rng.text;\r
+                               } else\r
+                                       selectedText = inst.getSel().toString();\r
+\r
+                               if (!tinyMCE.linkElement) {\r
+                                       if ((tinyMCE.selectedElement.nodeName.toLowerCase() != "img") && (selectedText.length <= 0))\r
+                                               return true;\r
+                               }\r
+\r
+                               var href = "", target = "", title = "", onclick = "", action = "insert", style_class = "";\r
+\r
+                               if (tinyMCE.selectedElement.nodeName.toLowerCase() == "a")\r
+                                       tinyMCE.linkElement = tinyMCE.selectedElement;\r
+\r
+                               // Is anchor not a link\r
+                               if (tinyMCE.linkElement != null && tinyMCE.getAttrib(tinyMCE.linkElement, 'href') == "")\r
+                                       tinyMCE.linkElement = null;\r
+\r
+                               if (tinyMCE.linkElement) {\r
+                                       href = tinyMCE.getAttrib(tinyMCE.linkElement, 'href');\r
+                                       target = tinyMCE.getAttrib(tinyMCE.linkElement, 'target');\r
+                                       title = tinyMCE.getAttrib(tinyMCE.linkElement, 'title');\r
+                                       onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');\r
+                                       style_class = tinyMCE.getAttrib(tinyMCE.linkElement, 'class');\r
+\r
+                                       // Try old onclick to if copy/pasted content\r
+                                       if (onclick == "")\r
+                                               onclick = tinyMCE.getAttrib(tinyMCE.linkElement, 'onclick');\r
+\r
+                                       onclick = tinyMCE.cleanupEventStr(onclick);\r
+\r
+                                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");\r
+\r
+                                       // Use mce_href if defined\r
+                                       mceRealHref = tinyMCE.getAttrib(tinyMCE.linkElement, 'mce_href');\r
+                                       if (mceRealHref != "") {\r
+                                               href = mceRealHref;\r
+\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement, true);");\r
+                                       }\r
+\r
+                                       action = "update";\r
+                               }\r
+\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'link.htm';\r
+                               template['width'] = 310;\r
+                               template['height'] = 200;\r
+\r
+                               // Language specific width and height addons\r
+                               template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0);\r
+\r
+                               if (inst.settings['insertlink_callback']) {\r
+                                       var returnVal = eval(inst.settings['insertlink_callback'] + "(href, target, title, onclick, action, style_class);");\r
+                                       if (returnVal && returnVal['href'])\r
+                                               TinyMCE_AdvancedTheme._insertLink(returnVal['href'], returnVal['target'], returnVal['title'], returnVal['onclick'], returnVal['style_class']);\r
+                               } else {\r
+                                       tinyMCE.openWindow(template, {href : href, target : target, title : title, onclick : onclick, action : action, className : style_class, inline : "yes"});\r
+                               }\r
+\r
+                               return true;\r
+\r
+                       case "mceImage":\r
+                               var src = "", alt = "", border = "", hspace = "", vspace = "", width = "", height = "", align = "";\r
+                               var title = "", onmouseover = "", onmouseout = "", action = "insert";\r
+                               var img = tinyMCE.imgElement;\r
+                               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+                               if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {\r
+                                       img = tinyMCE.selectedElement;\r
+                                       tinyMCE.imgElement = img;\r
+                               }\r
+\r
+                               if (img) {\r
+                                       // Is it a internal MCE visual aid image, then skip this one.\r
+                                       if (tinyMCE.getAttrib(img, 'name').indexOf('mce_') == 0)\r
+                                               return true;\r
+\r
+                                       src = tinyMCE.getAttrib(img, 'src');\r
+                                       alt = tinyMCE.getAttrib(img, 'alt');\r
+\r
+                                       // Try polling out the title\r
+                                       if (alt == "")\r
+                                               alt = tinyMCE.getAttrib(img, 'title');\r
+\r
+                                       // Fix width/height attributes if the styles is specified\r
+                                       if (tinyMCE.isGecko) {\r
+                                               var w = img.style.width;\r
+                                               if (w != null && w != "")\r
+                                                       img.setAttribute("width", w);\r
+\r
+                                               var h = img.style.height;\r
+                                               if (h != null && h != "")\r
+                                                       img.setAttribute("height", h);\r
+                                       }\r
+\r
+                                       border = tinyMCE.getAttrib(img, 'border');\r
+                                       hspace = tinyMCE.getAttrib(img, 'hspace');\r
+                                       vspace = tinyMCE.getAttrib(img, 'vspace');\r
+                                       width = tinyMCE.getAttrib(img, 'width');\r
+                                       height = tinyMCE.getAttrib(img, 'height');\r
+                                       align = tinyMCE.getAttrib(img, 'align');\r
+                                       onmouseover = tinyMCE.getAttrib(img, 'onmouseover');\r
+                                       onmouseout = tinyMCE.getAttrib(img, 'onmouseout');\r
+                                       title = tinyMCE.getAttrib(img, 'title');\r
+\r
+                                       // Is realy specified?\r
+                                       if (tinyMCE.isMSIE) {\r
+                                               width = img.attributes['width'].specified ? width : "";\r
+                                               height = img.attributes['height'].specified ? height : "";\r
+                                       }\r
+\r
+                                       //onmouseover = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseover));\r
+                                       //onmouseout = tinyMCE.getImageSrc(tinyMCE.cleanupEventStr(onmouseout));\r
+\r
+                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");\r
+\r
+                                       // Use mce_src if defined\r
+                                       mceRealSrc = tinyMCE.getAttrib(img, 'mce_src');\r
+                                       if (mceRealSrc != "") {\r
+                                               src = mceRealSrc;\r
+\r
+                                               if (tinyMCE.getParam('convert_urls'))\r
+                                                       src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, img, true);");\r
+                                       }\r
+\r
+                                       //if (onmouseover != "")\r
+                                       //      onmouseover = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, img, true);");\r
+\r
+                                       //if (onmouseout != "")\r
+                                       //      onmouseout = eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, img, true);");\r
+\r
+                                       action = "update";\r
+                               }\r
+\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'image.htm?src={$src}';\r
+                               template['width'] = 355;\r
+                               template['height'] = 265 + (tinyMCE.isMSIE ? 25 : 0);\r
+\r
+                               // Language specific width and height addons\r
+                               template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0);\r
+\r
+                               if (inst.settings['insertimage_callback']) {\r
+                                       var returnVal = eval(inst.settings['insertimage_callback'] + "(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout, action);");\r
+                                       if (returnVal && returnVal['src'])\r
+                                               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']);\r
+                               } else\r
+                                       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"});\r
+\r
+                               return true;\r
+\r
+                       case "forecolor":\r
+                               var fcp = new TinyMCE_Layer(editor_id + '_fcPreview', false), p, img, elm;\r
+\r
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+                               if (!fcp.exists()) {\r
+                                       fcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));\r
+                                       elm = fcp.getElement();\r
+                                       elm._editor_id = editor_id;\r
+                                       elm._command = "forecolor";\r
+                                       elm._switchId = editor_id + "_forecolor";\r
+                                       tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                                       tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                                       tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                               }\r
+\r
+                               img = tinyMCE.selectNodes(document.getElementById(editor_id + "_forecolor"), function(n) {return n.nodeName == "IMG";})[0];\r
+                               p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));\r
+\r
+                               fcp.moveTo(p.absLeft, p.absTop);\r
+                               fcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).foreColor;\r
+                               fcp.show();\r
+\r
+                               return false;\r
+\r
+                       case "forecolorpicker":\r
+                               this._pickColor(editor_id, 'forecolor');\r
+                               return true;\r
+\r
+                       case "forecolorMenu":\r
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+                               // Create color layer\r
+                               var ml = new TinyMCE_Layer(editor_id + '_fcMenu');\r
+\r
+                               if (!ml.exists())\r
+                                       ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_text_colors', 'forecolor'));\r
+\r
+                               tinyMCE.switchClass(editor_id + '_forecolor', 'mceMenuButtonFocus');\r
+                               ml.moveRelativeTo(document.getElementById(editor_id + "_forecolor"), 'bl');\r
+\r
+                               ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);\r
+\r
+                               if (tinyMCE.isOpera)\r
+                                       ml.moveBy(0, -2);\r
+\r
+                               ml.show();\r
+                       return true;\r
+\r
+                       case "HiliteColor":\r
+                               var bcp = new TinyMCE_Layer(editor_id + '_bcPreview', false), p, img;\r
+\r
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+                               if (!bcp.exists()) {\r
+                                       bcp.create('div', 'mceColorPreview', document.getElementById(editor_id + '_toolbar'));\r
+                                       elm = bcp.getElement();\r
+                                       elm._editor_id = editor_id;\r
+                                       elm._command = "HiliteColor";\r
+                                       elm._switchId = editor_id + "_backcolor";\r
+                                       tinyMCE.addEvent(elm, 'click', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                                       tinyMCE.addEvent(elm, 'mouseover', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                                       tinyMCE.addEvent(elm, 'mouseout', TinyMCE_AdvancedTheme._handleMenuEvent);\r
+                               }\r
+\r
+                               img = tinyMCE.selectNodes(document.getElementById(editor_id + "_backcolor"), function(n) {return n.nodeName == "IMG";})[0];\r
+                               p = tinyMCE.getAbsPosition(img, document.getElementById(editor_id + '_toolbar'));\r
+\r
+                               bcp.moveTo(p.absLeft, p.absTop);\r
+                               bcp.getElement().style.backgroundColor = value != null ? value : tinyMCE.getInstanceById(editor_id).backColor;\r
+                               bcp.show();\r
+\r
+                               return false;\r
+\r
+                       case "HiliteColorMenu":\r
+                               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+                               // Create color layer\r
+                               var ml = new TinyMCE_Layer(editor_id + '_bcMenu');\r
+\r
+                               if (!ml.exists())\r
+                                       ml.create('div', 'mceMenu', document.body, TinyMCE_AdvancedTheme._getColorHTML(editor_id, 'theme_advanced_background_colors', 'HiliteColor'));\r
+\r
+                               tinyMCE.switchClass(editor_id + '_backcolor', 'mceMenuButtonFocus');\r
+                               ml.moveRelativeTo(document.getElementById(editor_id + "_backcolor"), 'bl');\r
+\r
+                               ml.moveBy(tinyMCE.isMSIE && !tinyMCE.isOpera ? -1 : 1, -1);\r
+\r
+                               if (tinyMCE.isOpera)\r
+                                       ml.moveBy(0, -2);\r
+\r
+                               ml.show();\r
+                       return true;\r
+       \r
+                       case "backcolorpicker":\r
+                               this._pickColor(editor_id, 'HiliteColor');\r
+                               return true;\r
+\r
+                       case "mceColorPicker":\r
+                               if (user_interface) {\r
+                                       var template = [];\r
+       \r
+                                       if (!value['callback'] && !value['color'])\r
+                                               value['color'] = value['document'].getElementById(value['element_id']).value;\r
+\r
+                                       template['file'] = 'color_picker.htm';\r
+                                       template['width'] = 380;\r
+                                       template['height'] = 250;\r
+                                       template['close_previous'] = "no";\r
+\r
+                                       template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0);\r
+                                       template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0);\r
+\r
+                                       if (typeof(value['store_selection']) == "undefined")\r
+                                               value['store_selection'] = true;\r
+\r
+                                       tinyMCE.lastColorPickerValue = value;\r
+                                       tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : value['color']});\r
+                               } else {\r
+                                       var savedVal = tinyMCE.lastColorPickerValue, elm;\r
+\r
+                                       if (savedVal['callback']) {\r
+                                               savedVal['callback'](value);\r
+                                               return true;\r
+                                       }\r
+\r
+                                       elm = savedVal['document'].getElementById(savedVal['element_id']);\r
+                                       elm.value = value;\r
+\r
+                                       if (elm.onchange != null && elm.onchange != '')\r
+                                               eval('elm.onchange();');\r
+                               }\r
+                       return true;\r
+\r
+                       case "mceCodeEditor":\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'source_editor.htm';\r
+                               template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 720));\r
+                               template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 580));\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"});\r
+                               return true;\r
+\r
+                       case "mceCharMap":\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'charmap.htm';\r
+                               template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0);\r
+                               template['height'] = 250;\r
+\r
+                               template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0);\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+                               return true;\r
+\r
+                       case "mceInsertAnchor":\r
+                               var template = new Array();\r
+\r
+                               template['file'] = 'anchor.htm';\r
+                               template['width'] = 320;\r
+                               template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0);\r
+\r
+                               template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0);\r
+                               template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0);\r
+\r
+                               tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"});\r
+                               return true;\r
+\r
+                       case "mceNewDocument":\r
+                               if (confirm(tinyMCE.getLang('lang_newdocument')))\r
+                                       tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ' ');\r
+\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       /**\r
+        * Editor instance template function.\r
+        */\r
+       getEditorTemplate : function(settings, editorId) {\r
+               function removeFromArray(in_array, remove_array) {\r
+                       var outArray = new Array(), skip;\r
+                       \r
+                       for (var i=0; i<in_array.length; i++) {\r
+                               skip = false;\r
+\r
+                               for (var j=0; j<remove_array.length; j++) {\r
+                                       if (in_array[i] == remove_array[j]) {\r
+                                               skip = true;\r
+                                       }\r
+                               }\r
+\r
+                               if (!skip) {\r
+                                       outArray[outArray.length] = in_array[i];\r
+                               }\r
+                       }\r
+\r
+                       return outArray;\r
+               }\r
+\r
+               function addToArray(in_array, add_array) {\r
+                       for (var i=0; i<add_array.length; i++) {\r
+                               in_array[in_array.length] = add_array[i];\r
+                       }\r
+\r
+                       return in_array;\r
+               }\r
+\r
+               var template = new Array();\r
+               var deltaHeight = 0;\r
+               var resizing = tinyMCE.getParam("theme_advanced_resizing", false);\r
+               var path = tinyMCE.getParam("theme_advanced_path", true);\r
+               var statusbarHTML = '<div id="{$editor_id}_path" class="mceStatusbarPathText" style="display: ' + (path ? "block" : "none") + '">&#160;</div><div id="{$editor_id}_resize" class="mceStatusbarResize" style="display: ' + (resizing ? "block" : "none") + '" onmousedown="tinyMCE.themes.advanced._setResizing(event,\'{$editor_id}\',true);"></div><br style="clear: both" />';\r
+               var layoutManager = tinyMCE.getParam("theme_advanced_layout_manager", "SimpleLayout");\r
+\r
+               // Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY!\r
+               var styleSelectHTML = '<option value="">{$lang_theme_style_select}</option>';\r
+               if (settings['theme_advanced_styles']) {\r
+                       var stylesAr = settings['theme_advanced_styles'].split(';');\r
+                       \r
+                       for (var i=0; i<stylesAr.length; i++) {\r
+                               var key, value;\r
+\r
+                               key = stylesAr[i].split('=')[0];\r
+                               value = stylesAr[i].split('=')[1];\r
+\r
+                               styleSelectHTML += '<option value="' + value + '">' + key + '</option>';\r
+                       }\r
+\r
+                       TinyMCE_AdvancedTheme._autoImportCSSClasses = false;\r
+               }\r
+\r
+               switch(layoutManager) {\r
+                       case "SimpleLayout" : //the default TinyMCE Layout (for backwards compatibility)...\r
+                               var toolbarHTML = "";\r
+                               var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom");\r
+                               var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center");\r
+                               var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); // Compatiblity\r
+                               var statusbarLocation = tinyMCE.getParam("theme_advanced_statusbar_location", pathLocation);\r
+                               var defVals = {\r
+                                       theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",\r
+                                       theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",\r
+                                       theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap"\r
+                               };\r
+\r
+                               // Add accessibility control\r
+                               toolbarHTML += '<a href="#" accesskey="q" title="' + tinyMCE.getLang("lang_toolbar_focus") + '"';\r
+\r
+                               if (!tinyMCE.getParam("accessibility_focus"))\r
+                                       toolbarHTML += ' onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"';\r
+\r
+                               toolbarHTML += '></a>';\r
+\r
+                               // Render rows\r
+                               for (var i=1; i<100; i++) {\r
+                                       var def = defVals["theme_advanced_buttons" + i];\r
+\r
+                                       var buttons = tinyMCE.getParam("theme_advanced_buttons" + i, def == null ? '' : def, true, ',');\r
+                                       if (buttons.length == 0)\r
+                                               break;\r
+\r
+                                       buttons = removeFromArray(buttons, tinyMCE.getParam("theme_advanced_disable", "", true, ','));\r
+                                       buttons = addToArray(buttons, tinyMCE.getParam("theme_advanced_buttons" + i + "_add", "", true, ','));\r
+                                       buttons = addToArray(tinyMCE.getParam("theme_advanced_buttons" + i + "_add_before", "", true, ','), buttons);\r
+\r
+                                       for (var b=0; b<buttons.length; b++)\r
+                                               toolbarHTML += tinyMCE.getControlHTML(buttons[b]);\r
+\r
+                                       if (buttons.length > 0) {\r
+                                               toolbarHTML += "<br />";\r
+                                               deltaHeight -= 23;\r
+                                       }\r
+                               }\r
+\r
+                               // Add accessibility control\r
+                               toolbarHTML += '<a href="#" accesskey="z" onfocus="tinyMCE.getInstanceById(\'' + editorId + '\').getWin().focus();"></a>';\r
+\r
+                               // Setup template html\r
+                               template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width_style};height:{$height_style}"><tbody>';\r
+\r
+                               if (toolbarLocation == "top")\r
+                                       template['html'] += '<tr><td dir="ltr" class="mceToolbarTop" align="' + toolbarAlign + '" height="1" nowrap="nowrap"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';\r
+\r
+                               if (statusbarLocation == "top") {\r
+                                       template['html'] += '<tr><td class="mceStatusbarTop" height="1">' + statusbarHTML + '</td></tr>';\r
+                                       deltaHeight -= 23;\r
+                               }\r
+\r
+                               template['html'] += '<tr><td align="center"><span id="{$editor_id}"></span></td></tr>';\r
+\r
+                               if (toolbarLocation == "bottom")\r
+                                       template['html'] += '<tr><td dir="ltr" class="mceToolbarBottom" align="' + toolbarAlign + '" height="1"><span id="' + editorId + '_toolbar" class="mceToolbarContainer">' + toolbarHTML + '</span></td></tr>';\r
+\r
+                               // External toolbar changes\r
+                               if (toolbarLocation == "external") {\r
+                                       var bod = document.body;\r
+                                       var elm = document.createElement ("div");\r
+\r
+                                       toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML);\r
+                                       toolbarHTML = tinyMCE.applyTemplate(toolbarHTML, {editor_id : editorId});\r
+\r
+                                       elm.className = "mceToolbarExternal";\r
+                                       elm.id = editorId+"_toolbar";\r
+                                       elm.innerHTML = '<table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table>';\r
+                                       bod.appendChild (elm);\r
+                                       // bod.style.marginTop = elm.offsetHeight + "px";\r
+\r
+                                       deltaHeight = 0;\r
+                                       tinyMCE.getInstanceById(editorId).toolbarElement = elm;\r
+\r
+                                       //template['html'] = '<div id="mceExternalToolbar" align="center" class="mceToolbarExternal"><table width="100%" border="0" align="center"><tr><td align="center">'+toolbarHTML+'</td></tr></table></div>' + template["html"];\r
+                               } else {\r
+                                       tinyMCE.getInstanceById(editorId).toolbarElement = null;\r
+                               }\r
+\r
+                               if (statusbarLocation == "bottom") {\r
+                                       template['html'] += '<tr><td class="mceStatusbarBottom" height="1">' + statusbarHTML + '</td></tr>';\r
+                                       deltaHeight -= 23;\r
+                               }\r
+\r
+                               template['html'] += '</tbody></table>';\r
+                               //"SimpleLayout"\r
+                       break;\r
+\r
+                       case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom.\r
+                               template['html'] = '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}" style="width:{$width}px;height:{$height}px"><tbody>';\r
+\r
+                               var containers = tinyMCE.getParam("theme_advanced_containers", "", true, ",");\r
+                               var defaultContainerCSS = tinyMCE.getParam("theme_advanced_containers_default_class", "container");\r
+                               var defaultContainerAlign = tinyMCE.getParam("theme_advanced_containers_default_align", "center");\r
+\r
+                               //Render Containers:\r
+                               for (var i = 0; i < containers.length; i++)\r
+                               {\r
+                                       if (containers[i] == "mceEditor") //Exceptions for mceEditor and ...\r
+                                               template['html'] += '<tr><td align="center" class="mceEditor_border"><span id="{$editor_id}"></span></td></tr>';\r
+                                       else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath:\r
+                                       {\r
+                                               var pathClass = "mceStatusbar";\r
+\r
+                                               if (i == containers.length-1)\r
+                                               {\r
+                                                       pathClass = "mceStatusbarBottom";\r
+                                               }\r
+                                               else if (i == 0)\r
+                                               {\r
+                                                       pathClass = "mceStatusbar";\r
+                                               }\r
+                                               else\r
+                                               {\r
+                                                       deltaHeight-=2;\r
+                                               }\r
+\r
+                                               template['html'] += '<tr><td class="' + pathClass + '" height="1">' + statusbarHTML + '</td></tr>';\r
+                                               deltaHeight -= 22;\r
+                                       } else { // Render normal Container\r
+                                               var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ',');\r
+                                               var curContainerHTML = "";\r
+                                               var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign);\r
+                                               var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS);\r
+\r
+                                               curContainer = removeFromArray(curContainer, tinyMCE.getParam("theme_advanced_disable", "", true, ','));\r
+\r
+                                               for (var j=0; j<curContainer.length; j++)\r
+                                                       curContainerHTML += tinyMCE.getControlHTML(curContainer[j]);\r
+\r
+                                               if (curContainer.length > 0) {\r
+                                                       curContainerHTML += "<br />";\r
+                                                       deltaHeight -= 23;\r
+                                               }\r
+\r
+                                               template['html'] += '<tr><td class="' + curCSS + '" align="' + curAlign + '" height="1">' + curContainerHTML + '</td></tr>';\r
+                                       }\r
+                               }\r
+\r
+                               template['html'] += '</tbody></table>';\r
+                               //RowLayout\r
+                       break;\r
+\r
+                       case "CustomLayout" : //User defined layout callback...\r
+                               var customLayout = tinyMCE.getParam("theme_advanced_custom_layout","");\r
+\r
+                               if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined") {\r
+                                       template = eval(customLayout + "(template);");\r
+                               }\r
+                       break;\r
+               }\r
+\r
+               if (resizing)\r
+                       template['html'] += '<span id="{$editor_id}_resize_box" class="mceResizeBox"></span>';\r
+\r
+               template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML);\r
+\r
+               // Set to default values\r
+               if (!template['delta_width'])\r
+                       template['delta_width'] = 0;\r
+\r
+               if (!template['delta_height'])\r
+                       template['delta_height'] = deltaHeight;\r
+\r
+               return template;\r
+       },\r
+\r
+       initInstance : function(inst) {\r
+               if (tinyMCE.getParam("theme_advanced_resizing", false)) {\r
+                       if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {\r
+                               var w = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_width");\r
+                               var h = TinyMCE_AdvancedTheme._getCookie("TinyMCE_" + inst.editorId + "_height");\r
+\r
+                               TinyMCE_AdvancedTheme._resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true));\r
+                       }\r
+               }\r
+\r
+               inst.addShortcut('ctrl', 'k', 'lang_link_desc', 'mceLink');\r
+       },\r
+\r
+       removeInstance : function(inst) {\r
+               new TinyMCE_Layer(inst.editorId + '_fcMenu').remove();\r
+               new TinyMCE_Layer(inst.editorId + '_bcMenu').remove();\r
+       },\r
+\r
+       hideInstance : function(inst) {\r
+               TinyMCE_AdvancedTheme._hideMenus(inst.editorId);\r
+       },\r
+\r
+       _handleMenuEvent : function(e) {\r
+               var te = tinyMCE.isMSIE ? window.event.srcElement : e.target;\r
+               tinyMCE._menuButtonEvent(e.type == "mouseover" ? "over" : "out", document.getElementById(te._switchId));\r
+\r
+               if (e.type == "click")\r
+                       tinyMCE.execInstanceCommand(te._editor_id, te._command);\r
+       },\r
+\r
+       _hideMenus : function(id) {\r
+               var fcml = new TinyMCE_Layer(id + '_fcMenu'), bcml = new TinyMCE_Layer(id + '_bcMenu');\r
+\r
+               if (fcml.exists() && fcml.isVisible()) {\r
+                       tinyMCE.switchClass(id + '_forecolor', 'mceMenuButton');\r
+                       fcml.hide();\r
+               }\r
+\r
+               if (bcml.exists() && bcml.isVisible()) {\r
+                       tinyMCE.switchClass(id + '_backcolor', 'mceMenuButton');\r
+                       bcml.hide();\r
+               }\r
+       },\r
+\r
+       /**\r
+        * Node change handler.\r
+        */\r
+       handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) {\r
+               var alignNode, breakOut, classNode;\r
+\r
+               function selectByValue(select_elm, value, first_index) {\r
+                       first_index = typeof(first_index) == "undefined" ? false : true;\r
+\r
+                       if (select_elm) {\r
+                               for (var i=0; i<select_elm.options.length; i++) {\r
+                                       var ov = "" + select_elm.options[i].value;\r
+\r
+                                       if (first_index && ov.toLowerCase().indexOf(value.toLowerCase()) == 0) {\r
+                                               select_elm.selectedIndex = i;\r
+                                               return true;\r
+                                       }\r
+\r
+                                       if (ov == value) {\r
+                                               select_elm.selectedIndex = i;\r
+                                               return true;\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return false;\r
+               };\r
+\r
+               // No node provided\r
+               if (node == null)\r
+                       return;\r
+\r
+               // Update path\r
+               var pathElm = document.getElementById(editor_id + "_path");\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+               var doc = inst.getDoc();\r
+               TinyMCE_AdvancedTheme._hideMenus(editor_id);\r
+\r
+               if (pathElm) {\r
+                       // Get node path\r
+                       var parentNode = node;\r
+                       var path = new Array();\r
+                       \r
+                       while (parentNode != null) {\r
+                               if (parentNode.nodeName.toUpperCase() == "BODY") {\r
+                                       break;\r
+                               }\r
+\r
+                               // Only append element nodes to path\r
+                               if (parentNode.nodeType == 1 && tinyMCE.getAttrib(parentNode, "class").indexOf('mceItemHidden') == -1) {\r
+                                       path[path.length] = parentNode;\r
+                               }\r
+\r
+                               parentNode = parentNode.parentNode;\r
+                       }\r
+\r
+                       // Setup HTML\r
+                       var html = "";\r
+                       for (var i=path.length-1; i>=0; i--) {\r
+                               var nodeName = path[i].nodeName.toLowerCase();\r
+                               var nodeData = "";\r
+\r
+                               if (nodeName.indexOf("html:") == 0)\r
+                                       nodeName = nodeName.substring(5);\r
+\r
+                               if (nodeName == "b") {\r
+                                       nodeName = "strong";\r
+                               }\r
+\r
+                               if (nodeName == "i") {\r
+                                       nodeName = "em";\r
+                               }\r
+\r
+                               if (nodeName == "span") {\r
+                                       var cn = tinyMCE.getAttrib(path[i], "class");\r
+                                       if (cn != "" && cn.indexOf('mceItem') == -1)\r
+                                               nodeData += "class: " + cn + " ";\r
+\r
+                                       var st = tinyMCE.getAttrib(path[i], "style");\r
+                                       if (st != "") {\r
+                                               st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st));\r
+                                               nodeData += "style: " + tinyMCE.xmlEncode(st) + " ";\r
+                                       }\r
+                               }\r
+\r
+                               if (nodeName == "font") {\r
+                                       if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                                               nodeName = "span";\r
+\r
+                                       var face = tinyMCE.getAttrib(path[i], "face");\r
+                                       if (face != "")\r
+                                               nodeData += "font: " + tinyMCE.xmlEncode(face) + " ";\r
+\r
+                                       var size = tinyMCE.getAttrib(path[i], "size");\r
+                                       if (size != "")\r
+                                               nodeData += "size: " + tinyMCE.xmlEncode(size) + " ";\r
+\r
+                                       var color = tinyMCE.getAttrib(path[i], "color");\r
+                                       if (color != "")\r
+                                               nodeData += "color: " + tinyMCE.xmlEncode(color) + " ";\r
+                               }\r
+\r
+                               if (tinyMCE.getAttrib(path[i], 'id') != "") {\r
+                                       nodeData += "id: " + path[i].getAttribute('id') + " ";\r
+                               }\r
+\r
+                               var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);\r
+                               if (className != "" && className.indexOf('mceItem') == -1)\r
+                                       nodeData += "class: " + className + " ";\r
+\r
+                               if (tinyMCE.getAttrib(path[i], 'src') != "") {\r
+                                       var src = tinyMCE.getAttrib(path[i], "mce_src");\r
+\r
+                                       if (src == "")\r
+                                                src = tinyMCE.getAttrib(path[i], "src");\r
+\r
+                                       nodeData += "src: " + tinyMCE.xmlEncode(src) + " ";\r
+                               }\r
+\r
+                               if (path[i].nodeName == 'A' && tinyMCE.getAttrib(path[i], 'href') != "") {\r
+                                       var href = tinyMCE.getAttrib(path[i], "mce_href");\r
+\r
+                                       if (href == "")\r
+                                                href = tinyMCE.getAttrib(path[i], "href");\r
+\r
+                                       nodeData += "href: " + tinyMCE.xmlEncode(href) + " ";\r
+                               }\r
+\r
+                               className = tinyMCE.getAttrib(path[i], "class");\r
+                               if ((nodeName == "img" || nodeName == "span") && className.indexOf('mceItem') != -1) {\r
+                                       nodeName = className.replace(/mceItem([a-z]+)/gi, '$1').toLowerCase();\r
+                                       nodeData = path[i].getAttribute('title');\r
+                               }\r
+\r
+                               if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") {\r
+                                       nodeName = "a";\r
+                                       nodeName += "#" + tinyMCE.xmlEncode(anchor);\r
+                                       nodeData = "";\r
+                               }\r
+\r
+                               if (tinyMCE.getAttrib(path[i], 'name').indexOf("mce_") != 0) {\r
+                                       var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false);\r
+                                       if (className != "" && className.indexOf('mceItem') == -1) {\r
+                                               nodeName += "." + className;\r
+                                       }\r
+                               }\r
+\r
+                               var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');';\r
+                               html += '<a title="' + nodeData + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" target="_self" class="mcePathItem">' + nodeName + '</a>';\r
+\r
+                               if (i > 0) {\r
+                                       html += " &raquo; ";\r
+                               }\r
+                       }\r
+\r
+                       pathElm.innerHTML = '<a href="#" accesskey="x"></a>' + tinyMCE.getLang('lang_theme_path') + ": " + html + '&#160;';\r
+               }\r
+\r
+               // Reset old states\r
+               tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_bold', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_italic', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_underline', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_sub', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_sup', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_link', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_unlink', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonDisabled');\r
+               tinyMCE.switchClass(editor_id + '_image', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_hr', 'mceButtonNormal');\r
+\r
+               if (node.nodeName == "A" && tinyMCE.getAttrib(node, "class").indexOf('mceItemAnchor') != -1)\r
+                       tinyMCE.switchClass(editor_id + '_anchor', 'mceButtonSelected');\r
+\r
+               // Get link\r
+               var anchorLink = tinyMCE.getParentElement(node, "a", "href");\r
+\r
+               if (anchorLink || any_selection) {\r
+                       tinyMCE.switchClass(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');\r
+                       tinyMCE.switchClass(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal');\r
+               }\r
+\r
+               // Handle visual aid\r
+               tinyMCE.switchClass(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal');\r
+\r
+               if (undo_levels != -1) {\r
+                       tinyMCE.switchClass(editor_id + '_undo', 'mceButtonDisabled');\r
+                       tinyMCE.switchClass(editor_id + '_redo', 'mceButtonDisabled');\r
+               }\r
+\r
+               // Within li, blockquote\r
+               if (tinyMCE.getParentElement(node, "li,blockquote"))\r
+                       tinyMCE.switchClass(editor_id + '_outdent', 'mceButtonNormal');\r
+\r
+               // Has redo levels\r
+               if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0))\r
+                       tinyMCE.switchClass(editor_id + '_redo', 'mceButtonNormal');\r
+\r
+               // Has undo levels\r
+               if (undo_index != -1 && (undo_index > 0 && undo_levels > 0))\r
+                       tinyMCE.switchClass(editor_id + '_undo', 'mceButtonNormal');\r
+\r
+               // Select class in select box\r
+               var selectElm = document.getElementById(editor_id + "_styleSelect");\r
+               \r
+               if (selectElm) {\r
+                       TinyMCE_AdvancedTheme._setupCSSClasses(editor_id);\r
+\r
+                       classNode = node;\r
+                       breakOut = false;\r
+                       var index = 0;\r
+\r
+                       do {\r
+                               if (classNode && classNode.className) {\r
+                                       for (var i=0; i<selectElm.options.length; i++) {\r
+                                               if (selectElm.options[i].value == classNode.className) {\r
+                                                       index = i;\r
+                                                       breakOut = true;\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       } while (!breakOut && classNode != null && (classNode = classNode.parentNode) != null);\r
+\r
+                       selectElm.selectedIndex = index;\r
+               }\r
+\r
+               // Select formatblock\r
+               var selectElm = document.getElementById(editor_id + "_formatSelect");\r
+               if (selectElm) {\r
+                       var elm = tinyMCE.getParentElement(node, "p,div,h1,h2,h3,h4,h5,h6,pre,address");\r
+\r
+                       if (elm)\r
+                               selectByValue(selectElm, "<" + elm.nodeName.toLowerCase() + ">");\r
+                       else\r
+                               selectByValue(selectElm, "");\r
+               }\r
+\r
+               // Select fontselect\r
+               var selectElm = document.getElementById(editor_id + "_fontNameSelect");\r
+               if (selectElm) {\r
+                       if (!tinyMCE.isSafari && !(tinyMCE.isMSIE && !tinyMCE.isOpera)) {\r
+                               var face = inst.queryCommandValue('FontName');\r
+\r
+                               face = face == null || face == "" ? "" : face;\r
+\r
+                               selectByValue(selectElm, face, face != "");\r
+                       } else {\r
+                               var elm = tinyMCE.getParentElement(node, "font", "face");\r
+\r
+                               if (elm) {\r
+                                       var family = tinyMCE.getAttrib(elm, "face");\r
+\r
+                                       if (family == '')\r
+                                               family = '' + elm.style.fontFamily;\r
+\r
+                                       if (!selectByValue(selectElm, family, family != ""))\r
+                                               selectByValue(selectElm, "");\r
+                               } else\r
+                                       selectByValue(selectElm, "");\r
+                       }\r
+               }\r
+\r
+               // Select fontsize\r
+               var selectElm = document.getElementById(editor_id + "_fontSizeSelect");\r
+               if (selectElm) {\r
+                       if (!tinyMCE.isSafari && !tinyMCE.isOpera) {\r
+                               var size = inst.queryCommandValue('FontSize');\r
+                               selectByValue(selectElm, size == null || size == "" ? "0" : size);\r
+                       } else {\r
+                               var elm = tinyMCE.getParentElement(node, "font", "size");\r
+                               if (elm) {\r
+                                       var size = tinyMCE.getAttrib(elm, "size");\r
+\r
+                                       if (size == '') {\r
+                                               var sizes = new Array('', '8px', '10px', '12px', '14px', '18px', '24px', '36px');\r
+\r
+                                               size = '' + elm.style.fontSize;\r
+\r
+                                               for (var i=0; i<sizes.length; i++) {\r
+                                                       if (('' + sizes[i]) == size) {\r
+                                                               size = i;\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       if (!selectByValue(selectElm, size))\r
+                                               selectByValue(selectElm, "");\r
+                               } else\r
+                                       selectByValue(selectElm, "0");\r
+                       }\r
+               }\r
+\r
+               // Handle align attributes\r
+               alignNode = node;\r
+               breakOut = false;\r
+               do {\r
+                       if (!alignNode.getAttribute || !alignNode.getAttribute('align'))\r
+                               continue;\r
+\r
+                       switch (alignNode.getAttribute('align').toLowerCase()) {\r
+                               case "left":\r
+                                       tinyMCE.switchClass(editor_id + '_justifyleft', 'mceButtonSelected');\r
+                                       breakOut = true;\r
+                               break;\r
+\r
+                               case "right":\r
+                                       tinyMCE.switchClass(editor_id + '_justifyright', 'mceButtonSelected');\r
+                                       breakOut = true;\r
+                               break;\r
+\r
+                               case "middle":\r
+                               case "center":\r
+                                       tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');\r
+                                       breakOut = true;\r
+                               break;\r
+\r
+                               case "justify":\r
+                                       tinyMCE.switchClass(editor_id + '_justifyfull', 'mceButtonSelected');\r
+                                       breakOut = true;\r
+                               break;\r
+                       }\r
+               } while (!breakOut && (alignNode = alignNode.parentNode) != null);\r
+\r
+               // Div justification\r
+               var div = tinyMCE.getParentElement(node, "div");\r
+               if (div && div.style.textAlign == "center")\r
+                       tinyMCE.switchClass(editor_id + '_justifycenter', 'mceButtonSelected');\r
+\r
+               // Do special text\r
+               if (!setup_content) {\r
+                       // , "JustifyLeft", "_justifyleft", "JustifyCenter", "justifycenter", "JustifyRight", "justifyright", "JustifyFull", "justifyfull", "InsertUnorderedList", "bullist", "InsertOrderedList", "numlist", "InsertUnorderedList", "bullist", "Outdent", "outdent", "Indent", "indent", "subscript", "sub"\r
+                       var ar = new Array("Bold", "_bold", "Italic", "_italic", "Strikethrough", "_strikethrough", "superscript", "_sup", "subscript", "_sub");\r
+                       for (var i=0; i<ar.length; i+=2) {\r
+                               if (inst.queryCommandState(ar[i]))\r
+                                       tinyMCE.switchClass(editor_id + ar[i+1], 'mceButtonSelected');\r
+                       }\r
+\r
+                       if (inst.queryCommandState("Underline") && (node.parentNode == null || node.parentNode.nodeName != "A"))\r
+                               tinyMCE.switchClass(editor_id + '_underline', 'mceButtonSelected');\r
+               }\r
+\r
+               // Handle elements\r
+               do {\r
+                       switch (node.nodeName) {\r
+                               case "UL":\r
+                                       tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "OL":\r
+                                       tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "HR":\r
+                                        tinyMCE.switchClass(editor_id + '_hr', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "IMG":\r
+                               if (tinyMCE.getAttrib(node, 'name').indexOf('mce_') != 0 && tinyMCE.getAttrib(node, 'class').indexOf('mceItem') == -1) {\r
+                                       tinyMCE.switchClass(editor_id + '_image', 'mceButtonSelected');\r
+                               }\r
+                               break;\r
+                       }\r
+               } while ((node = node.parentNode) != null);\r
+       },\r
+\r
+       // Private theme internal functions\r
+\r
+       // This function auto imports CSS classes into the class selection droplist\r
+       _setupCSSClasses : function(editor_id) {\r
+               var i, selectElm;\r
+\r
+               if (!TinyMCE_AdvancedTheme._autoImportCSSClasses)\r
+                       return;\r
+\r
+               selectElm = document.getElementById(editor_id + '_styleSelect');\r
+\r
+               if (selectElm && selectElm.getAttribute('cssImported') != 'true') {\r
+                       var csses = tinyMCE.getCSSClasses(editor_id);\r
+                       if (csses && selectElm) {\r
+                               for (i=0; i<csses.length; i++)\r
+                                       selectElm.options[selectElm.options.length] = new Option(csses[i], csses[i]);\r
+                       }\r
+\r
+                       // Only do this once\r
+                       if (csses != null && csses.length > 0)\r
+                               selectElm.setAttribute('cssImported', 'true');\r
+               }\r
+       },\r
+\r
+       _setCookie : function(name, value, expires, path, domain, secure) {\r
+               var curCookie = name + "=" + escape(value) +\r
+                       ((expires) ? "; expires=" + expires.toGMTString() : "") +\r
+                       ((path) ? "; path=" + escape(path) : "") +\r
+                       ((domain) ? "; domain=" + domain : "") +\r
+                       ((secure) ? "; secure" : "");\r
+\r
+               document.cookie = curCookie;\r
+       },\r
+\r
+       _getCookie : function(name) {\r
+               var dc = document.cookie;\r
+               var prefix = name + "=";\r
+               var begin = dc.indexOf("; " + prefix);\r
+\r
+               if (begin == -1) {\r
+                       begin = dc.indexOf(prefix);\r
+\r
+                       if (begin != 0)\r
+                               return null;\r
+               } else\r
+                       begin += 2;\r
+\r
+               var end = document.cookie.indexOf(";", begin);\r
+\r
+               if (end == -1)\r
+                       end = dc.length;\r
+\r
+               return unescape(dc.substring(begin + prefix.length, end));\r
+       },\r
+\r
+       _resizeTo : function(inst, w, h, set_w) {\r
+               var editorContainer = document.getElementById(inst.editorId + '_parent');\r
+               var tableElm = editorContainer.firstChild;\r
+               var iframe = inst.iframeElement;\r
+\r
+               if (w == null || w == "null") {\r
+                       set_w = false;\r
+                       w = 0;\r
+               }\r
+\r
+               if (h == null || h == "null")\r
+                       return;\r
+\r
+               w = parseInt(w);\r
+               h = parseInt(h);\r
+\r
+               if (tinyMCE.isGecko) {\r
+                       w += 2;\r
+                       h += 2;\r
+               }\r
+\r
+               var dx = w - tableElm.clientWidth;\r
+               var dy = h - tableElm.clientHeight;\r
+\r
+               w = w < 1 ? 30 : w;\r
+               h = h < 1 ? 30 : h;\r
+\r
+               if (set_w)\r
+                       tableElm.style.width = w + "px";\r
+\r
+               tableElm.style.height = h + "px";\r
+\r
+               iw = iframe.clientWidth + dx;\r
+               ih = iframe.clientHeight + dy;\r
+\r
+               iw = iw < 1 ? 30 : iw;\r
+               ih = ih < 1 ? 30 : ih;\r
+\r
+               if (tinyMCE.isGecko) {\r
+                       iw -= 2;\r
+                       ih -= 2;\r
+               }\r
+\r
+               if (set_w)\r
+                       iframe.style.width = iw + "px";\r
+\r
+               iframe.style.height = ih + "px";\r
+\r
+               // Is it to small, make it bigger again\r
+               if (set_w) {\r
+                       var tableBodyElm = tableElm.firstChild;\r
+                       var minIframeWidth = tableBodyElm.scrollWidth;\r
+                       if (inst.iframeElement.clientWidth < minIframeWidth) {\r
+                               dx = minIframeWidth - inst.iframeElement.clientWidth;\r
+\r
+                               inst.iframeElement.style.width = (iw + dx) + "px";\r
+                       }\r
+               }\r
+\r
+               // Remove pesky table controls\r
+               inst.useCSS = false;\r
+       },\r
+\r
+       /**\r
+        * Handles resizing events.\r
+        */\r
+       _resizeEventHandler : function(e) {\r
+               var resizer = TinyMCE_AdvancedTheme._resizer;\r
+\r
+               // Do nothing\r
+               if (!resizer.resizing)\r
+                       return;\r
+\r
+               e = typeof(e) == "undefined" ? window.event : e;\r
+\r
+               var dx = e.screenX - resizer.downX;\r
+               var dy = e.screenY - resizer.downY;\r
+               var resizeBox = resizer.resizeBox;\r
+               var editorId = resizer.editorId;\r
+\r
+               switch (e.type) {\r
+                       case "mousemove":\r
+                               var w, h;\r
+\r
+                               w = resizer.width + dx;\r
+                               h = resizer.height + dy;\r
+\r
+                               w = w < 1 ? 1 : w;\r
+                               h = h < 1 ? 1 : h;\r
+\r
+                               if (resizer.horizontal)\r
+                                       resizeBox.style.width = w + "px";\r
+\r
+                               resizeBox.style.height = h + "px";\r
+                               break;\r
+\r
+                       case "mouseup":\r
+                               TinyMCE_AdvancedTheme._setResizing(e, editorId, false);\r
+                               TinyMCE_AdvancedTheme._resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal);\r
+\r
+                               // Expire in a month\r
+                               if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) {\r
+                                       var expires = new Date();\r
+                                       expires.setTime(expires.getTime() + 3600000 * 24 * 30);\r
+\r
+                                       // Set the cookies\r
+                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires);\r
+                                       TinyMCE_AdvancedTheme._setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires);\r
+                               }\r
+                               break;\r
+               }\r
+       },\r
+\r
+       /**\r
+        * Starts/stops the editor resizing.\r
+        */\r
+       _setResizing : function(e, editor_id, state) {\r
+               e = typeof(e) == "undefined" ? window.event : e;\r
+\r
+               var resizer = TinyMCE_AdvancedTheme._resizer;\r
+               var editorContainer = document.getElementById(editor_id + '_parent');\r
+               var editorArea = document.getElementById(editor_id + '_parent').firstChild;\r
+               var resizeBox = document.getElementById(editor_id + '_resize_box');\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               if (state) {\r
+                       // Place box over editor area\r
+                       var width = editorArea.clientWidth;\r
+                       var height = editorArea.clientHeight;\r
+\r
+                       resizeBox.style.width = width + "px";\r
+                       resizeBox.style.height = height + "px";\r
+\r
+                       resizer.iframeWidth = inst.iframeElement.clientWidth;\r
+                       resizer.iframeHeight = inst.iframeElement.clientHeight;\r
+\r
+                       // Hide editor and show resize box\r
+                       editorArea.style.display = "none";\r
+                       resizeBox.style.display = "block";\r
+\r
+                       // Add event handlers, only once\r
+                       if (!resizer.eventHandlers) {\r
+                               if (tinyMCE.isMSIE)\r
+                                       tinyMCE.addEvent(document, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);\r
+                               else\r
+                                       tinyMCE.addEvent(window, "mousemove", TinyMCE_AdvancedTheme._resizeEventHandler);\r
+\r
+                               tinyMCE.addEvent(document, "mouseup", TinyMCE_AdvancedTheme._resizeEventHandler);\r
+\r
+                               resizer.eventHandlers = true;\r
+                       }\r
+\r
+                       resizer.resizing = true;\r
+                       resizer.downX = e.screenX;\r
+                       resizer.downY = e.screenY;\r
+                       resizer.width = parseInt(resizeBox.style.width);\r
+                       resizer.height = parseInt(resizeBox.style.height);\r
+                       resizer.editorId = editor_id;\r
+                       resizer.resizeBox = resizeBox;\r
+                       resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true);\r
+               } else {\r
+                       resizer.resizing = false;\r
+                       resizeBox.style.display = "none";\r
+                       editorArea.style.display = tinyMCE.isMSIE && !tinyMCE.isOpera ? "block" : "table";\r
+                       tinyMCE.execCommand('mceResetDesignMode');\r
+               }\r
+       },\r
+\r
+       _getColorHTML : function(id, n, cm) {\r
+               var i, h, cl;\r
+\r
+               h = '<span class="mceMenuLine"></span>';\r
+               cl = tinyMCE.getParam(n, TinyMCE_AdvancedTheme._defColors).split(',');\r
+\r
+               h += '<table class="mceColors"><tr>';\r
+               for (i=0; i<cl.length; i++) {\r
+                       c = 'tinyMCE.execInstanceCommand(\'' + id + '\', \'' + cm + '\', false, \'#' + cl[i] + '\');';\r
+                       h += '<td><a href="javascript:' + c + '" style="background-color: #' + cl[i] + '" onclick="' + c + ';return false;"></a></td>';\r
+\r
+                       if ((i+1) % 8 == 0)\r
+                               h += '</tr><tr>';\r
+               }\r
+\r
+               h += '</tr></table>';\r
+\r
+               if (tinyMCE.getParam("theme_advanced_more_colors", true))\r
+                       h += '<a href="javascript:void(0);" onclick="TinyMCE_AdvancedTheme._pickColor(\'' + id + '\',\'' + cm + '\');" class="mceMoreColors">' + tinyMCE.getLang('lang_more_colors') + '</a>';\r
+\r
+               return h;\r
+       },\r
+\r
+       _pickColor : function(id, cm) {\r
+               var inputColor, inst = tinyMCE.selectedInstance;\r
+\r
+               if (cm == 'forecolor' && inst)\r
+                       inputColor = inst.foreColor;\r
+\r
+               if ((cm == 'backcolor' || cm == 'HiliteColor') && inst)\r
+                       inputColor = inst.backColor;\r
+\r
+               tinyMCE.execCommand('mceColorPicker', true, {color : inputColor, callback : function(c) {\r
+                       tinyMCE.execInstanceCommand(id, cm, false, c);\r
+               }});\r
+       },\r
+\r
+       _insertImage : function(src, alt, border, hspace, vspace, width, height, align, title, onmouseover, onmouseout) {\r
+               tinyMCE.execCommand("mceInsertContent", false, tinyMCE.createTagHTML('img', {\r
+                       src : tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src), // Force absolute\r
+                       mce_src : src,\r
+                       alt : alt,\r
+                       border : border,\r
+                       hspace : hspace,\r
+                       vspace : vspace,\r
+                       width : width,\r
+                       height : height,\r
+                       align : align,\r
+                       title : title,\r
+                       onmouseover : onmouseover,\r
+                       onmouseout : onmouseout\r
+               }));\r
+       },\r
+\r
+       _insertLink : function(href, target, title, onclick, style_class) {\r
+               tinyMCE.execCommand('mceBeginUndoLevel');\r
+\r
+               if (tinyMCE.selectedInstance && tinyMCE.selectedElement && tinyMCE.selectedElement.nodeName.toLowerCase() == "img") {\r
+                       var doc = tinyMCE.selectedInstance.getDoc();\r
+                       var linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");\r
+                       var newLink = false;\r
+\r
+                       if (!linkElement) {\r
+                               linkElement = doc.createElement("a");\r
+                               newLink = true;\r
+                       }\r
+\r
+                       var mhref = href;\r
+                       var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);");\r
+                       mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
+\r
+                       tinyMCE.setAttrib(linkElement, 'href', thref);\r
+                       tinyMCE.setAttrib(linkElement, 'mce_href', mhref);\r
+                       tinyMCE.setAttrib(linkElement, 'target', target);\r
+                       tinyMCE.setAttrib(linkElement, 'title', title);\r
+                       tinyMCE.setAttrib(linkElement, 'onclick', onclick);\r
+                       tinyMCE.setAttrib(linkElement, 'class', style_class);\r
+\r
+                       if (newLink) {\r
+                               linkElement.appendChild(tinyMCE.selectedElement.cloneNode(true));\r
+                               tinyMCE.selectedElement.parentNode.replaceChild(linkElement, tinyMCE.selectedElement);\r
+                       }\r
+\r
+                       return;\r
+               }\r
+\r
+               if (!tinyMCE.linkElement && tinyMCE.selectedInstance) {\r
+                       if (tinyMCE.isSafari) {\r
+                               tinyMCE.execCommand("mceInsertContent", false, '<a href="' + tinyMCE.uniqueURL + '">' + tinyMCE.selectedInstance.selection.getSelectedHTML() + '</a>');\r
+                       } else\r
+                               tinyMCE.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL);\r
+\r
+                       tinyMCE.linkElement = tinyMCE.getElementByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);\r
+\r
+                       var elementArray = tinyMCE.getElementsByAttributeValue(tinyMCE.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL);\r
+\r
+                       for (var i=0; i<elementArray.length; i++) {\r
+                               var mhref = href;\r
+                               var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, elementArray[i]);");\r
+                               mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
+\r
+                               tinyMCE.setAttrib(elementArray[i], 'href', thref);\r
+                               tinyMCE.setAttrib(elementArray[i], 'mce_href', mhref);\r
+                               tinyMCE.setAttrib(elementArray[i], 'target', target);\r
+                               tinyMCE.setAttrib(elementArray[i], 'title', title);\r
+                               tinyMCE.setAttrib(elementArray[i], 'onclick', onclick);\r
+                               tinyMCE.setAttrib(elementArray[i], 'class', style_class);\r
+                       }\r
+\r
+                       tinyMCE.linkElement = elementArray[0];\r
+               }\r
+\r
+               if (tinyMCE.linkElement) {\r
+                       var mhref = href;\r
+                       href = eval(tinyMCE.settings['urlconverter_callback'] + "(href, tinyMCE.linkElement);");\r
+                       mhref = tinyMCE.getParam('convert_urls') ? href : mhref;\r
+\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'href', href);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'mce_href', mhref);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'target', target);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'title', title);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'onclick', onclick);\r
+                       tinyMCE.setAttrib(tinyMCE.linkElement, 'class', style_class);\r
+               }\r
+\r
+               tinyMCE.execCommand('mceEndUndoLevel');\r
+       }\r
+};\r
+\r
+tinyMCE.addTheme("advanced", TinyMCE_AdvancedTheme);\r
+\r
+// Add default buttons maps for advanced theme and all internal plugins\r
+tinyMCE.addButtonMap(TinyMCE_AdvancedTheme._buttonMap);\r
diff --git a/media/tiny_mce/themes/advanced/image.htm b/media/tiny_mce/themes/advanced/image.htm
new file mode 100755 (executable)
index 0000000..96a9a75
--- /dev/null
@@ -0,0 +1,100 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_image_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/image.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body id="image" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertImage();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_insert_image_title}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+     <table border="0" cellpadding="4" cellspacing="0">\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="src">{$lang_insert_image_src}</label></td>\r
+            <td><table border="0" cellspacing="0" cellpadding="0">\r
+                <tr>\r
+                  <td><input id="src" name="src" type="text" value="" style="width: 200px" onchange="getImageData();" /></td>\r
+                  <td id="srcbrowsercontainer">&nbsp;</td>\r
+                </tr>\r
+              </table></td>\r
+          </tr>\r
+                 <!-- Image list -->\r
+                 <script language="javascript">\r
+                       if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {\r
+                               var html = "";\r
+\r
+                               html += '<tr><td><label for="image_list">{$lang_image_list}</label></td>';\r
+                               html += '<td><select id="image_list" name="image_list" style="width: 200px" onchange="this.form.src.value=this.options[this.selectedIndex].value;resetImageData();getImageData();">';\r
+                               html += '<option value="">---</option>';\r
+\r
+                               for (var i=0; i<tinyMCEImageList.length; i++)\r
+                                       html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';\r
+\r
+                               html += '</select></td></tr>';\r
+\r
+                               document.write(html);\r
+                       }\r
+                 </script>\r
+                 <!-- /Image list -->\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="alt">{$lang_insert_image_alt}</label></td>\r
+            <td><input id="alt" name="alt" type="text" value="" style="width: 200px" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="align">{$lang_insert_image_align}</label></td>\r
+            <td><select id="align" name="align">\r
+                <option value="">{$lang_insert_image_align_default}</option>\r
+                <option value="baseline">{$lang_insert_image_align_baseline}</option>\r
+                <option value="top">{$lang_insert_image_align_top}</option>\r
+                <option value="middle">{$lang_insert_image_align_middle}</option>\r
+                <option value="bottom">{$lang_insert_image_align_bottom}</option>\r
+                <option value="texttop">{$lang_insert_image_align_texttop}</option>\r
+                <option value="absmiddle">{$lang_insert_image_align_absmiddle}</option>\r
+                <option value="absbottom">{$lang_insert_image_align_absbottom}</option>\r
+                <option value="left">{$lang_insert_image_align_left}</option>\r
+                <option value="right">{$lang_insert_image_align_right}</option>\r
+              </select></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="width">{$lang_insert_image_dimensions}</label></td>\r
+            <td><input id="width" name="width" type="text" value="" size="3" maxlength="5" />\r
+              x\r
+              <input id="height" name="height" type="text" value="" size="3" maxlength="5" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="border">{$lang_insert_image_border}</label></td>\r
+            <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="vspace">{$lang_insert_image_vspace}</label></td>\r
+            <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" /></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="hspace">{$lang_insert_image_hspace}</label></td>\r
+            <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" /></td>\r
+          </tr>\r
+        </table>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertImage();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/themes/advanced/images/anchor.gif b/media/tiny_mce/themes/advanced/images/anchor.gif
new file mode 100755 (executable)
index 0000000..34ab715
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/anchor.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/anchor_symbol.gif b/media/tiny_mce/themes/advanced/images/anchor_symbol.gif
new file mode 100755 (executable)
index 0000000..2eafd79
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/anchor_symbol.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/backcolor.gif b/media/tiny_mce/themes/advanced/images/backcolor.gif
new file mode 100755 (executable)
index 0000000..d03e206
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/backcolor.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/bold.gif b/media/tiny_mce/themes/advanced/images/bold.gif
new file mode 100755 (executable)
index 0000000..d6a9cc2
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/bold.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/bold_de_se.gif b/media/tiny_mce/themes/advanced/images/bold_de_se.gif
new file mode 100755 (executable)
index 0000000..9b129de
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/bold_de_se.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/bold_es.gif b/media/tiny_mce/themes/advanced/images/bold_es.gif
new file mode 100755 (executable)
index 0000000..ea341e6
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/bold_es.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/bold_fr.gif b/media/tiny_mce/themes/advanced/images/bold_fr.gif
new file mode 100755 (executable)
index 0000000..2816454
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/bold_fr.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/bold_ru.gif b/media/tiny_mce/themes/advanced/images/bold_ru.gif
new file mode 100755 (executable)
index 0000000..e000d46
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/bold_ru.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/bold_tw.gif b/media/tiny_mce/themes/advanced/images/bold_tw.gif
new file mode 100755 (executable)
index 0000000..8208543
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/bold_tw.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/browse.gif b/media/tiny_mce/themes/advanced/images/browse.gif
new file mode 100755 (executable)
index 0000000..c786d0b
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/browse.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/bullist.gif b/media/tiny_mce/themes/advanced/images/bullist.gif
new file mode 100755 (executable)
index 0000000..6e19467
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/bullist.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/button_menu.gif b/media/tiny_mce/themes/advanced/images/button_menu.gif
new file mode 100755 (executable)
index 0000000..c3d8fa2
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/button_menu.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/buttons.gif b/media/tiny_mce/themes/advanced/images/buttons.gif
new file mode 100755 (executable)
index 0000000..5ad99a7
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/buttons.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/cancel_button_bg.gif b/media/tiny_mce/themes/advanced/images/cancel_button_bg.gif
new file mode 100755 (executable)
index 0000000..4b4aeef
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/cancel_button_bg.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/charmap.gif b/media/tiny_mce/themes/advanced/images/charmap.gif
new file mode 100755 (executable)
index 0000000..3cdc4ac
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/charmap.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/cleanup.gif b/media/tiny_mce/themes/advanced/images/cleanup.gif
new file mode 100755 (executable)
index 0000000..16491f6
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/cleanup.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/close.gif b/media/tiny_mce/themes/advanced/images/close.gif
new file mode 100755 (executable)
index 0000000..679ca2a
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/close.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/code.gif b/media/tiny_mce/themes/advanced/images/code.gif
new file mode 100755 (executable)
index 0000000..c5d5a67
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/code.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/color.gif b/media/tiny_mce/themes/advanced/images/color.gif
new file mode 100755 (executable)
index 0000000..1ecd574
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/color.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/colors.jpg b/media/tiny_mce/themes/advanced/images/colors.jpg
new file mode 100755 (executable)
index 0000000..b4c542d
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/colors.jpg differ
diff --git a/media/tiny_mce/themes/advanced/images/copy.gif b/media/tiny_mce/themes/advanced/images/copy.gif
new file mode 100755 (executable)
index 0000000..dc14686
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/copy.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/custom_1.gif b/media/tiny_mce/themes/advanced/images/custom_1.gif
new file mode 100755 (executable)
index 0000000..4cbccda
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/custom_1.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/cut.gif b/media/tiny_mce/themes/advanced/images/cut.gif
new file mode 100755 (executable)
index 0000000..4e9a70b
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/cut.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/forecolor.gif b/media/tiny_mce/themes/advanced/images/forecolor.gif
new file mode 100755 (executable)
index 0000000..8b70361
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/forecolor.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/help.gif b/media/tiny_mce/themes/advanced/images/help.gif
new file mode 100755 (executable)
index 0000000..51a1ee4
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/help.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/hr.gif b/media/tiny_mce/themes/advanced/images/hr.gif
new file mode 100755 (executable)
index 0000000..1a1ba2a
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/hr.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/image.gif b/media/tiny_mce/themes/advanced/images/image.gif
new file mode 100755 (executable)
index 0000000..4b88edd
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/image.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/indent.gif b/media/tiny_mce/themes/advanced/images/indent.gif
new file mode 100755 (executable)
index 0000000..acd315b
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/indent.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/insert_button_bg.gif b/media/tiny_mce/themes/advanced/images/insert_button_bg.gif
new file mode 100755 (executable)
index 0000000..69c131c
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/insert_button_bg.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/italic.gif b/media/tiny_mce/themes/advanced/images/italic.gif
new file mode 100755 (executable)
index 0000000..8bb330b
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/italic.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/italic_de_se.gif b/media/tiny_mce/themes/advanced/images/italic_de_se.gif
new file mode 100755 (executable)
index 0000000..feb0309
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/italic_de_se.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/italic_es.gif b/media/tiny_mce/themes/advanced/images/italic_es.gif
new file mode 100755 (executable)
index 0000000..4572cdb
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/italic_es.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/italic_ru.gif b/media/tiny_mce/themes/advanced/images/italic_ru.gif
new file mode 100755 (executable)
index 0000000..a2bb69a
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/italic_ru.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/italic_tw.gif b/media/tiny_mce/themes/advanced/images/italic_tw.gif
new file mode 100755 (executable)
index 0000000..4f6eeaa
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/italic_tw.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/justifycenter.gif b/media/tiny_mce/themes/advanced/images/justifycenter.gif
new file mode 100755 (executable)
index 0000000..42d609a
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/justifycenter.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/justifyfull.gif b/media/tiny_mce/themes/advanced/images/justifyfull.gif
new file mode 100755 (executable)
index 0000000..c8504f6
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/justifyfull.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/justifyleft.gif b/media/tiny_mce/themes/advanced/images/justifyleft.gif
new file mode 100755 (executable)
index 0000000..e8f7e42
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/justifyleft.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/justifyright.gif b/media/tiny_mce/themes/advanced/images/justifyright.gif
new file mode 100755 (executable)
index 0000000..e4cea97
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/justifyright.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/link.gif b/media/tiny_mce/themes/advanced/images/link.gif
new file mode 100755 (executable)
index 0000000..1accf42
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/link.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/menu_check.gif b/media/tiny_mce/themes/advanced/images/menu_check.gif
new file mode 100755 (executable)
index 0000000..50d6afd
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/menu_check.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/newdocument.gif b/media/tiny_mce/themes/advanced/images/newdocument.gif
new file mode 100755 (executable)
index 0000000..a9d2938
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/newdocument.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/numlist.gif b/media/tiny_mce/themes/advanced/images/numlist.gif
new file mode 100755 (executable)
index 0000000..a268352
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/numlist.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/opacity.png b/media/tiny_mce/themes/advanced/images/opacity.png
new file mode 100755 (executable)
index 0000000..b4217cb
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/opacity.png differ
diff --git a/media/tiny_mce/themes/advanced/images/outdent.gif b/media/tiny_mce/themes/advanced/images/outdent.gif
new file mode 100755 (executable)
index 0000000..23f6aa4
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/outdent.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/paste.gif b/media/tiny_mce/themes/advanced/images/paste.gif
new file mode 100755 (executable)
index 0000000..1b45000
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/paste.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/redo.gif b/media/tiny_mce/themes/advanced/images/redo.gif
new file mode 100755 (executable)
index 0000000..3af9069
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/redo.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/removeformat.gif b/media/tiny_mce/themes/advanced/images/removeformat.gif
new file mode 100755 (executable)
index 0000000..0fa3cb7
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/removeformat.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/separator.gif b/media/tiny_mce/themes/advanced/images/separator.gif
new file mode 100755 (executable)
index 0000000..4f39b80
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/separator.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/spacer.gif b/media/tiny_mce/themes/advanced/images/spacer.gif
new file mode 100755 (executable)
index 0000000..3884865
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/spacer.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/statusbar_resize.gif b/media/tiny_mce/themes/advanced/images/statusbar_resize.gif
new file mode 100755 (executable)
index 0000000..af89d80
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/statusbar_resize.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/strikethrough.gif b/media/tiny_mce/themes/advanced/images/strikethrough.gif
new file mode 100755 (executable)
index 0000000..3264635
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/strikethrough.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/sub.gif b/media/tiny_mce/themes/advanced/images/sub.gif
new file mode 100755 (executable)
index 0000000..4d7ce30
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/sub.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/sup.gif b/media/tiny_mce/themes/advanced/images/sup.gif
new file mode 100755 (executable)
index 0000000..a7145e0
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/sup.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/underline.gif b/media/tiny_mce/themes/advanced/images/underline.gif
new file mode 100755 (executable)
index 0000000..1dfeb5f
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/underline.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/underline_es.gif b/media/tiny_mce/themes/advanced/images/underline_es.gif
new file mode 100755 (executable)
index 0000000..551d914
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/underline_es.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/underline_fr.gif b/media/tiny_mce/themes/advanced/images/underline_fr.gif
new file mode 100755 (executable)
index 0000000..551d914
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/underline_fr.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/underline_ru.gif b/media/tiny_mce/themes/advanced/images/underline_ru.gif
new file mode 100755 (executable)
index 0000000..b78e2a4
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/underline_ru.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/underline_tw.gif b/media/tiny_mce/themes/advanced/images/underline_tw.gif
new file mode 100755 (executable)
index 0000000..b715390
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/underline_tw.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/undo.gif b/media/tiny_mce/themes/advanced/images/undo.gif
new file mode 100755 (executable)
index 0000000..520796d
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/undo.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/unlink.gif b/media/tiny_mce/themes/advanced/images/unlink.gif
new file mode 100755 (executable)
index 0000000..5c8a33d
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/unlink.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/visualaid.gif b/media/tiny_mce/themes/advanced/images/visualaid.gif
new file mode 100755 (executable)
index 0000000..63caf18
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/visualaid.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/xp/tab_bg.gif b/media/tiny_mce/themes/advanced/images/xp/tab_bg.gif
new file mode 100755 (executable)
index 0000000..897a01f
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/xp/tab_bg.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/xp/tab_end.gif b/media/tiny_mce/themes/advanced/images/xp/tab_end.gif
new file mode 100755 (executable)
index 0000000..aee442b
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/xp/tab_end.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif b/media/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif
new file mode 100755 (executable)
index 0000000..9dc8abe
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif b/media/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif
new file mode 100755 (executable)
index 0000000..616a889
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif differ
diff --git a/media/tiny_mce/themes/advanced/images/xp/tabs_bg.gif b/media/tiny_mce/themes/advanced/images/xp/tabs_bg.gif
new file mode 100755 (executable)
index 0000000..c303f66
Binary files /dev/null and b/media/tiny_mce/themes/advanced/images/xp/tabs_bg.gif differ
diff --git a/media/tiny_mce/themes/advanced/jscripts/about.js b/media/tiny_mce/themes/advanced/jscripts/about.js
new file mode 100755 (executable)
index 0000000..4e53c28
--- /dev/null
@@ -0,0 +1,75 @@
+function init() {\r
+       var inst;\r
+\r
+       tinyMCEPopup.resizeToInnerSize();\r
+       inst = tinyMCE.selectedInstance;\r
+\r
+       // Give FF some time\r
+       window.setTimeout('insertHelpIFrame();', 10);\r
+\r
+       var tcont = document.getElementById('plugintablecontainer');\r
+       var plugins = tinyMCE.getParam('plugins', '', true, ',');\r
+       if (plugins.length == 0)\r
+               document.getElementById('plugins_tab').style.display = 'none';\r
+\r
+       var html = "";\r
+       html += '<table id="plugintable">';\r
+       html += '<thead>';\r
+       html += '<tr>';\r
+       html += '<td>' + tinyMCE.getLang('lang_plugin') + '</td>';\r
+       html += '<td>' + tinyMCE.getLang('lang_author') + '</td>';\r
+       html += '<td>' + tinyMCE.getLang('lang_version') + '</td>';\r
+       html += '</tr>';\r
+       html += '</thead>';\r
+       html += '<tbody>';\r
+\r
+       for (var i=0; i<inst.plugins.length; i++) {\r
+               var info = getPluginInfo(inst.plugins[i]);\r
+\r
+               html += '<tr>';\r
+\r
+               if (info.infourl != null && info.infourl != '')\r
+                       html += '<td width="50%" title="' + plugins[i] + '"><a href="' + info.infourl + '" target="mceplugin">' + info.longname + '</a></td>';\r
+               else\r
+                       html += '<td width="50%" title="' + plugins[i] + '">' + info.longname + '</td>';\r
+\r
+               if (info.authorurl != null && info.authorurl != '')\r
+                       html += '<td width="35%"><a href="' + info.authorurl + '" target="mceplugin">' + info.author + '</a></td>';\r
+               else\r
+                       html += '<td width="35%">' + info.author + '</td>';\r
+\r
+               html += '<td width="15%">' + info.version + '</td>';\r
+               html += '</tr>';\r
+       }\r
+\r
+       html += '</tbody>';\r
+       html += '</table>';\r
+\r
+       tcont.innerHTML = html;\r
+}\r
+\r
+function getPluginInfo(name) {\r
+       if (tinyMCE.plugins[name].getInfo)\r
+               return tinyMCE.plugins[name].getInfo();\r
+\r
+       return {\r
+               longname : name,\r
+               authorurl : '',\r
+               infourl : '',\r
+               author : '--',\r
+               version : '--'\r
+       };\r
+}\r
+\r
+function insertHelpIFrame() {\r
+       var html = '<iframe width="100%" height="300" src="' + tinyMCE.themeURL + "/docs/" + tinyMCE.settings['docs_language'] + "/index.htm" + '"></iframe>';\r
+\r
+       document.getElementById('iframecontainer').innerHTML = html;\r
+\r
+       html = '';\r
+       html += '<a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> ';\r
+       html += '<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a> ';\r
+       html += '<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a> ';\r
+\r
+       document.getElementById('buttoncontainer').innerHTML = html;\r
+}\r
diff --git a/media/tiny_mce/themes/advanced/jscripts/anchor.js b/media/tiny_mce/themes/advanced/jscripts/anchor.js
new file mode 100755 (executable)
index 0000000..e7c1c62
--- /dev/null
@@ -0,0 +1,74 @@
+var action, element;\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name");\r
+       var img = inst.getFocusElement();\r
+       action = 'insert';\r
+\r
+       if (anchor != null) {\r
+               element = anchor;\r
+               action = "update";\r
+       }\r
+\r
+       if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") {\r
+               element = img;\r
+               action = "update";\r
+       }\r
+\r
+       if (action == "update")\r
+               document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name");\r
+\r
+       document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true);\r
+}\r
+\r
+function insertAnchor() {\r
+       var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));\r
+       var name = document.forms[0].anchorName.value, e;\r
+\r
+       tinyMCEPopup.execCommand("mceBeginUndoLevel");\r
+\r
+       if (action == "update") {\r
+               if (element.nodeName == "IMG")\r
+                       element.setAttribute("title", name);\r
+               else\r
+                       element.setAttribute("name", name);\r
+       } else {\r
+               var rng = inst.getRng();\r
+\r
+               if (rng.collapse)\r
+                       rng.collapse(false);\r
+\r
+               name = name.replace(/&/g, '&amp;');\r
+               name = name.replace(/\"/g, '&quot;');\r
+               name = name.replace(/</g, '&lt;');\r
+               name = name.replace(/>/g, '&gt;');\r
+\r
+               // Fix for bug #1447335\r
+               if (tinyMCE.isGecko)\r
+                       html = '<a id="mceNewAnchor" name="' + name + '"></a>';\r
+               else\r
+                       html = '<a name="' + name + '"></a>';\r
+\r
+               tinyMCEPopup.execCommand("mceInsertContent", false, html);\r
+\r
+               // Fix for bug #1447335 force cursor after the anchor element\r
+               if (tinyMCE.isGecko) {\r
+                       e = inst.getDoc().getElementById('mceNewAnchor');\r
+\r
+                       if (e) {\r
+                               inst.selection.selectNode(e, true, false, false);\r
+                               e.removeAttribute('id');\r
+                       }\r
+               }\r
+\r
+               tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);\r
+       }\r
+\r
+       tinyMCEPopup.execCommand("mceEndUndoLevel");\r
+\r
+       tinyMCE.triggerNodeChange();\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/media/tiny_mce/themes/advanced/jscripts/charmap.js b/media/tiny_mce/themes/advanced/jscripts/charmap.js
new file mode 100755 (executable)
index 0000000..eaa6a94
--- /dev/null
@@ -0,0 +1,326 @@
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+}\r
+\r
+var charmap = new Array();\r
+\r
+// for mor details please see w3c.org\r
+// now here is the complete list ;)\r
+\r
+charmap = [\r
+       ['&nbsp;',    '&#160;',  true, 'no-break space'],\r
+       ['&amp;',     '&#38;',   true, 'ampersand'],\r
+       ['&quot;',    '&#34;',   true, 'quotation mark'],\r
+// finance\r
+       ['&cent;',    '&#162;',  true, 'cent sign'],\r
+       ['&euro;',    '&#8364;', true, 'euro sign'],\r
+       ['&pound;',   '&#163;',  true, 'pound sign'],\r
+       ['&yen;',     '&#165;',  true, 'yen sign'],\r
+// signs\r
+       ['&copy;',    '&#169;',  true, 'copyright sign'],\r
+       ['&reg;',     '&#174;',  true, 'registered sign'],\r
+       ['&trade;',   '&#8482;', true, 'trade mark sign'],\r
+       ['&permil;',  '&#8240;', true, 'per mille sign'],\r
+       ['&micro;',   '&#181;',  true, 'micro sign'],\r
+       ['&middot;',  '&#183;',  true, 'middle dot'],\r
+       ['&bull;',    '&#8226;', true, 'bullet'],\r
+       ['&hellip;',  '&#8230;', true, 'three dot leader'],\r
+       ['&prime;',   '&#8242;', true, 'minutes / feet'],\r
+       ['&Prime;',   '&#8243;', true, 'seconds / inches'],\r
+       ['&sect;',    '&#167;',  true, 'section sign'],\r
+       ['&para;',    '&#182;',  true, 'paragraph sign'],\r
+       ['&szlig;',   '&#223;',  true, 'sharp s / ess-zed'],\r
+// quotations\r
+       ['&lsaquo;',  '&#8249;', true, 'single left-pointing angle quotation mark'],\r
+       ['&rsaquo;',  '&#8250;', true, 'single right-pointing angle quotation mark'],\r
+       ['&laquo;',   '&#171;',  true, 'left pointing guillemet'],\r
+       ['&raquo;',   '&#187;',  true, 'right pointing guillemet'],\r
+       ['&lsquo;',   '&#8216;', true, 'left single quotation mark'],\r
+       ['&rsquo;',   '&#8217;', true, 'right single quotation mark'],\r
+       ['&ldquo;',   '&#8220;', true, 'left double quotation mark'],\r
+       ['&rdquo;',   '&#8221;', true, 'right double quotation mark'],\r
+       ['&sbquo;',   '&#8218;', true, 'single low-9 quotation mark'],\r
+       ['&bdquo;',   '&#8222;', true, 'double low-9 quotation mark'],\r
+       ['&lt;',      '&#60;',   true, 'less-than sign'],\r
+       ['&gt;',      '&#62;',   true, 'greater-than sign'],\r
+       ['&le;',      '&#8804;', true, 'less-than or equal to'],\r
+       ['&ge;',      '&#8805;', true, 'greater-than or equal to'],\r
+       ['&ndash;',   '&#8211;', true, 'en dash'],\r
+       ['&mdash;',   '&#8212;', true, 'em dash'],\r
+       ['&macr;',    '&#175;',  true, 'macron'],\r
+       ['&oline;',   '&#8254;', true, 'overline'],\r
+       ['&curren;',  '&#164;',  true, 'currency sign'],\r
+       ['&brvbar;',  '&#166;',  true, 'broken bar'],\r
+       ['&uml;',     '&#168;',  true, 'diaeresis'],\r
+       ['&iexcl;',   '&#161;',  true, 'inverted exclamation mark'],\r
+       ['&iquest;',  '&#191;',  true, 'turned question mark'],\r
+       ['&circ;',    '&#710;',  true, 'circumflex accent'],\r
+       ['&tilde;',   '&#732;',  true, 'small tilde'],\r
+       ['&deg;',     '&#176;',  true, 'degree sign'],\r
+       ['&minus;',   '&#8722;', true, 'minus sign'],\r
+       ['&plusmn;',  '&#177;',  true, 'plus-minus sign'],\r
+       ['&divide;',  '&#247;',  true, 'division sign'],\r
+       ['&frasl;',   '&#8260;', true, 'fraction slash'],\r
+       ['&times;',   '&#215;',  true, 'multiplication sign'],\r
+       ['&sup1;',    '&#185;',  true, 'superscript one'],\r
+       ['&sup2;',    '&#178;',  true, 'superscript two'],\r
+       ['&sup3;',    '&#179;',  true, 'superscript three'],\r
+       ['&frac14;',  '&#188;',  true, 'fraction one quarter'],\r
+       ['&frac12;',  '&#189;',  true, 'fraction one half'],\r
+       ['&frac34;',  '&#190;',  true, 'fraction three quarters'],\r
+// math / logical\r
+       ['&fnof;',    '&#402;',  true, 'function / florin'],\r
+       ['&int;',     '&#8747;', true, 'integral'],\r
+       ['&sum;',     '&#8721;', true, 'n-ary sumation'],\r
+       ['&infin;',   '&#8734;', true, 'infinity'],\r
+       ['&radic;',   '&#8730;', true, 'square root'],\r
+       ['&sim;',     '&#8764;', false,'similar to'],\r
+       ['&cong;',    '&#8773;', false,'approximately equal to'],\r
+       ['&asymp;',   '&#8776;', true, 'almost equal to'],\r
+       ['&ne;',      '&#8800;', true, 'not equal to'],\r
+       ['&equiv;',   '&#8801;', true, 'identical to'],\r
+       ['&isin;',    '&#8712;', false,'element of'],\r
+       ['&notin;',   '&#8713;', false,'not an element of'],\r
+       ['&ni;',      '&#8715;', false,'contains as member'],\r
+       ['&prod;',    '&#8719;', true, 'n-ary product'],\r
+       ['&and;',     '&#8743;', false,'logical and'],\r
+       ['&or;',      '&#8744;', false,'logical or'],\r
+       ['&not;',     '&#172;',  true, 'not sign'],\r
+       ['&cap;',     '&#8745;', true, 'intersection'],\r
+       ['&cup;',     '&#8746;', false,'union'],\r
+       ['&part;',    '&#8706;', true, 'partial differential'],\r
+       ['&forall;',  '&#8704;', false,'for all'],\r
+       ['&exist;',   '&#8707;', false,'there exists'],\r
+       ['&empty;',   '&#8709;', false,'diameter'],\r
+       ['&nabla;',   '&#8711;', false,'backward difference'],\r
+       ['&lowast;',  '&#8727;', false,'asterisk operator'],\r
+       ['&prop;',    '&#8733;', false,'proportional to'],\r
+       ['&ang;',     '&#8736;', false,'angle'],\r
+// undefined\r
+       ['&acute;',   '&#180;',  true, 'acute accent'],\r
+       ['&cedil;',   '&#184;',  true, 'cedilla'],\r
+       ['&ordf;',    '&#170;',  true, 'feminine ordinal indicator'],\r
+       ['&ordm;',    '&#186;',  true, 'masculine ordinal indicator'],\r
+       ['&dagger;',  '&#8224;', true, 'dagger'],\r
+       ['&Dagger;',  '&#8225;', true, 'double dagger'],\r
+// alphabetical special chars\r
+       ['&Agrave;',  '&#192;',  true, 'A - grave'],\r
+       ['&Aacute;',  '&#193;',  true, 'A - acute'],\r
+       ['&Acirc;',   '&#194;',  true, 'A - circumflex'],\r
+       ['&Atilde;',  '&#195;',  true, 'A - tilde'],\r
+       ['&Auml;',    '&#196;',  true, 'A - diaeresis'],\r
+       ['&Aring;',   '&#197;',  true, 'A - ring above'],\r
+       ['&AElig;',   '&#198;',  true, 'ligature AE'],\r
+       ['&Ccedil;',  '&#199;',  true, 'C - cedilla'],\r
+       ['&Egrave;',  '&#200;',  true, 'E - grave'],\r
+       ['&Eacute;',  '&#201;',  true, 'E - acute'],\r
+       ['&Ecirc;',   '&#202;',  true, 'E - circumflex'],\r
+       ['&Euml;',    '&#203;',  true, 'E - diaeresis'],\r
+       ['&Igrave;',  '&#204;',  true, 'I - grave'],\r
+       ['&Iacute;',  '&#205;',  true, 'I - acute'],\r
+       ['&Icirc;',   '&#206;',  true, 'I - circumflex'],\r
+       ['&Iuml;',    '&#207;',  true, 'I - diaeresis'],\r
+       ['&ETH;',     '&#208;',  true, 'ETH'],\r
+       ['&Ntilde;',  '&#209;',  true, 'N - tilde'],\r
+       ['&Ograve;',  '&#210;',  true, 'O - grave'],\r
+       ['&Oacute;',  '&#211;',  true, 'O - acute'],\r
+       ['&Ocirc;',   '&#212;',  true, 'O - circumflex'],\r
+       ['&Otilde;',  '&#213;',  true, 'O - tilde'],\r
+       ['&Ouml;',    '&#214;',  true, 'O - diaeresis'],\r
+       ['&Oslash;',  '&#216;',  true, 'O - slash'],\r
+       ['&OElig;',   '&#338;',  true, 'ligature OE'],\r
+       ['&Scaron;',  '&#352;',  true, 'S - caron'],\r
+       ['&Ugrave;',  '&#217;',  true, 'U - grave'],\r
+       ['&Uacute;',  '&#218;',  true, 'U - acute'],\r
+       ['&Ucirc;',   '&#219;',  true, 'U - circumflex'],\r
+       ['&Uuml;',    '&#220;',  true, 'U - diaeresis'],\r
+       ['&Yacute;',  '&#221;',  true, 'Y - acute'],\r
+       ['&Yuml;',    '&#376;',  true, 'Y - diaeresis'],\r
+       ['&THORN;',   '&#222;',  true, 'THORN'],\r
+       ['&agrave;',  '&#224;',  true, 'a - grave'],\r
+       ['&aacute;',  '&#225;',  true, 'a - acute'],\r
+       ['&acirc;',   '&#226;',  true, 'a - circumflex'],\r
+       ['&atilde;',  '&#227;',  true, 'a - tilde'],\r
+       ['&auml;',    '&#228;',  true, 'a - diaeresis'],\r
+       ['&aring;',   '&#229;',  true, 'a - ring above'],\r
+       ['&aelig;',   '&#230;',  true, 'ligature ae'],\r
+       ['&ccedil;',  '&#231;',  true, 'c - cedilla'],\r
+       ['&egrave;',  '&#232;',  true, 'e - grave'],\r
+       ['&eacute;',  '&#233;',  true, 'e - acute'],\r
+       ['&ecirc;',   '&#234;',  true, 'e - circumflex'],\r
+       ['&euml;',    '&#235;',  true, 'e - diaeresis'],\r
+       ['&igrave;',  '&#236;',  true, 'i - grave'],\r
+       ['&iacute;',  '&#237;',  true, 'i - acute'],\r
+       ['&icirc;',   '&#238;',  true, 'i - circumflex'],\r
+       ['&iuml;',    '&#239;',  true, 'i - diaeresis'],\r
+       ['&eth;',     '&#240;',  true, 'eth'],\r
+       ['&ntilde;',  '&#241;',  true, 'n - tilde'],\r
+       ['&ograve;',  '&#242;',  true, 'o - grave'],\r
+       ['&oacute;',  '&#243;',  true, 'o - acute'],\r
+       ['&ocirc;',   '&#244;',  true, 'o - circumflex'],\r
+       ['&otilde;',  '&#245;',  true, 'o - tilde'],\r
+       ['&ouml;',    '&#246;',  true, 'o - diaeresis'],\r
+       ['&oslash;',  '&#248;',  true, 'o slash'],\r
+       ['&oelig;',   '&#339;',  true, 'ligature oe'],\r
+       ['&scaron;',  '&#353;',  true, 's - caron'],\r
+       ['&ugrave;',  '&#249;',  true, 'u - grave'],\r
+       ['&uacute;',  '&#250;',  true, 'u - acute'],\r
+       ['&ucirc;',   '&#251;',  true, 'u - circumflex'],\r
+       ['&uuml;',    '&#252;',  true, 'u - diaeresis'],\r
+       ['&yacute;',  '&#253;',  true, 'y - acute'],\r
+       ['&thorn;',   '&#254;',  true, 'thorn'],\r
+       ['&yuml;',    '&#255;',  true, 'y - diaeresis'],\r
+    ['&Alpha;',   '&#913;',  true, 'Alpha'],\r
+       ['&Beta;',    '&#914;',  true, 'Beta'],\r
+       ['&Gamma;',   '&#915;',  true, 'Gamma'],\r
+       ['&Delta;',   '&#916;',  true, 'Delta'],\r
+       ['&Epsilon;', '&#917;',  true, 'Epsilon'],\r
+       ['&Zeta;',    '&#918;',  true, 'Zeta'],\r
+       ['&Eta;',     '&#919;',  true, 'Eta'],\r
+       ['&Theta;',   '&#920;',  true, 'Theta'],\r
+       ['&Iota;',    '&#921;',  true, 'Iota'],\r
+       ['&Kappa;',   '&#922;',  true, 'Kappa'],\r
+       ['&Lambda;',  '&#923;',  true, 'Lambda'],\r
+       ['&Mu;',      '&#924;',  true, 'Mu'],\r
+       ['&Nu;',      '&#925;',  true, 'Nu'],\r
+       ['&Xi;',      '&#926;',  true, 'Xi'],\r
+       ['&Omicron;', '&#927;',  true, 'Omicron'],\r
+       ['&Pi;',      '&#928;',  true, 'Pi'],\r
+       ['&Rho;',     '&#929;',  true, 'Rho'],\r
+       ['&Sigma;',   '&#931;',  true, 'Sigma'],\r
+       ['&Tau;',     '&#932;',  true, 'Tau'],\r
+       ['&Upsilon;', '&#933;',  true, 'Upsilon'],\r
+       ['&Phi;',     '&#934;',  true, 'Phi'],\r
+       ['&Chi;',     '&#935;',  true, 'Chi'],\r
+       ['&Psi;',     '&#936;',  true, 'Psi'],\r
+       ['&Omega;',   '&#937;',  true, 'Omega'],\r
+       ['&alpha;',   '&#945;',  true, 'alpha'],\r
+       ['&beta;',    '&#946;',  true, 'beta'],\r
+       ['&gamma;',   '&#947;',  true, 'gamma'],\r
+       ['&delta;',   '&#948;',  true, 'delta'],\r
+       ['&epsilon;', '&#949;',  true, 'epsilon'],\r
+       ['&zeta;',    '&#950;',  true, 'zeta'],\r
+       ['&eta;',     '&#951;',  true, 'eta'],\r
+       ['&theta;',   '&#952;',  true, 'theta'],\r
+       ['&iota;',    '&#953;',  true, 'iota'],\r
+       ['&kappa;',   '&#954;',  true, 'kappa'],\r
+       ['&lambda;',  '&#955;',  true, 'lambda'],\r
+       ['&mu;',      '&#956;',  true, 'mu'],\r
+       ['&nu;',      '&#957;',  true, 'nu'],\r
+       ['&xi;',      '&#958;',  true, 'xi'],\r
+       ['&omicron;', '&#959;',  true, 'omicron'],\r
+       ['&pi;',      '&#960;',  true, 'pi'],\r
+       ['&rho;',     '&#961;',  true, 'rho'],\r
+       ['&sigmaf;',  '&#962;',  true, 'final sigma'],\r
+       ['&sigma;',   '&#963;',  true, 'sigma'],\r
+       ['&tau;',     '&#964;',  true, 'tau'],\r
+       ['&upsilon;', '&#965;',  true, 'upsilon'],\r
+       ['&phi;',     '&#966;',  true, 'phi'],\r
+       ['&chi;',     '&#967;',  true, 'chi'],\r
+       ['&psi;',     '&#968;',  true, 'psi'],\r
+       ['&omega;',   '&#969;',  true, 'omega'],\r
+// symbols\r
+       ['&alefsym;', '&#8501;', false,'alef symbol'],\r
+       ['&piv;',     '&#982;',  false,'pi symbol'],\r
+       ['&real;',    '&#8476;', false,'real part symbol'],\r
+       ['&thetasym;','&#977;',  false,'theta symbol'],\r
+       ['&upsih;',   '&#978;',  false,'upsilon - hook symbol'],\r
+       ['&weierp;',  '&#8472;', false,'Weierstrass p'],\r
+       ['&image;',   '&#8465;', false,'imaginary part'],\r
+// arrows\r
+       ['&larr;',    '&#8592;', true, 'leftwards arrow'],\r
+       ['&uarr;',    '&#8593;', true, 'upwards arrow'],\r
+       ['&rarr;',    '&#8594;', true, 'rightwards arrow'],\r
+       ['&darr;',    '&#8595;', true, 'downwards arrow'],\r
+       ['&harr;',    '&#8596;', true, 'left right arrow'],\r
+       ['&crarr;',   '&#8629;', false,'carriage return'],\r
+       ['&lArr;',    '&#8656;', false,'leftwards double arrow'],\r
+       ['&uArr;',    '&#8657;', false,'upwards double arrow'],\r
+       ['&rArr;',    '&#8658;', false,'rightwards double arrow'],\r
+       ['&dArr;',    '&#8659;', false,'downwards double arrow'],\r
+       ['&hArr;',    '&#8660;', false,'left right double arrow'],\r
+       ['&there4;',  '&#8756;', false,'therefore'],\r
+       ['&sub;',     '&#8834;', false,'subset of'],\r
+       ['&sup;',     '&#8835;', false,'superset of'],\r
+       ['&nsub;',    '&#8836;', false,'not a subset of'],\r
+       ['&sube;',    '&#8838;', false,'subset of or equal to'],\r
+       ['&supe;',    '&#8839;', false,'superset of or equal to'],\r
+       ['&oplus;',   '&#8853;', false,'circled plus'],\r
+       ['&otimes;',  '&#8855;', false,'circled times'],\r
+       ['&perp;',    '&#8869;', false,'perpendicular'],\r
+       ['&sdot;',    '&#8901;', false,'dot operator'],\r
+       ['&lceil;',   '&#8968;', false,'left ceiling'],\r
+       ['&rceil;',   '&#8969;', false,'right ceiling'],\r
+       ['&lfloor;',  '&#8970;', false,'left floor'],\r
+       ['&rfloor;',  '&#8971;', false,'right floor'],\r
+       ['&lang;',    '&#9001;', false,'left-pointing angle bracket'],\r
+       ['&rang;',    '&#9002;', false,'right-pointing angle bracket'],\r
+       ['&loz;',     '&#9674;', true,'lozenge'],\r
+       ['&spades;',  '&#9824;', false,'black spade suit'],\r
+       ['&clubs;',   '&#9827;', true, 'black club suit'],\r
+       ['&hearts;',  '&#9829;', true, 'black heart suit'],\r
+       ['&diams;',   '&#9830;', true, 'black diamond suit'],\r
+       ['&ensp;',    '&#8194;', false,'en space'],\r
+       ['&emsp;',    '&#8195;', false,'em space'],\r
+       ['&thinsp;',  '&#8201;', false,'thin space'],\r
+       ['&zwnj;',    '&#8204;', false,'zero width non-joiner'],\r
+       ['&zwj;',     '&#8205;', false,'zero width joiner'],\r
+       ['&lrm;',     '&#8206;', false,'left-to-right mark'],\r
+       ['&rlm;',     '&#8207;', false,'right-to-left mark'],\r
+       ['&shy;',     '&#173;',  false,'soft hyphen']\r
+];\r
+\r
+function renderCharMapHTML() {\r
+       var charsPerRow = 20, tdWidth=20, tdHeight=20;\r
+       var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';\r
+       var cols=-1;\r
+       for (var i=0; i<charmap.length; i++) {\r
+               if (charmap[i][2]==true) {\r
+                       cols++;\r
+                       html += ''\r
+                               + '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap"'\r
+                               + ' onmouseover="this.className=\'charmapOver\';'\r
+                               + 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');"'\r
+                               + ' onmouseout="this.className=\'charmap\';"'\r
+                               + ' nowrap="nowrap" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');"><a style="text-decoration: none;" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">'\r
+                               + charmap[i][1]\r
+                               + '</a></td>';\r
+                       if ((cols+1) % charsPerRow == 0)\r
+                               html += '</tr><tr height="' + tdHeight + '">';\r
+               }\r
+        }\r
+       if (cols % charsPerRow > 0) {\r
+               var padd = charsPerRow - (cols % charsPerRow);\r
+               for (var i=0; i<padd-1; i++)\r
+                       html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>';\r
+       }\r
+       html += '</tr></table>';\r
+       document.write(html);\r
+}\r
+\r
+function insertChar(chr) {\r
+       tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';');\r
+\r
+       // Refocus in window\r
+       if (tinyMCEPopup.isWindow)\r
+               window.focus();\r
+\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function previewChar(codeA, codeB, codeN) {\r
+       var elmA = document.getElementById('codeA');\r
+       var elmB = document.getElementById('codeB');\r
+       var elmV = document.getElementById('codeV');\r
+       var elmN = document.getElementById('codeN');\r
+\r
+       if (codeA=='#160;') {\r
+               elmV.innerHTML = '__';\r
+       } else {\r
+               elmV.innerHTML = '&' + codeA;\r
+       }\r
+\r
+       elmB.innerHTML = '&amp;' + codeA;\r
+       elmA.innerHTML = '&amp;' + codeB;\r
+       elmN.innerHTML = codeN;\r
+}\r
diff --git a/media/tiny_mce/themes/advanced/jscripts/color_picker.js b/media/tiny_mce/themes/advanced/jscripts/color_picker.js
new file mode 100755 (executable)
index 0000000..00fc823
--- /dev/null
@@ -0,0 +1,240 @@
+var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;\r
+\r
+var colors = new Array(\r
+       "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",\r
+       "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",\r
+       "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",\r
+       "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",\r
+       "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",\r
+       "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",\r
+       "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",\r
+       "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",\r
+       "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",\r
+       "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",\r
+       "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",\r
+       "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",\r
+       "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",\r
+       "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",\r
+       "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",\r
+       "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",\r
+       "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",\r
+       "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",\r
+       "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",\r
+       "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",\r
+       "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",\r
+       "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",\r
+       "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",\r
+       "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",\r
+       "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",\r
+       "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",\r
+       "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"\r
+);\r
+\r
+var named = {\r
+       '#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',\r
+       '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown',\r
+       '#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue',\r
+       '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod',\r
+       '#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen',\r
+       '#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue',\r
+       '#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue',\r
+       '#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen',\r
+       '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey',\r
+       '#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory',\r
+       '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue',\r
+       '#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen',\r
+       '#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey',\r
+       '#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',\r
+       '#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue',\r
+       '#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin',\r
+       '#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid',\r
+       '#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff',\r
+       '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue',\r
+       '#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver',\r
+       '#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen',\r
+       '#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',\r
+       '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen'\r
+};\r
+\r
+function init() {\r
+       var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color'));\r
+\r
+       if (tinyMCE.isMSIE)\r
+               tinyMCEPopup.resizeToInnerSize();\r
+\r
+       generatePicker();\r
+\r
+       if (inputColor) {\r
+               changeFinalColor(inputColor);\r
+\r
+               col = convertHexToRGB(inputColor);\r
+\r
+               if (col)\r
+                       updateLight(col.r, col.g, col.b);\r
+       }\r
+}\r
+\r
+function insertAction() {\r
+       var color = document.getElementById("color").value;\r
+\r
+       tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function showColor(color, name) {\r
+       if (name)\r
+               document.getElementById("colorname").innerHTML = name;\r
+\r
+       document.getElementById("preview").style.backgroundColor = color;\r
+       document.getElementById("color").value = color;\r
+}\r
+\r
+function convertRGBToHex(col) {\r
+       var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");\r
+\r
+       if (!col)\r
+               return col;\r
+\r
+       var rgb = col.replace(re, "$1,$2,$3").split(',');\r
+       if (rgb.length == 3) {\r
+               r = parseInt(rgb[0]).toString(16);\r
+               g = parseInt(rgb[1]).toString(16);\r
+               b = parseInt(rgb[2]).toString(16);\r
+\r
+               r = r.length == 1 ? '0' + r : r;\r
+               g = g.length == 1 ? '0' + g : g;\r
+               b = b.length == 1 ? '0' + b : b;\r
+\r
+               return "#" + r + g + b;\r
+       }\r
+\r
+       return col;\r
+}\r
+\r
+function convertHexToRGB(col) {\r
+       if (col.indexOf('#') != -1) {\r
+               col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
+\r
+               r = parseInt(col.substring(0, 2), 16);\r
+               g = parseInt(col.substring(2, 4), 16);\r
+               b = parseInt(col.substring(4, 6), 16);\r
+\r
+               return {r : r, g : g, b : b};\r
+       }\r
+\r
+       return null;\r
+}\r
+\r
+function generatePicker() {\r
+       var el = document.getElementById('light'), h = '', i;\r
+\r
+       for (i = 0; i < detail; i++){\r
+               h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"'\r
+               + ' onclick="changeFinalColor(this.style.backgroundColor)"'\r
+               + ' onmousedown="isMouseDown = true; return false;"'\r
+               + ' onmouseup="isMouseDown = false;"'\r
+               + ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"'\r
+               + ' onmouseover="isMouseOver = true;"'\r
+               + ' onmouseout="isMouseOver = false;"'\r
+               + '></div>';\r
+       }\r
+\r
+       el.innerHTML = h;\r
+}\r
+\r
+function generateWebColors() {\r
+       var el = document.getElementById('webcolors'), h = '', i;\r
+\r
+       if (el.className == 'generated')\r
+               return;\r
+\r
+       h += '<table border="0" cellspacing="1" cellpadding="0">'\r
+               + '<tr>';\r
+\r
+       for (i=0; i<colors.length; i++) {\r
+               h += '<td bgcolor="' + colors[i] + '">'\r
+                       + '<a href="javascript:insertAction();" onfocus="showColor(\'' + colors[i] +  '\');" onmouseover="showColor(\'' + colors[i] +  '\');">'\r
+                       + '<img border="0" src="images/spacer.gif" width="10" height="10" title="' + colors[i] +  '" alt="' + colors[i] +  '" /></a></td>';\r
+               if ((i+1) % 18 == 0)\r
+                       h += '</tr><tr>';\r
+       }\r
+\r
+       h += '</table>';\r
+\r
+       el.innerHTML = h;\r
+       el.className = 'generated';\r
+}\r
+\r
+function generateNamedColors() {\r
+       var el = document.getElementById('namedcolors'), h = '', n, v, i = 0;\r
+\r
+       if (el.className == 'generated')\r
+               return;\r
+\r
+       for (n in named) {\r
+               v = named[n];\r
+               h += '<a href="javascript:insertAction();" onmouseover="showColor(\'' + n +  '\',\'' + v + '\');" style="background-color: ' + n + '"><!-- IE --></a>'\r
+       }\r
+\r
+       el.innerHTML = h;\r
+       el.className = 'generated';\r
+}\r
+\r
+function dechex(n) {\r
+       return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16);\r
+}\r
+\r
+function computeColor(e) {\r
+       var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB;\r
+\r
+       x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0);\r
+       y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0);\r
+\r
+       partWidth = document.getElementById('colorpicker').width / 6;\r
+       partDetail = detail / 2;\r
+       imHeight = document.getElementById('colorpicker').height;\r
+\r
+       r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255;\r
+       g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255     + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth);\r
+       b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth);\r
+\r
+       coef = (imHeight - y) / imHeight;\r
+       r = 128 + (r - 128) * coef;\r
+       g = 128 + (g - 128) * coef;\r
+       b = 128 + (b - 128) * coef;\r
+\r
+       changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b));\r
+       updateLight(r, g, b);\r
+}\r
+\r
+function updateLight(r, g, b) {\r
+       var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color;\r
+\r
+       for (i=0; i<detail; i++) {\r
+               if ((i>=0) && (i<partDetail)) {\r
+                       finalCoef = i / partDetail;\r
+                       finalR = dechex(255 - (255 - r) * finalCoef);\r
+                       finalG = dechex(255 - (255 - g) * finalCoef);\r
+                       finalB = dechex(255 - (255 - b) * finalCoef);\r
+               } else {\r
+                       finalCoef = 2 - i / partDetail;\r
+                       finalR = dechex(r * finalCoef);\r
+                       finalG = dechex(g * finalCoef);\r
+                       finalB = dechex(b * finalCoef);\r
+               }\r
+\r
+               color = finalR + finalG + finalB;\r
+\r
+               document.getElementById('gs' + i).style.backgroundColor = '#'+color;\r
+       }\r
+}\r
+\r
+function changeFinalColor(color) {\r
+       if (color.indexOf('#') == -1)\r
+               color = convertRGBToHex(color);\r
+\r
+       document.getElementById('preview').style.backgroundColor = color;\r
+       document.getElementById('color').value = color;\r
+}\r
+\r
+window.focus();
\ No newline at end of file
diff --git a/media/tiny_mce/themes/advanced/jscripts/image.js b/media/tiny_mce/themes/advanced/jscripts/image.js
new file mode 100755 (executable)
index 0000000..a52bfad
--- /dev/null
@@ -0,0 +1,81 @@
+var url = tinyMCE.getParam("external_image_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function insertImage() {\r
+       var src = document.forms[0].src.value;\r
+       var alt = document.forms[0].alt.value;\r
+       var border = document.forms[0].border.value;\r
+       var vspace = document.forms[0].vspace.value;\r
+       var hspace = document.forms[0].hspace.value;\r
+       var width = document.forms[0].width.value;\r
+       var height = document.forms[0].height.value;\r
+       var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value;\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       tinyMCE.themes['advanced']._insertImage(src, alt, border, hspace, vspace, width, height, align);\r
+       tinyMCEPopup.close();\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       for (var i=0; i<document.forms[0].align.options.length; i++) {\r
+               if (document.forms[0].align.options[i].value == tinyMCE.getWindowArg('align'))\r
+                       document.forms[0].align.options.selectedIndex = i;\r
+       }\r
+\r
+       formObj.src.value = tinyMCE.getWindowArg('src');\r
+       formObj.alt.value = tinyMCE.getWindowArg('alt');\r
+       formObj.border.value = tinyMCE.getWindowArg('border');\r
+       formObj.vspace.value = tinyMCE.getWindowArg('vspace');\r
+       formObj.hspace.value = tinyMCE.getWindowArg('hspace');\r
+       formObj.width.value = tinyMCE.getWindowArg('width');\r
+       formObj.height.value = tinyMCE.getWindowArg('height');\r
+       formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); \r
+\r
+       // Handle file browser\r
+       if (isVisible('srcbrowser'))\r
+               document.getElementById('src').style.width = '180px';\r
+\r
+       // Auto select image in list\r
+       if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {\r
+               for (var i=0; i<formObj.image_list.length; i++) {\r
+                       if (formObj.image_list.options[i].value == tinyMCE.getWindowArg('src'))\r
+                               formObj.image_list.options[i].selected = true;\r
+               }\r
+       }\r
+}\r
+\r
+var preloadImg = new Image();\r
+\r
+function resetImageData() {\r
+       var formObj = document.forms[0];\r
+       formObj.width.value = formObj.height.value = "";        \r
+}\r
+\r
+function updateImageData() {\r
+       var formObj = document.forms[0];\r
+\r
+       if (formObj.width.value == "")\r
+               formObj.width.value = preloadImg.width;\r
+\r
+       if (formObj.height.value == "")\r
+               formObj.height.value = preloadImg.height;\r
+}\r
+\r
+function getImageData() {\r
+       preloadImg = new Image();\r
+       tinyMCE.addEvent(preloadImg, "load", updateImageData);\r
+       tinyMCE.addEvent(preloadImg, "error", function () {var formObj = document.forms[0];formObj.width.value = formObj.height.value = "";});\r
+       preloadImg.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], document.forms[0].src.value);\r
+}\r
diff --git a/media/tiny_mce/themes/advanced/jscripts/link.js b/media/tiny_mce/themes/advanced/jscripts/link.js
new file mode 100755 (executable)
index 0000000..e195497
--- /dev/null
@@ -0,0 +1,74 @@
+var url = tinyMCE.getParam("external_link_list_url");\r
+if (url != null) {\r
+       // Fix relative\r
+       if (url.charAt(0) != '/' && url.indexOf('://') == -1)\r
+               url = tinyMCE.documentBasePath + "/" + url;\r
+\r
+       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');\r
+}\r
+\r
+function init() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link');\r
+\r
+       // Handle file browser\r
+       if (isVisible('hrefbrowser'))\r
+               document.getElementById('href').style.width = '180px';\r
+\r
+       var formObj = document.forms[0];\r
+\r
+       for (var i=0; i<document.forms[0].target.options.length; i++) {\r
+               var option = document.forms[0].target.options[i];\r
+\r
+               if (option.value == tinyMCE.getWindowArg('target'))\r
+                       option.selected = true;\r
+       }\r
+\r
+       document.forms[0].href.value = tinyMCE.getWindowArg('href');\r
+       document.forms[0].linktitle.value = tinyMCE.getWindowArg('title');\r
+       document.forms[0].insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); \r
+\r
+       addClassesToList('styleSelect', 'theme_advanced_link_styles');\r
+       selectByValue(formObj, 'styleSelect', tinyMCE.getWindowArg('className'), true);\r
+\r
+       // Hide css select row if no CSS classes\r
+       if (formObj.styleSelect && formObj.styleSelect.options.length <= 1) {\r
+               var sr = document.getElementById('styleSelectRow');\r
+               sr.style.display = 'none';\r
+               sr.parentNode.removeChild(sr);\r
+       }\r
+\r
+       // Auto select link in list\r
+       if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {\r
+               var formObj = document.forms[0];\r
+\r
+               for (var i=0; i<formObj.link_list.length; i++) {\r
+                       if (formObj.link_list.options[i].value == tinyMCE.getWindowArg('href'))\r
+                               formObj.link_list.options[i].selected = true;\r
+               }\r
+       }\r
+}\r
+\r
+function checkPrefix(n) {\r
+       if (Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCE.getLang('lang_is_email')))\r
+               n.value = 'mailto:' + n.value;\r
+\r
+       if (/^\s*www./i.test(n.value) && confirm(tinyMCE.getLang('lang_is_external')))\r
+               n.value = 'http://' + n.value;\r
+}\r
+\r
+function insertLink() {\r
+       var href = document.forms[0].href.value;\r
+       var target = document.forms[0].target.options[document.forms[0].target.selectedIndex].value;\r
+       var title = document.forms[0].linktitle.value;\r
+       var style_class = document.forms[0].styleSelect ? document.forms[0].styleSelect.value : "";\r
+       var dummy;\r
+\r
+       if (target == '_self')\r
+               target = '';\r
+\r
+       tinyMCEPopup.restoreSelection();\r
+       tinyMCE.themes['advanced']._insertLink(href, target, title, dummy, style_class);\r
+       tinyMCEPopup.close();\r
+}\r
diff --git a/media/tiny_mce/themes/advanced/jscripts/source_editor.js b/media/tiny_mce/themes/advanced/jscripts/source_editor.js
new file mode 100755 (executable)
index 0000000..d0d517d
--- /dev/null
@@ -0,0 +1,59 @@
+function saveContent() {\r
+       tinyMCE.setContent(document.getElementById('htmlSource').value);\r
+       tinyMCE.closeWindow(window);\r
+}\r
+\r
+function onLoadInit() {\r
+       tinyMCEPopup.resizeToInnerSize();\r
+\r
+       // Remove Gecko spellchecking\r
+       if (tinyMCE.isGecko)\r
+               document.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");\r
+\r
+       document.getElementById('htmlSource').value = tinyMCE.getContent(tinyMCE.getWindowArg('editor_id'));\r
+\r
+       resizeInputs();\r
+\r
+       if (tinyMCE.getParam("theme_advanced_source_editor_wrap", true)) {\r
+               setWrap('soft');\r
+               document.getElementById('wraped').checked = true;\r
+       }\r
+}\r
+\r
+function setWrap(val) {\r
+       var s = document.getElementById('htmlSource');\r
+\r
+       s.wrap = val;\r
+\r
+       if (tinyMCE.isGecko || tinyMCE.isOpera) {\r
+               var v = s.value;\r
+               var n = s.cloneNode(false);\r
+               n.setAttribute("wrap", val);\r
+               s.parentNode.replaceChild(n, s);\r
+               n.value = v;\r
+       }\r
+}\r
+\r
+function toggleWordWrap(elm) {\r
+       if (elm.checked)\r
+               setWrap('soft');\r
+       else\r
+               setWrap('off');\r
+}\r
+\r
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;\r
+\r
+function resizeInputs() {\r
+       var el = document.getElementById('htmlSource');\r
+\r
+       if (!tinyMCE.isMSIE) {\r
+                wHeight = self.innerHeight - 60;\r
+                wWidth = self.innerWidth - 16;\r
+       } else {\r
+                wHeight = document.body.clientHeight - 60;\r
+                wWidth = document.body.clientWidth - 16;\r
+       }\r
+\r
+       el.style.height = Math.abs(wHeight) + 'px';\r
+       el.style.width  = Math.abs(wWidth) + 'px';\r
+}\r
diff --git a/media/tiny_mce/themes/advanced/langs/en.js b/media/tiny_mce/themes/advanced/langs/en.js
new file mode 100755 (executable)
index 0000000..8409e58
--- /dev/null
@@ -0,0 +1,93 @@
+// UK lang variables\r
+\r
+tinyMCE.addToLang('',{\r
+theme_style_select : '-- Styles --',\r
+theme_code_desc : 'Edit HTML Source',\r
+theme_code_title : 'HTML Source Editor',\r
+theme_code_wordwrap : 'Word wrap',\r
+theme_sub_desc : 'Subscript',\r
+theme_sup_desc : 'Superscript',\r
+theme_hr_desc : 'Insert horizontal ruler',\r
+theme_removeformat_desc : 'Remove formatting',\r
+theme_custom1_desc : 'Your custom description here',\r
+insert_image_border : 'Border',\r
+insert_image_dimensions : 'Dimensions',\r
+insert_image_vspace : 'Vertical space',\r
+insert_image_hspace : 'Horizontal space',\r
+insert_image_align : 'Alignment',\r
+insert_image_align_default : '-- Not set --',\r
+insert_image_align_baseline : 'Baseline',\r
+insert_image_align_top : 'Top',\r
+insert_image_align_middle : 'Middle',\r
+insert_image_align_bottom : 'Bottom',\r
+insert_image_align_texttop : 'TextTop',\r
+insert_image_align_absmiddle : 'Absolute Middle',\r
+insert_image_align_absbottom : 'Absolute Bottom',\r
+insert_image_align_left : 'Left',\r
+insert_image_align_right : 'Right',\r
+theme_font_size : '-- Font size --',\r
+theme_fontdefault : '-- Font family --',\r
+theme_block : '-- Format --',\r
+theme_paragraph : 'Paragraph',\r
+theme_div : 'Div',\r
+theme_address : 'Address',\r
+theme_pre : 'Preformatted',\r
+theme_h1 : 'Heading 1',\r
+theme_h2 : 'Heading 2',\r
+theme_h3 : 'Heading 3',\r
+theme_h4 : 'Heading 4',\r
+theme_h5 : 'Heading 5',\r
+theme_h6 : 'Heading 6',\r
+theme_blockquote : 'Blockquote',\r
+theme_code : 'Code',\r
+theme_samp : 'Code sample',\r
+theme_dt : 'Definition term ',\r
+theme_dd : 'Definition description',\r
+theme_colorpicker_title : 'Select a color',\r
+theme_colorpicker_apply : 'Apply',\r
+theme_forecolor_desc : 'Select text color',\r
+theme_backcolor_desc : 'Select background color',\r
+theme_charmap_title : 'Select custom character',\r
+theme_charmap_desc : 'Insert custom character',\r
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',\r
+insert_anchor_title : 'Insert/edit anchor',\r
+insert_anchor_name : 'Anchor name',\r
+theme_anchor_desc : 'Insert/edit anchor',\r
+theme_insert_link_titlefield : 'Title',\r
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',\r
+theme_path : 'Path',\r
+cut_desc : 'Cut',\r
+copy_desc : 'Copy',\r
+paste_desc : 'Paste',\r
+link_list : 'Link list',\r
+image_list : 'Image list',\r
+browse : 'Browse',\r
+image_props_desc : 'Image properties',\r
+newdocument_desc : 'New document',\r
+class_name : 'Class',\r
+newdocument : 'Are you sure you want clear all contents?',\r
+about_title : 'About TinyMCE',\r
+about : 'About',\r
+license : 'License',\r
+plugins : 'Plugins',\r
+plugin : 'Plugin',\r
+author : 'Author',\r
+version : 'Version',\r
+loaded_plugins : 'Loaded plugins',\r
+help : 'Help',\r
+not_set : '-- Not set --',\r
+close : 'Close',\r
+toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X',\r
+invalid_data : 'Error: Invalid values entered, these are marked in red.',\r
+more_colors : 'More colors',\r
+color_picker_tab : 'Picker',\r
+color_picker : 'Color picker',\r
+web_colors_tab : 'Palette',\r
+web_colors : 'Palette colors',\r
+named_colors_tab : 'Named',\r
+named_colors : 'Named colors',\r
+color : 'Color:',\r
+color_name : 'Name:',\r
+is_email : 'The URL you entered seems to be an email address, do you want to add the required mailto: prefix?',\r
+is_external : 'The URL you entered seems to external link, do you want to add the required http:// prefix?'\r
+});\r
diff --git a/media/tiny_mce/themes/advanced/link.htm b/media/tiny_mce/themes/advanced/link.htm
new file mode 100755 (executable)
index 0000000..b27af9b
--- /dev/null
@@ -0,0 +1,101 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <title>{$lang_insert_link_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/mctabs.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/form_utils.js"></script>\r
+       <script language="javascript" type="text/javascript" src="../../utils/validate.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/link.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body id="link" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">\r
+<form onsubmit="insertLink();return false;" action="#">\r
+       <div class="tabs">\r
+               <ul>\r
+                       <li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{$lang_insert_link_title}</a></span></li>\r
+               </ul>\r
+       </div>\r
+\r
+       <div class="panel_wrapper">\r
+               <div id="general_panel" class="panel current">\r
+\r
+               <table border="0" cellpadding="4" cellspacing="0">\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="href">{$lang_insert_link_url}</label></td>\r
+            <td><table border="0" cellspacing="0" cellpadding="0"> \r
+                                 <tr> \r
+                                       <td><input id="href" name="href" type="text" value="" style="width: 200px" onchange="checkPrefix(this);" /></td> \r
+                                       <td id="hrefbrowsercontainer">&nbsp;</td>\r
+                                 </tr> \r
+                               </table></td>\r
+          </tr>\r
+                 <!-- Link list -->\r
+                 <script language="javascript">\r
+                       if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {\r
+                               var html = "";\r
+\r
+                               html += '<tr><td><label for="link_list">{$lang_link_list}</label></td>';\r
+                               html += '<td><select id="link_list" name="link_list" style="width: 200px" onchange="this.form.href.value=this.options[this.selectedIndex].value;">';\r
+                               html += '<option value="">---</option>';\r
+\r
+                               for (var i=0; i<tinyMCELinkList.length; i++)\r
+                                       html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';\r
+\r
+                               html += '</select></td></tr>';\r
+\r
+                               document.write(html);\r
+                       }\r
+                 </script>\r
+                 <!-- /Link list -->\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="target">{$lang_insert_link_target}</label></td>\r
+            <td><select id="target" name="target" style="width: 200px">\r
+                <option value="_self">{$lang_insert_link_target_same}</option>\r
+                <option value="_blank">{$lang_insert_link_target_blank}</option>\r
+                               <script language="javascript">\r
+                                       var html = "";\r
+                                       var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';');\r
+\r
+                                       for (var i=0; i<targets.length; i++) {\r
+                                               var key, value;\r
+\r
+                                               if (targets[i] == "")\r
+                                                       continue;\r
+\r
+                                               key = targets[i].split('=')[0];\r
+                                               value = targets[i].split('=')[1];\r
+\r
+                                               html += '<option value="' + value + '">' + key + '</option>';\r
+                                       }\r
+\r
+                                       document.write(html);\r
+                               </script>\r
+            </select></td>\r
+          </tr>\r
+          <tr>\r
+            <td nowrap="nowrap"><label for="linktitle">{$lang_theme_insert_link_titlefield}</label></td>\r
+            <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px"></td>\r
+          </tr>\r
+          <tr id="styleSelectRow">\r
+            <td><label for="styleSelect">{$lang_class_name}</label></td>\r
+            <td>\r
+                        <select id="styleSelect" name="styleSelect">\r
+                <option value="" selected>{$lang_theme_style_select}</option>\r
+             </select></td>\r
+          </tr>\r
+        </table>\r
+               </div>\r
+       </div>\r
+\r
+       <div class="mceActionPanel">\r
+               <div style="float: left">\r
+                       <input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertLink();" />\r
+               </div>\r
+\r
+               <div style="float: right">\r
+                       <input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />\r
+               </div>\r
+       </div>\r
+</form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/themes/advanced/source_editor.htm b/media/tiny_mce/themes/advanced/source_editor.htm
new file mode 100755 (executable)
index 0000000..c3f80c4
--- /dev/null
@@ -0,0 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">\r
+<head>\r
+       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />\r
+       <title>{$lang_theme_code_title}</title>\r
+       <script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>\r
+       <script language="javascript" type="text/javascript" src="jscripts/source_editor.js"></script>\r
+       <base target="_self" />\r
+</head>\r
+<body onload="tinyMCEPopup.executeOnLoad('onLoadInit();');" onresize="resizeInputs();" style="display: none">\r
+       <form name="source" onsubmit="saveContent();" action="#">\r
+               <div style="float: left" class="title">{$lang_theme_code_title}</div>\r
+\r
+               <div id="wrapline" style="float: right">\r
+                       <input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{$lang_theme_code_wordwrap}</label>\r
+               </div>\r
+\r
+               <br style="clear: both" />\r
+\r
+               <textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,monospace; font-size: 12px" dir="ltr" wrap="off"></textarea>\r
+\r
+               <div class="mceActionPanel">\r
+                       <div style="float: left">\r
+                               <input type="button" name="insert" value="{$lang_update}" onclick="saveContent();" id="insert" />\r
+                       </div>\r
+\r
+                       <div style="float: right">\r
+                               <input type="button" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" id="cancel" />\r
+                       </div>\r
+               </div>\r
+       </form>\r
+</body>\r
+</html>\r
diff --git a/media/tiny_mce/themes/simple/css/editor_content.css b/media/tiny_mce/themes/simple/css/editor_content.css
new file mode 100755 (executable)
index 0000000..2506c80
--- /dev/null
@@ -0,0 +1,25 @@
+body, td, pre {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+body {\r
+       background-color: #FFFFFF;\r
+}\r
+\r
+.mceVisualAid {\r
+       border: 1px dashed #BBBBBB;\r
+}\r
+\r
+/* MSIE specific */\r
+\r
+* html body {\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5; \r
+}\r
diff --git a/media/tiny_mce/themes/simple/css/editor_popup.css b/media/tiny_mce/themes/simple/css/editor_popup.css
new file mode 100755 (executable)
index 0000000..f29b04a
--- /dev/null
@@ -0,0 +1,41 @@
+body {\r
+       background-color: #F0F0EE;\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+       scrollbar-3dlight-color: #F0F0EE;\r
+       scrollbar-arrow-color: #676662;\r
+       scrollbar-base-color: #F0F0EE;\r
+       scrollbar-darkshadow-color: #DDDDDD;\r
+       scrollbar-face-color: #E0E0DD;\r
+       scrollbar-highlight-color: #F0F0EE;\r
+       scrollbar-shadow-color: #F0F0EE;\r
+       scrollbar-track-color: #F5F5F5;\r
+}\r
+\r
+td {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 11px;\r
+}\r
+\r
+input {\r
+       background: #FFFFFF;\r
+       border: 1px solid #cccccc;\r
+}\r
+\r
+td, input, select, textarea {\r
+       font-family: Verdana, Arial, Helvetica, sans-serif;\r
+       font-size: 10px;\r
+}\r
+\r
+input, select, textarea {\r
+       border: 1px solid #808080;\r
+}\r
+\r
+.input_noborder {\r
+       border: 0;\r
+}\r
+\r
+.title {\r
+       font-size: 12px;\r
+       font-weight: bold;\r
+}
\ No newline at end of file
diff --git a/media/tiny_mce/themes/simple/css/editor_ui.css b/media/tiny_mce/themes/simple/css/editor_ui.css
new file mode 100755 (executable)
index 0000000..6f57768
--- /dev/null
@@ -0,0 +1,125 @@
+.mceSeparatorLine {\r
+       border: 0;\r
+       padding: 0;\r
+       margin-left: 4px;\r
+       margin-right: 2px;\r
+}\r
+\r
+.mceSelectList {\r
+       font-family: "MS Sans Serif";\r
+       font-size: 7pt;\r
+       font-weight: normal;\r
+       margin-top: 2px;\r
+}\r
+\r
+.mceLabel, .mceLabelDisabled {\r
+       font-family: "MS Sans Serif";\r
+       font-size: 9pt;\r
+}\r
+\r
+.mceLabel {\r
+       color: #000000;\r
+}\r
+\r
+.mceLabelDisabled {\r
+       cursor: text;\r
+       color: #999999;\r
+}\r
+\r
+.mceEditor {\r
+       background: #F0F0EE;\r
+       border: 1px solid #cccccc;\r
+}\r
+\r
+.mceEditorArea {\r
+       font-family: "MS Sans Serif";\r
+       background: #FFFFFF;\r
+}\r
+\r
+.mceToolbar {\r
+       background: #F0F0EE;\r
+       border-top: 1px solid #cccccc;\r
+       line-height: 1px;\r
+       font-size: 1px;\r
+       padding-bottom: 1px;\r
+}\r
+\r
+.mceEditorIframe {\r
+       border: 0;\r
+}\r
+\r
+/* Button CSS rules */\r
+\r
+a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img {\r
+       width: 20px;\r
+       height: 20px;\r
+       cursor: default;\r
+       margin-top: 1px;\r
+       margin-left: 1px;\r
+}\r
+\r
+a.mceButtonDisabled img {\r
+       border: 0 !important;\r
+}\r
+\r
+a.mceButtonNormal img, a.mceButtonSelected img {\r
+       border: 1px solid #F0F0EE !important;\r
+}\r
+\r
+a.mceButtonSelected img {\r
+       border: 1px solid #C0C0BB !important;\r
+}\r
+\r
+a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {\r
+       border: 1px solid #0A246A !important;\r
+       cursor: default;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+a.mceButtonDisabled img {\r
+       -moz-opacity:0.3;\r
+       opacity: 0.3;\r
+       border: 1px solid #F0F0EE !important;\r
+       cursor: default;\r
+}\r
+\r
+a.mceTiledButton img {\r
+       background-image: url('../images/buttons.gif');\r
+       background-repeat: no-repeat;\r
+}\r
+\r
+/* MSIE specific rules */\r
+\r
+* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img {\r
+       border: 0px !important;\r
+       margin-top: 2px;\r
+       margin-bottom: 1px;\r
+}\r
+\r
+* html a.mceButtonDisabled img {\r
+       filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);\r
+       border: 0px !important;\r
+}\r
+\r
+* html a.mceButtonDisabled {\r
+       border: 1px solid #F0F0EE !important;\r
+}\r
+\r
+* html a.mceButtonNormal, * html a.mceButtonSelected {\r
+       border: 1px solid #F0F0EE;\r
+       cursor: default;\r
+}\r
+\r
+* html a.mceButtonSelected {\r
+       border: 1px solid #C0C0BB;\r
+}\r
+\r
+* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover {\r
+       border: 1px solid #0A246A;\r
+       cursor: default;\r
+       background-color: #B6BDD2;\r
+}\r
+\r
+* html .mceSelectList {\r
+       margin-top: 2px;\r
+}\r
diff --git a/media/tiny_mce/themes/simple/editor_template.js b/media/tiny_mce/themes/simple/editor_template.js
new file mode 100755 (executable)
index 0000000..ef99fa2
--- /dev/null
@@ -0,0 +1 @@
+var TinyMCE_SimpleTheme={_buttonMap:'bold,bullist,cleanup,italic,numlist,redo,strikethrough,underline,undo',getEditorTemplate:function(){var html='';html+='<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}">';html+='<tr><td align="center">';html+='<span id="{$editor_id}">IFRAME</span>';html+='</td></tr>';html+='<tr><td class="mceToolbar" align="center" height="1">';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+='<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" />';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+='<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" />';html+=tinyMCE.getButtonHTML('cleanup','lang_cleanup_desc','{$themeurl}/images/cleanup.gif','mceCleanup');html+='<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" />';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+='</td></tr></table>';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/media/tiny_mce/themes/simple/editor_template_src.js b/media/tiny_mce/themes/simple/editor_template_src.js
new file mode 100755 (executable)
index 0000000..73a0df3
--- /dev/null
@@ -0,0 +1,84 @@
+/**\r
+ * $Id: editor_template_src.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+var TinyMCE_SimpleTheme = {\r
+       // List of button ids in tile map\r
+       _buttonMap : 'bold,bullist,cleanup,italic,numlist,redo,strikethrough,underline,undo',\r
+\r
+       getEditorTemplate : function() {\r
+               var html = '';\r
+\r
+               html += '<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}">';\r
+               html += '<tr><td align="center">';\r
+               html += '<span id="{$editor_id}">IFRAME</span>';\r
+               html += '</td></tr>';\r
+               html += '<tr><td class="mceToolbar" align="center" height="1">';\r
+               html += tinyMCE.getButtonHTML('bold', 'lang_bold_desc', '{$themeurl}/images/{$lang_bold_img}', 'Bold');\r
+               html += tinyMCE.getButtonHTML('italic', 'lang_italic_desc', '{$themeurl}/images/{$lang_italic_img}', 'Italic');\r
+               html += tinyMCE.getButtonHTML('underline', 'lang_underline_desc', '{$themeurl}/images/{$lang_underline_img}', 'Underline');\r
+               html += tinyMCE.getButtonHTML('strikethrough', 'lang_striketrough_desc', '{$themeurl}/images/strikethrough.gif', 'Strikethrough');\r
+               html += '<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" />';\r
+               html += tinyMCE.getButtonHTML('undo', 'lang_undo_desc', '{$themeurl}/images/undo.gif', 'Undo');\r
+               html += tinyMCE.getButtonHTML('redo', 'lang_redo_desc', '{$themeurl}/images/redo.gif', 'Redo');\r
+               html += '<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" />';\r
+               html += tinyMCE.getButtonHTML('cleanup', 'lang_cleanup_desc', '{$themeurl}/images/cleanup.gif', 'mceCleanup');\r
+               html += '<img src="{$themeurl}/images/separator.gif" width="2" height="20" class="mceSeparatorLine" />';\r
+               html += tinyMCE.getButtonHTML('bullist', 'lang_bullist_desc', '{$themeurl}/images/bullist.gif', 'InsertUnorderedList');\r
+               html += tinyMCE.getButtonHTML('numlist', 'lang_numlist_desc', '{$themeurl}/images/numlist.gif', 'InsertOrderedList');\r
+               html += '</td></tr></table>';\r
+\r
+               return {\r
+                       delta_width : 0,\r
+                       delta_height : 20,\r
+                       html : html\r
+               };\r
+       },\r
+\r
+       handleNodeChange : function(editor_id, node) {\r
+               // Reset old states\r
+               tinyMCE.switchClass(editor_id + '_bold', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_italic', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_underline', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonNormal');\r
+               tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonNormal');\r
+\r
+               // Handle elements\r
+               do {\r
+                       switch (node.nodeName.toLowerCase()) {\r
+                               case "b":\r
+                               case "strong":\r
+                                       tinyMCE.switchClass(editor_id + '_bold', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "i":\r
+                               case "em":\r
+                                       tinyMCE.switchClass(editor_id + '_italic', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "u":\r
+                                       tinyMCE.switchClass(editor_id + '_underline', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "strike":\r
+                                       tinyMCE.switchClass(editor_id + '_strikethrough', 'mceButtonSelected');\r
+                               break;\r
+                               \r
+                               case "ul":\r
+                                       tinyMCE.switchClass(editor_id + '_bullist', 'mceButtonSelected');\r
+                               break;\r
+\r
+                               case "ol":\r
+                                       tinyMCE.switchClass(editor_id + '_numlist', 'mceButtonSelected');\r
+                               break;\r
+                       }\r
+               } while ((node = node.parentNode) != null);\r
+       }\r
+};\r
+\r
+tinyMCE.addTheme("simple", TinyMCE_SimpleTheme);\r
+tinyMCE.addButtonMap(TinyMCE_SimpleTheme._buttonMap);\r
diff --git a/media/tiny_mce/themes/simple/images/bold.gif b/media/tiny_mce/themes/simple/images/bold.gif
new file mode 100755 (executable)
index 0000000..d6a9cc2
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/bold.gif differ
diff --git a/media/tiny_mce/themes/simple/images/bold_de_se.gif b/media/tiny_mce/themes/simple/images/bold_de_se.gif
new file mode 100755 (executable)
index 0000000..9b129de
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/bold_de_se.gif differ
diff --git a/media/tiny_mce/themes/simple/images/bold_fr.gif b/media/tiny_mce/themes/simple/images/bold_fr.gif
new file mode 100755 (executable)
index 0000000..2816454
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/bold_fr.gif differ
diff --git a/media/tiny_mce/themes/simple/images/bold_ru.gif b/media/tiny_mce/themes/simple/images/bold_ru.gif
new file mode 100755 (executable)
index 0000000..e000d46
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/bold_ru.gif differ
diff --git a/media/tiny_mce/themes/simple/images/bold_tw.gif b/media/tiny_mce/themes/simple/images/bold_tw.gif
new file mode 100755 (executable)
index 0000000..8208543
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/bold_tw.gif differ
diff --git a/media/tiny_mce/themes/simple/images/bullist.gif b/media/tiny_mce/themes/simple/images/bullist.gif
new file mode 100755 (executable)
index 0000000..6e19467
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/bullist.gif differ
diff --git a/media/tiny_mce/themes/simple/images/buttons.gif b/media/tiny_mce/themes/simple/images/buttons.gif
new file mode 100755 (executable)
index 0000000..9d86222
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/buttons.gif differ
diff --git a/media/tiny_mce/themes/simple/images/cleanup.gif b/media/tiny_mce/themes/simple/images/cleanup.gif
new file mode 100755 (executable)
index 0000000..16491f6
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/cleanup.gif differ
diff --git a/media/tiny_mce/themes/simple/images/italic.gif b/media/tiny_mce/themes/simple/images/italic.gif
new file mode 100755 (executable)
index 0000000..8bb330b
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/italic.gif differ
diff --git a/media/tiny_mce/themes/simple/images/italic_de_se.gif b/media/tiny_mce/themes/simple/images/italic_de_se.gif
new file mode 100755 (executable)
index 0000000..feb0309
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/italic_de_se.gif differ
diff --git a/media/tiny_mce/themes/simple/images/italic_ru.gif b/media/tiny_mce/themes/simple/images/italic_ru.gif
new file mode 100755 (executable)
index 0000000..a2bb69a
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/italic_ru.gif differ
diff --git a/media/tiny_mce/themes/simple/images/italic_tw.gif b/media/tiny_mce/themes/simple/images/italic_tw.gif
new file mode 100755 (executable)
index 0000000..4f6eeaa
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/italic_tw.gif differ
diff --git a/media/tiny_mce/themes/simple/images/numlist.gif b/media/tiny_mce/themes/simple/images/numlist.gif
new file mode 100755 (executable)
index 0000000..a268352
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/numlist.gif differ
diff --git a/media/tiny_mce/themes/simple/images/redo.gif b/media/tiny_mce/themes/simple/images/redo.gif
new file mode 100755 (executable)
index 0000000..3af9069
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/redo.gif differ
diff --git a/media/tiny_mce/themes/simple/images/separator.gif b/media/tiny_mce/themes/simple/images/separator.gif
new file mode 100755 (executable)
index 0000000..4f39b80
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/separator.gif differ
diff --git a/media/tiny_mce/themes/simple/images/spacer.gif b/media/tiny_mce/themes/simple/images/spacer.gif
new file mode 100755 (executable)
index 0000000..3884865
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/spacer.gif differ
diff --git a/media/tiny_mce/themes/simple/images/strikethrough.gif b/media/tiny_mce/themes/simple/images/strikethrough.gif
new file mode 100755 (executable)
index 0000000..3264635
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/strikethrough.gif differ
diff --git a/media/tiny_mce/themes/simple/images/underline.gif b/media/tiny_mce/themes/simple/images/underline.gif
new file mode 100755 (executable)
index 0000000..1dfeb5f
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/underline.gif differ
diff --git a/media/tiny_mce/themes/simple/images/underline_fr.gif b/media/tiny_mce/themes/simple/images/underline_fr.gif
new file mode 100755 (executable)
index 0000000..551d914
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/underline_fr.gif differ
diff --git a/media/tiny_mce/themes/simple/images/underline_ru.gif b/media/tiny_mce/themes/simple/images/underline_ru.gif
new file mode 100755 (executable)
index 0000000..b78e2a4
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/underline_ru.gif differ
diff --git a/media/tiny_mce/themes/simple/images/underline_tw.gif b/media/tiny_mce/themes/simple/images/underline_tw.gif
new file mode 100755 (executable)
index 0000000..b715390
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/underline_tw.gif differ
diff --git a/media/tiny_mce/themes/simple/images/undo.gif b/media/tiny_mce/themes/simple/images/undo.gif
new file mode 100755 (executable)
index 0000000..520796d
Binary files /dev/null and b/media/tiny_mce/themes/simple/images/undo.gif differ
diff --git a/media/tiny_mce/tiny_mce.js b/media/tiny_mce/tiny_mce.js
new file mode 100755 (executable)
index 0000000..ef60480
--- /dev/null
@@ -0,0 +1 @@
+function TinyMCE_Engine(){var ua;this.majorVersion="2";this.minorVersion="1.1.1";this.releaseDate="2007-05-14";this.instances=[];this.switchClassCache=[];this.windowArgs=[];this.loadedFiles=[];this.pendingFiles=[];this.loadingIndex=0;this.configs=[];this.currentConfig=0;this.eventHandlers=[];this.log=[];this.undoLevels=[];this.undoIndex=0;this.typingUndoIndex=-1;this.settings=[];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=window['opera']&&opera.buildNumber?true:false;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=[];this.themes=[];this.menus=[];this.loadedPlugins=[];this.buttonMap=[];this.isLoaded=false;if(this.isOpera){this.isMSIE=true;this.isGecko=false;this.isSafari=false}this.isIE=this.isMSIE;this.isRealIE=this.isMSIE&&!this.isOpera;this.idCounter=0};TinyMCE_Engine.prototype={init:function(settings){var theme,nl,baseHREF="",i,cssPath,entities,h,p,src,elements=[],head;if(this.isMSIE5_0)return;this.settings=settings;if(typeof(document.execCommand)=='undefined')return;if(!tinyMCE.baseURL){head=document.getElementsByTagName('head')[0];if(head){for(i=0,nl=head.getElementsByTagName('script');i<nl.length;i++)elements.push(nl[i])}for(i=0,nl=document.getElementsByTagName('script');i<nl.length;i++)elements.push(nl[i]);nl=document.getElementsByTagName('base');for(i=0;i<nl.length;i++){if(nl[i].href)baseHREF=nl[i].href}for(i=0;i<elements.length;i++){if(elements[i].src&&(elements[i].src.indexOf("tiny_mce.js")!=-1||elements[i].src.indexOf("tiny_mce_dev.js")!=-1||elements[i].src.indexOf("tiny_mce_src.js")!=-1||elements[i].src.indexOf("tiny_mce_gzip")!=-1)){src=elements[i].src;tinyMCE.srcMode=(src.indexOf('_src')!=-1||src.indexOf('_dev')!=-1)?'_src':'';tinyMCE.gzipMode=src.indexOf('_gzip')!=-1;src=src.substring(0,src.lastIndexOf('/'));if(settings.exec_mode=="src"||settings.exec_mode=="normal")tinyMCE.srcMode=settings.exec_mode=="src"?'_src':'';if(baseHREF!==''&&src.indexOf('://')==-1)tinyMCE.baseURL=baseHREF+src;else tinyMCE.baseURL=src;break}}}this.documentBasePath=document.location.href;if(this.documentBasePath.indexOf('?')!=-1)this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.indexOf('?'));this.documentURL=this.documentBasePath;this.documentBasePath=this.documentBasePath.substring(0,this.documentBasePath.lastIndexOf('/'));if(tinyMCE.baseURL.indexOf('://')==-1&&tinyMCE.baseURL.charAt(0)!='/'){tinyMCE.baseURL=this.documentBasePath+"/"+tinyMCE.baseURL}this._def("mode","none");this._def("theme","advanced");this._def("plugins","",true);this._def("language","en");this._def("docs_language",this.settings.language);this._def("elements","");this._def("textarea_trigger","mce_editable");this._def("editor_selector","");this._def("editor_deselector","mceNoEditor");this._def("valid_elements","+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],cite[title|id|class|style|dir|lang],abbr[title|id|class|style|dir|lang],acronym[title|id|class|style|dir|lang],del[title|id|class|style|dir|lang|datetime|cite],ins[title|id|class|style|dir|lang|datetime|cite]");this._def("extended_valid_elements","");this._def("invalid_elements","");this._def("encoding","");this._def("urlconverter_callback",tinyMCE.getParam("urlconvertor_callback","TinyMCE_Engine.prototype.convertURL"));this._def("save_callback","");this._def("force_br_newlines",false);this._def("force_p_newlines",true);this._def("add_form_submit_trigger",true);this._def("relative_urls",true);this._def("remove_script_host",true);this._def("focus_alert",true);this._def("document_base_url",this.documentURL);this._def("visual",true);this._def("visual_table_class","mceVisualAid");this._def("setupcontent_callback","");this._def("fix_content_duplication",true);this._def("custom_undo_redo",true);this._def("custom_undo_redo_levels",-1);this._def("custom_undo_redo_keyboard_shortcuts",true);this._def("custom_undo_redo_restore_selection",true);this._def("custom_undo_redo_global",false);this._def("verify_html",true);this._def("apply_source_formatting",false);this._def("directionality","ltr");this._def("cleanup_on_startup",false);this._def("inline_styles",false);this._def("convert_newlines_to_brs",false);this._def("auto_reset_designmode",true);this._def("entities","39,#39,160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,34,quot,38,amp,60,lt,62,gt,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro",true);this._def("entity_encoding","named");this._def("cleanup_callback","");this._def("add_unload_trigger",true);this._def("ask",false);this._def("nowrap",false);this._def("auto_resize",false);this._def("auto_focus",false);this._def("cleanup",true);this._def("remove_linebreaks",true);this._def("button_tile_map",false);this._def("submit_patch",true);this._def("browsers","msie,safari,gecko,opera",true);this._def("dialog_type","window");this._def("accessibility_warnings",true);this._def("accessibility_focus",true);this._def("merge_styles_invalid_parents","");this._def("force_hex_style_colors",true);this._def("trim_span_elements",true);this._def("convert_fonts_to_spans",false);this._def("doctype",'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');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",true);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);this._def("hide_selects_on_submit",true);this._def("forced_root_block",false);this._def("remove_trailing_nbsp",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;h=document.location.href;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|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';this.blockRegExp=new RegExp("^("+this.blockElms+")$","i");this.posKeyCodes=[13,45,36,35,33,34,37,38,39,40];this.uniqueURL='javascript:void(091039730);';this.uniqueTag='<div id="mceTMPElement" style="display: none">TMP</div>';this.callbacks=['onInit','getInfo','getEditorTemplate','setupContent','onChange','onPageLoad','handleNodeChange','initInstance','execCommand','getControlHTML','handleEvent','cleanup','removeInstance'];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)){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)){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(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);p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(i=0;i<p.length;i++){if(p[i].charAt(0)!='-')this.loadScript(tinyMCE.baseURL+'/plugins/'+p[i]+'/editor_plugin'+tinyMCE.srcMode+'.js')}}if(tinyMCE.getParam('entity_encoding')=='named'){settings.cleanup_entities=[];entities=tinyMCE.getParam('entities','',true,',');for(i=0;i<entities.length;i+=2)settings.cleanup_entities['c'+entities[i]]=entities[i+1]}settings.index=this.configs.length;this.configs[this.configs.length]=settings;this.loadNextScript();if(this.isIE&&!this.isOpera){try{document.execCommand('BackgroundImageCache',false,true)}catch(e){}}this.xmlEncodeRe=new RegExp('[<>&"]','g')},_addUnloadEvents:function(){var st=tinyMCE.settings.add_unload_trigger;if(tinyMCE.isIE){if(st){tinyMCE.addEvent(window,"unload",TinyMCE_Engine.prototype.unloadHandler);tinyMCE.addEvent(window.document,"beforeunload",TinyMCE_Engine.prototype.unloadHandler)}}else{if(st)tinyMCE.addEvent(window,"unload",function(){tinyMCE.triggerSave(true,true)})}},_def:function(key,def_val,t){var v=tinyMCE.getParam(key,def_val);v=t?v.replace(/\s+/g,""):v;this.settings[key]=v},hasPlugin:function(n){return typeof(this.plugins[n])!="undefined"&&this.plugins[n]!=null},addPlugin:function(n,p){var op=this.plugins[n];p.baseURL=op?op.baseURL:tinyMCE.baseURL+"/plugins/"+n;this.plugins[n]=p;this.loadNextScript()},setPluginBaseURL:function(n,u){var op=this.plugins[n];if(op)op.baseURL=u;else this.plugins[n]={baseURL:u}},loadPlugin:function(n,u){u=u.indexOf('.js')!=-1?u.substring(0,u.lastIndexOf('/')):u;u=u.charAt(u.length-1)=='/'?u.substring(0,u.length-1):u;this.plugins[n]={baseURL:u};this.loadScript(u+"/editor_plugin"+(tinyMCE.srcMode?'_src':'')+".js")},hasTheme:function(n){return typeof(this.themes[n])!="undefined"&&this.themes[n]!=null},addTheme:function(n,t){this.themes[n]=t;this.loadNextScript()},addMenu:function(n,m){this.menus[n]=m},hasMenu:function(n){return typeof(this.plugins[n])!="undefined"&&this.plugins[n]!=null},loadScript:function(url){var i;for(i=0;i<this.loadedFiles.length;i++){if(this.loadedFiles[i]==url)return}if(tinyMCE.settings.strict_loading_mode)this.pendingFiles[this.pendingFiles.length]=url;else document.write('<sc'+'ript language="javascript" type="text/javascript" src="'+url+'"></script>');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;},loadCSS:function(url){var ar=url.replace(/\s+/,'').split(',');var lflen=0,csslen=0,skip=false;var x=0,i=0,nl,le;for(x=0,csslen=ar.length;x<csslen;x++){if(ar[x]!=null&&ar[x]!='null'&&ar[x].length>0){for(i=0,lflen=this.loadedFiles.length;i<lflen;i++){if(this.loadedFiles[i]==ar[x]){skip=true;break}}if(!skip){if(tinyMCE.settings.strict_loading_mode){nl=document.getElementsByTagName("head");le=document.createElement('link');le.setAttribute('href',ar[x]);le.setAttribute('rel','stylesheet');le.setAttribute('type','text/css');nl[0].appendChild(le)}else document.write('<link href="'+ar[x]+'" rel="stylesheet" type="text/css" />');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<csslen;x++){css_file=css_ary[x];if(css_file!=null&&css_file!='null'&&css_file.length>0){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,n,inst,doc;formElement=document.getElementById(form_element_name);for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();if(inst.formElement==formElement){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;i<t.length;i++){if(t[i]!=ti)n.push(t[i])}tinyMCE.undoLevels=n;tinyMCE.undoIndex=n.length;tinyMCE.dispatchCallback(ti,'remove_instance_callback','removeInstance',ti);return ti},removeMCEControl:function(editor_id){var inst=tinyMCE.getInstanceById(editor_id),h,re,ot,tn;if(inst){inst.switchSettings();editor_id=inst.editorId;h=tinyMCE.getContent(editor_id);this.removeInstance(inst);tinyMCE.selectedElement=null;tinyMCE.selectedInstance=null;re=document.getElementById(editor_id+"_parent");ot=inst.oldTargetElement;tn=ot.nodeName.toLowerCase();if(tn=="textarea"||tn=="input"){re.parentNode.removeChild(re);ot.style.display="inline";ot.value=h}else{ot.innerHTML=h;ot.style.display='block';re.parentNode.insertBefore(ot,re);re.parentNode.removeChild(re)}}},triggerSave:function(skip_cleanup,skip_callback){var inst,n;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.triggerSave(skip_cleanup,skip_callback)}},resetForm:function(form_index){var i,inst,n,formObj=document.forms[form_index];for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();for(i=0;i<formObj.elements.length;i++){if(inst.formTargetElementId==formObj.elements[i].name)inst.getBody().innerHTML=inst.startContent}}},execInstanceCommand:function(editor_id,command,user_interface,value,focus){var inst=tinyMCE.getInstanceById(editor_id),r;if(inst){r=inst.selection.getRng();if(typeof(focus)=="undefined")focus=true;if(focus&&(!r||!r.item))inst.contentWindow.focus();inst.autoResetDesignMode();this.selectedElement=inst.getFocusElement();inst.select();tinyMCE.execCommand(command,user_interface,value);if(tinyMCE.isIE&&window.event!=null)tinyMCE.cancelEvent(window.event)}},execCommand:function(command,user_interface,value){var inst=tinyMCE.selectedInstance,n,pe,te;user_interface=user_interface?user_interface:false;value=value?value:null;if(inst)inst.switchSettings();switch(command){case"Undo":if(this.getParam('custom_undo_redo_global')){if(this.undoIndex>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':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"mceToggleEditor":inst=tinyMCE.getInstanceById(value);if(inst){pe=document.getElementById(inst.editorId+'_parent');te=inst.oldTargetElement;if(typeof(inst.enabled)=='undefined')inst.enabled=true;inst.enabled=!inst.enabled;if(!inst.enabled){pe.style.display='none';if(te.nodeName=='TEXTAREA'||te.nodeName=='INPUT')te.value=inst.getHTML();else te.innerHTML=inst.getHTML();te.style.display=inst.oldTargetDisplay;tinyMCE.dispatchCallback(inst,'hide_instance_callback','hideInstance',inst)}else{pe.style.display='block';te.style.display='none';if(te.nodeName=='TEXTAREA'||te.nodeName=='INPUT')inst.setHTML(te.value);else inst.setHTML(te.innerHTML);inst.useCSS=false;tinyMCE.dispatchCallback(inst,'show_instance_callback','showInstance',inst)}}else tinyMCE.addMCEControl(tinyMCE._getElementById(value),value);return;case"mceResetDesignMode":if(tinyMCE.isGecko){for(n in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[n]))continue;try{tinyMCE.instances[n].getDoc().designMode="off";tinyMCE.instances[n].getDoc().designMode="on";tinyMCE.instances[n].useCSS=false}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,doc=inst.getDoc(),head=doc.getElementsByTagName('head').item(0);var content=inst.startContent,contentElement,body;if(tinyMCE.settings.strict_loading_mode){content=content.replace(/&lt;/g,'<');content=content.replace(/&gt;/g,'>');content=content.replace(/&quot;/g,'"');content=content.replace(/&amp;/g,'&')}tinyMCE.selectedInstance=inst;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||!doc.body){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,'<h'+i+'>');inst.addShortcut('ctrl','7','','FormatBlock',false,'<p>');inst.addShortcut('ctrl','8','','FormatBlock',false,'<div>');inst.addShortcut('ctrl','9','','FormatBlock',false,'<address>');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","<br />","gi");content=tinyMCE.regexpReplace(content,"\r","<br />","gi");content=tinyMCE.regexpReplace(content,"\n","<br />","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;");body=inst.getBody();body.editorId=editor_id}content=tinyMCE.cleanupHTMLCode(content);if(!tinyMCE.isIE){contentElement=inst.getDoc().createElement("body");doc=inst.getDoc();contentElement.innerHTML=content;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);try{tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,inst.contentDocument,this.settings,inst.getBody()))}catch(e){}}else tinyMCE._setHTML(inst.getDoc(),content)}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})}},removeTinyMCEFormElements:function(form_obj){var i,elementId;if(!tinyMCE.getParam('hide_selects_on_submit'))return;if(typeof(form_obj)=="undefined"||form_obj==null)return;if(form_obj.nodeName!="FORM"){if(form_obj.form)form_obj=form_obj.form;else form_obj=tinyMCE.getParentElement(form_obj,"form")}if(form_obj==null)return;for(i=0;i<form_obj.elements.length;i++){elementId=form_obj.elements[i].name?form_obj.elements[i].name:form_obj.elements[i].id;if(elementId.indexOf('mce_editor_')==0)form_obj.elements[i].disabled=true}},handleEvent:function(e){var inst=tinyMCE.selectedInstance,i,elm,keys;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.formSubmit(tinyMCE.isMSIE?window.event.srcElement:e.target);return;case"reset":var formObj=tinyMCE.isIE?window.event.srcElement:e.target;for(i=0;i<document.forms.length;i++){if(document.forms[i]==formObj)window.setTimeout('tinyMCE.resetForm('+i+');',10)}return;case"keypress":if(inst&&inst.handleShortcut(e))return false;if(e.target.editorId){tinyMCE.instances[e.target.editorId].select()}else{if(e.target.ownerDocument.editorId)tinyMCE.instances[e.target.ownerDocument.editorId].select()}if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();if((tinyMCE.isGecko||tinyMCE.isOpera||tinyMCE.isSafari)&&tinyMCE.settings.force_p_newlines&&e.keyCode==13&&!e.shiftKey){if(TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance,e)){tinyMCE.execCommand("mceAddUndoLevel");return tinyMCE.cancelEvent(e)}}if((tinyMCE.isGecko&&!tinyMCE.isSafari)&&tinyMCE.settings.force_p_newlines&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance,e.type)){tinyMCE.execCommand("mceAddUndoLevel");return tinyMCE.cancelEvent(e)}}if(tinyMCE.isIE&&tinyMCE.settings.force_br_newlines&&e.keyCode==13){if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance){var sel=tinyMCE.selectedInstance.getDoc().selection;var rng=sel.createRange();if(tinyMCE.getParentElement(rng.parentElement(),"li")!=null)return false;e.returnValue=false;e.cancelBubble=true;rng.pasteHTML("<br />");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;case"keyup":case"keydown":tinyMCE.hideMenus();tinyMCE.hasMouseMoved=false;if(inst&&inst.handleShortcut(e))return false;inst._fixRootBlocks();if(inst.settings.remove_trailing_nbsp)inst._fixTrailingNbsp();if(e.target.editorId)tinyMCE.instances[e.target.editorId].select();if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();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;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){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="&nbsp;&nbsp;";else elm.innerHTML="&nbsp;"}}}keys=tinyMCE.posKeyCodes;var posKey=false;for(i=0;i<keys.length;i++){if(keys[i]==e.keyCode){posKey=true;break}}if(tinyMCE.isIE&&tinyMCE.settings.custom_undo_redo){keys=[8,46];for(i=0;i<keys.length;i++){if(keys[i]==e.keyCode){if(e.type=="keyup")tinyMCE.triggerNodeChange(false)}}}if(e.keyCode==17)return true;if(tinyMCE.isGecko){if(!posKey&&e.type=="keyup"&&!e.ctrlKey||(e.ctrlKey&&(e.keyCode==86||e.keyCode==88)))tinyMCE.execCommand("mceStartTyping")}else{if(!posKey&&e.type=="keyup")tinyMCE.execCommand("mceStartTyping")}if(e.type=="keydown"&&(posKey||e.ctrlKey)&&inst)inst.undoBookmark=inst.selection.getBookmark();if(e.type=="keyup"&&(posKey||e.ctrlKey))tinyMCE.execCommand("mceEndTyping");if(posKey&&e.type=="keyup")tinyMCE.triggerNodeChange(false);if(tinyMCE.isIE&&e.ctrlKey)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);break;case"mousedown":case"mouseup":case"click":case"dblclick":case"focus":tinyMCE.hideMenus();if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.switchSettings();tinyMCE.selectedInstance.isFocused=true}var targetBody=tinyMCE.getParentElement(e.target,"html");for(var instanceName in tinyMCE.instances){if(!tinyMCE.isInstance(tinyMCE.instances[instanceName]))continue;inst=tinyMCE.instances[instanceName];inst.autoResetDesignMode();if(inst.getBody().parentNode==targetBody){inst.select();tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"a");tinyMCE.imgElement=tinyMCE.getParentElement(tinyMCE.selectedElement,"img");break}}if(!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark&&(e.type=="mouseup"||e.type=="dblclick"))tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark=tinyMCE.selectedInstance.selection.getBookmark();if(e.type!="focus")tinyMCE.selectedNode=null;tinyMCE.triggerNodeChange(false);tinyMCE.execCommand("mceEndTyping");if(e.type=="mouseup")tinyMCE.execCommand("mceAddUndoLevel");if(!tinyMCE.selectedInstance&&e.target.editorId)tinyMCE.instances[e.target.editorId].select();return false}},getButtonHTML:function(id,lang,img,cmd,ui,val){var h='',m,x,io='';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.isRealIE)io='onmouseover="tinyMCE.lastHover = this;"';if(tinyMCE.getParam('button_tile_map')&&(!tinyMCE.isIE||tinyMCE.isOpera)&&(m=this.buttonMap[id])!=null&&(tinyMCE.getParam("language")=="en"||img.indexOf('$lang')==-1)){x=0-(m*20)==0?'0':0-(m*20);h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" '+io+' class="mceTiledButton mceButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="background-position: '+x+'px 0" alt="{$'+lang+'}" title="{$'+lang+'}" />';h+='</a>'}else{h+='<a id="{$editor_id}_'+id+'" href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" '+io+' class="mceButtonNormal" target="_self">';h+='<img src="'+img+'" alt="{$'+lang+'}" title="{$'+lang+'}" />';h+='</a>'}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+='<span id="{$editor_id}_'+id+'" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceTiledButton mceMenuButtonNormal" target="_self">';h+='<img src="{$themeurl}/images/spacer.gif" style="width: 20px; height: 20px; background-position: '+x+'px 0" title="{$'+lang+'}" /></a>';h+='<a href="javascript:'+mcmd+'" onclick="'+mcmd+'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>'}else{if(tinyMCE.isRealIE)h+='<span id="{$editor_id}_'+id+'" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';else h+='<span id="{$editor_id}_'+id+'" dir="ltr" class="mceMenuButton">';h+='<a href="javascript:'+cmd+'" onclick="'+cmd+'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';h+='<img src="'+img+'" title="{$'+lang+'}" /></a>';h+='<a href="javascript:'+mcmd+'" onclick="'+mcmd+'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$'+lang+'}" class="mceMenuButton" />';h+='</a></span>'}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<a.length;i++)this.buttonMap[a[i]]=i},formSubmit:function(f,p){var n,inst,found=false;if(f.form)f=f.form;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.formElement){if(f==inst.formElement.form){found=true;inst.isNotDirty=true}}}if(found){tinyMCE.removeTinyMCEFormElements(f);tinyMCE.triggerSave()}if(f.mceOldSubmit&&p)f.mceOldSubmit()},submitPatch:function(){tinyMCE.formSubmit(this,true)},onLoad:function(){var r,i,c,mode,trigger,elements,element,settings,elementId,elm;var selector,deselector,elementRefAr,form;if(tinyMCE.settings.strict_loading_mode&&this.loadingIndex!=-1){window.setTimeout('tinyMCE.onLoad();',1);return}if(tinyMCE.isRealIE&&window.event.type=="readystatechange"&&document.readyState!="complete")return true;if(tinyMCE.isLoaded)return true;tinyMCE.isLoaded=true;if(tinyMCE.isRealIE&&document.body&&window.location.href!=window.top.location.href){r=document.body.createTextRange();r.collapse(true);r.select()}tinyMCE.dispatchCallback(null,'onpageload','onPageLoad');for(c=0;c<tinyMCE.configs.length;c++){tinyMCE.settings=tinyMCE.configs[c];selector=tinyMCE.getParam("editor_selector");deselector=tinyMCE.getParam("editor_deselector");elementRefAr=[];if(document.forms&&tinyMCE.settings.add_form_submit_trigger&&!tinyMCE.submitTriggers){for(i=0;i<document.forms.length;i++){form=document.forms[i];tinyMCE.addEvent(form,"submit",TinyMCE_Engine.prototype.handleEvent);tinyMCE.addEvent(form,"reset",TinyMCE_Engine.prototype.handleEvent);tinyMCE.submitTriggers=true;if(tinyMCE.settings.submit_patch){try{form.mceOldSubmit=form.submit;form.submit=TinyMCE_Engine.prototype.submitPatch}catch(e){}}}}mode=tinyMCE.settings.mode;switch(mode){case"exact":elements=tinyMCE.getParam('elements','',true,',');for(i=0;i<elements.length;i++){element=tinyMCE._getElementById(elements[i]);trigger=element?element.getAttribute(tinyMCE.settings.textarea_trigger):"";if(new RegExp('\\b'+deselector+'\\b').test(tinyMCE.getAttrib(element,"class")))continue;if(trigger=="false")continue;if((tinyMCE.settings.ask||tinyMCE.settings.convert_on_click)&&element){elementRefAr[elementRefAr.length]=element;continue}if(element)tinyMCE.addMCEControl(element,elements[i])}break;case"specific_textareas":case"textareas":elements=document.getElementsByTagName("textarea");for(i=0;i<elements.length;i++){elm=elements.item(i);trigger=elm.getAttribute(tinyMCE.settings.textarea_trigger);if(selector!==''&&!new RegExp('\\b'+selector+'\\b').test(tinyMCE.getAttrib(elm,"class")))continue;if(selector!=='')trigger=selector!==''?"true":"";if(new RegExp('\\b'+deselector+'\\b').test(tinyMCE.getAttrib(elm,"class")))continue;if((mode=="specific_textareas"&&trigger=="true")||(mode=="textareas"&&trigger!="false"))elementRefAr[elementRefAr.length]=elm}break}for(i=0;i<elementRefAr.length;i++){element=elementRefAr[i];elementId=element.name?element.name:element.id;if(tinyMCE.settings.ask||tinyMCE.settings.convert_on_click){if(tinyMCE.isGecko){settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(e){window.setTimeout(function(){TinyMCE_Engine.prototype.confirmAdd(e,settings)},10)});if(element.nodeName!="TEXTAREA"&&element.nodeName!="INPUT")tinyMCE.addEvent(element,"click",function(e){window.setTimeout(function(){TinyMCE_Engine.prototype.confirmAdd(e,settings)},10)});}else{settings=tinyMCE.settings;tinyMCE.addEvent(element,"focus",function(){TinyMCE_Engine.prototype.confirmAdd(null,settings)});tinyMCE.addEvent(element,"click",function(){TinyMCE_Engine.prototype.confirmAdd(null,settings)});}}else tinyMCE.addMCEControl(element,elementId)}if(tinyMCE.settings.auto_focus){window.setTimeout(function(){var inst=tinyMCE.getInstanceById(tinyMCE.settings.auto_focus);inst.selection.selectNode(inst.getBody(),true,true);inst.contentWindow.focus()},100)}tinyMCE.dispatchCallback(null,'oninit','onInit')}},isInstance:function(o){return o!=null&&typeof(o)=="object"&&o.isTinyMCE_Control},getParam:function(name,default_value,strip_whitespace,split_chr){var i,outArray,value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");if(strip_whitespace)value=tinyMCE.regexpReplace(value,"[ \t\r\n]","");if(typeof(split_chr)!="undefined"&&split_chr!=null){value=value.split(split_chr);outArray=[];for(i=0;i<value.length;i++){if(value[i]&&value[i]!=='')outArray[outArray.length]=value[i]}value=outArray}return value},getLang:function(name,default_value,parse_entities,va){var v=(typeof(tinyMCELang[name])=="undefined")?default_value:tinyMCELang[name],n;if(parse_entities)v=tinyMCE.entityDecode(v);if(va){for(n in va)v=this.replaceVar(v,n,va[n])}return v},entityDecode:function(s){var e=document.createElement("div");e.innerHTML=s;return!e.firstChild?s:e.firstChild.nodeValue},addToLang:function(prefix,ar){var k;for(k in ar){if(typeof(ar[k])=='function')continue;tinyMCELang[(k.indexOf('lang_')==-1?'lang_':'')+(prefix!==''?(prefix+"_"):'')+k]=ar[k]}this.loadNextScript()},triggerNodeChange:function(focus,setup_content){var elm,inst,editorId,undoIndex=-1,undoLevels=-1,doc,anySelection=false,st;if(tinyMCE.selectedInstance){inst=tinyMCE.selectedInstance;elm=(typeof(setup_content)!="undefined"&&setup_content)?tinyMCE.selectedElement:inst.getFocusElement();editorId=inst.editorId;st=inst.selection.getSelectedText();if(tinyMCE.settings.auto_resize)inst.resizeToContent();if(setup_content&&tinyMCE.isGecko&&inst.isHidden())elm=inst.getBody();inst.switchSettings();if(tinyMCE.selectedElement)anySelection=(tinyMCE.selectedElement.nodeName.toLowerCase()=="img")||(st&&st.length>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,customCleanup;customCleanup=tinyMCE.settings.cleanup_callback;if(customCleanup!='')content=tinyMCE.resolveDots(tinyMCE.settings.cleanup_callback,window)(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;i<pl.length;i++){po=tinyMCE.plugins[pl[i]];if(po&&po.cleanup)content=po.cleanup(type,content,inst)}return content},setContent:function(h){if(tinyMCE.selectedInstance){tinyMCE.selectedInstance.execCommand('mceSetContent',false,h);tinyMCE.selectedInstance.repaint()}},importThemeLanguagePack:function(name){if(typeof(name)=="undefined")name=tinyMCE.settings.theme;tinyMCE.loadScript(tinyMCE.baseURL+'/themes/'+name+'/langs/'+tinyMCE.settings.language+'.js')},importPluginLanguagePack:function(name){var b=tinyMCE.baseURL+'/plugins/'+name;if(this.plugins[name])b=this.plugins[name].baseURL;tinyMCE.loadScript(b+'/langs/'+tinyMCE.settings.language+'.js')},applyTemplate:function(h,ag){return h.replace(new RegExp('\\{\\$([a-z0-9_]+)\\}','gi'),function(m,s){if(s.indexOf('lang_')==0&&tinyMCELang[s])return tinyMCELang[s];if(ag&&ag[s])return ag[s];if(tinyMCE.settings[s])return tinyMCE.settings[s];if(m=='themeurl')return tinyMCE.themeURL;return m})},replaceVar:function(h,r,v){return h.replace(new RegExp('{\\\$'+r+'}','g'),v)},openWindow:function(template,args){var html,width,height,x,y,resizable,scrollbars,url,name,win,modal,features;args=!args?{}:args;args.mce_template_file=template.file;args.mce_width=template.width;args.mce_height=template.height;tinyMCE.windowArgs=args;html=template.html;if(!(width=parseInt(template.width)))width=320;if(!(height=parseInt(template.height)))height=200;if(tinyMCE.isIE)height+=40;else height+=20;x=parseInt(screen.width/ 2.0) - (width /2.0);y=parseInt(screen.height/ 2.0) - (height /2.0);resizable=(args&&args.resizable)?args.resizable:"no";scrollbars=(args&&args.scrollbars)?args.scrollbars:"no";if(template.file.charAt(0)!='/'&&template.file.indexOf('://')==-1)url=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/"+template.file;else url=template.file;for(name in args){if(typeof(args[name])=='function')continue;url=tinyMCE.replaceVar(url,name,escape(args[name]))}if(html){html=tinyMCE.replaceVar(html,"css",this.settings.popups_css);html=tinyMCE.applyTemplate(html,args);win=window.open("","mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog=yes,minimizable="+resizable+",modal=yes,width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang.lang_popup_blocked);return}win.document.write(html);win.document.close();win.resizeTo(width,height);win.focus()}else{if((tinyMCE.isRealIE)&&resizable!='yes'&&tinyMCE.settings.dialog_type=="modal"){height+=10;features="resizable:"+resizable+";scroll:"+scrollbars+";status:yes;center:yes;help:no;dialogWidth:"+width+"px;dialogHeight:"+height+"px;";window.showModalDialog(url,window,features)}else{modal=(resizable=="yes")?"no":"yes";if(tinyMCE.isGecko&&tinyMCE.isMac)modal="no";if(template.close_previous!="no")try{tinyMCE.lastWindow.close()}catch(ex){}win=window.open(url,"mcePopup"+new Date().getTime(),"top="+y+",left="+x+",scrollbars="+scrollbars+",dialog="+modal+",minimizable="+resizable+",modal="+modal+",width="+width+",height="+height+",resizable="+resizable);if(win==null){alert(tinyMCELang.lang_popup_blocked);return}if(template.close_previous!="no")tinyMCE.lastWindow=win;try{win.resizeTo(width,height)}catch(e){}if(tinyMCE.isGecko){if(win.document.defaultView.statusbar.visible)win.resizeBy(0,tinyMCE.isMac?10:24)}win.focus()}}},closeWindow:function(win){win.close()},getVisualAidClass:function(class_name,state){var i,classNames,ar,className,aidClass=tinyMCE.settings.visual_table_class;if(typeof(state)=="undefined")state=tinyMCE.settings.visual;classNames=[];ar=class_name.split(' ');for(i=0;i<ar.length;i++){if(ar[i]==aidClass)ar[i]="";if(ar[i]!=='')classNames[classNames.length]=ar[i]}if(state)classNames[classNames.length]=aidClass;className="";for(i=0;i<classNames.length;i++){if(i>0)className+=" ";className+=classNames[i]}return className},handleVisualAid:function(el,deep,state,inst,skip_dispatch){var i,x,y,tableElement,anchorName,oldW,oldH,bo,cn;if(!el)return;if(!skip_dispatch)tinyMCE.dispatchCallback(inst,'handle_visual_aid_callback','handleVisualAid',el,deep,state,inst);tableElement=null;switch(el.nodeName){case"TABLE":oldW=el.style.width;oldH=el.style.height;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(y=0;y<el.rows.length;y++){for(x=0;x<el.rows[y].cells.length;x++){cn=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x],"class"),state&&bo);tinyMCE.setAttrib(el.rows[y].cells[x],"class",cn)}}break;case"A":anchorName=tinyMCE.getAttrib(el,"name");if(anchorName!==''&&state){el.title=anchorName;tinyMCE.addCSSClass(el,'mceItemAnchor')}else if(anchorName!==''&&!state)el.className='';break}if(deep&&el.hasChildNodes()){for(i=0;i<el.childNodes.length;i++)tinyMCE.handleVisualAid(el.childNodes[i],deep,state,inst,true)}},fixGeckoBaseHREFBug:function(m,e,h){var xsrc,xhref;if(tinyMCE.isGecko){if(m==1){h=h.replace(/\ssrc=/gi," mce_tsrc=");h=h.replace(/\shref=/gi," mce_thref=");return h}else{if(!new RegExp('(src|href)=','g').test(h))return h;tinyMCE.selectElements(e,'A,IMG,SELECT,AREA,IFRAME,BASE,INPUT,SCRIPT,EMBED,OBJECT,LINK',function(n){xsrc=tinyMCE.getAttrib(n,"mce_tsrc");xhref=tinyMCE.getAttrib(n,"mce_thref");if(xsrc!==''){try{n.src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,xsrc)}catch(e){}n.removeAttribute("mce_tsrc")}if(xhref!==''){try{n.href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,xhref)}catch(e){}n.removeAttribute("mce_thref")}return false});tinyMCE.selectNodes(e,function(n){if(n.nodeType==3||n.nodeType==8){n.nodeValue=n.nodeValue.replace(/\smce_tsrc=/gi," src=");n.nodeValue=n.nodeValue.replace(/\smce_thref=/gi," href=")}return false})}}return h},_setHTML:function(doc,html_content){var i,html,paras,node;html_content=tinyMCE.cleanupHTMLCode(html_content);try{tinyMCE.setInnerHTML(doc.body,html_content)}catch(e){if(this.isMSIE)doc.body.createTextRange().pasteHTML(html_content)}if(tinyMCE.isIE&&tinyMCE.settings.fix_content_duplication){paras=doc.getElementsByTagName("P");for(i=0;i<paras.length;i++){node=paras[i];while((node=node.parentNode)!=null){if(node.nodeName=="P")node.outerHTML=node.innerHTML}}html=doc.body.innerHTML;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],n;if(!inst){for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.formTargetElementId==editor_id)return inst}}else return inst;return null},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 i,c,x,rule,styles,rules,csses,selectorText,inst=tinyMCE.getInstanceById(editor_id);var cssClass,addClass,p;if(!inst)inst=tinyMCE.selectedInstance;if(!inst)return[];if(!doc)doc=inst.getDoc();if(inst&&inst.cssClasses.length>0)return inst.cssClasses;if(!doc)return;styles=doc.styleSheets;if(styles&&styles.length>0){for(x=0;x<styles.length;x++){csses=null;try{csses=tinyMCE.isIE?doc.styleSheets(x).rules:styles[x].cssRules}catch(e){}if(!csses)return[];for(i=0;i<csses.length;i++){selectorText=csses[i].selectorText;if(selectorText){rules=selectorText.split(',');for(c=0;c<rules.length;c++){rule=rules[c];while(rule.indexOf(' ')==0)rule=rule.substring(1);if(rule.indexOf(' ')!=-1||rule.indexOf(':')!=-1||rule.indexOf('mceItem')!=-1)continue;if(rule.indexOf(tinyMCE.settings.visual_table_class)!=-1||rule.indexOf('mceEditable')!=-1||rule.indexOf('mceNonEditable')!=-1)continue;if(rule.indexOf('.')!=-1){cssClass=rule.substring(rule.indexOf('.')+1);addClass=true;for(p=0;p<inst.cssClasses.length&&addClass;p++){if(inst.cssClasses[p]==cssClass)addClass=false}if(addClass)inst.cssClasses[inst.cssClasses.length]=cssClass}}}}}}return inst.cssClasses},regexpReplace:function(in_str,reg_exp,replace_str,opts){var re;if(in_str==null)return in_str;if(typeof(opts)=="undefined")opts='g';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,rtl=tinyMCE.getLang('lang_dir')=='rtl';l=tinyMCE.plugins;for(n in l){o=l[n];if(o.getControlHTML&&(v=o.getControlHTML(c))!==''){if(rtl)return'<span dir="rtl">'+tinyMCE.replaceVar(v,"pluginurl",o.baseURL)+'</span>';return tinyMCE.replaceVar(v,"pluginurl",o.baseURL)}}o=tinyMCE.themes[tinyMCE.settings.theme];if(o.getControlHTML&&(v=o.getControlHTML(c))!==''){if(rtl)return'<span dir="rtl">'+v+'</span>';return v}return''},evalFunc:function(f,idx,a,o){o=!o?window:o;f=typeof(f)=='function'?f:o[f];return f.apply(o,Array.prototype.slice.call(a,idx))},dispatchCallback:function(i,p,n){return this.callFunc(i,p,n,0,this.dispatchCallback.arguments)},executeCallback:function(i,p,n){return this.callFunc(i,p,n,1,this.executeCallback.arguments)},execCommandCallback:function(i,p,n){return this.callFunc(i,p,n,2,this.execCommandCallback.arguments)},callFunc:function(ins,p,n,m,a){var l,i,on,o,s,v;s=m==2;l=tinyMCE.getParam(p,'');if(l!==''&&(v=tinyMCE.evalFunc(l,3,a))==s&&m>0)return true;if(ins!=null){for(i=0,l=ins.plugins;i<l.length;i++){o=tinyMCE.plugins[l[i]];if(o[n]&&(v=tinyMCE.evalFunc(n,3,a,o))==s&&m>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},resolveDots:function(s,o){var i;if(typeof(s)=='string'){for(i=0,s=s.split('.');i<s.length;i++)o=o[s[i]]}else o=s;return o},xmlEncode:function(s){return s?(''+s).replace(this.xmlEncodeRe,function(c,b){switch(c){case'&':return'&amp;';case'"':return'&quot;';case'<':return'&lt;';case'>':return'&gt;'}return c}):s},add:function(c,m){var n;for(n in m)c.prototype[n]=m[n]},extend:function(p,np){var o={},n;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,tos,fu,p,x,fn,fu,pn,s=settings;this.undoRedoLevel=true;this.isTinyMCE_Control=true;this.enabled=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=[];this.hasMouseMoved=false;this.foreColor=this.backColor="#999999";this.data={};this.cssClasses=[];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,indent:s.apply_source_formatting,invalid_elements:s.invalid_elements,verify_html:s.verify_html,fix_content_duplication:s.fix_content_duplication,convert_fonts_to_spans:s.convert_fonts_to_spans});t=this.settings.theme;if(!tinyMCE.hasTheme(t)){fn=tinyMCE.callbacks;tos={};for(i=0;i<fn.length;i++){if((fu=window['TinyMCE_'+t+"_"+fn[i]]))tos[fn[i]]=fu}tinyMCE.addTheme(t,tos)}this.plugins=[];p=tinyMCE.getParam('plugins','',true,',');if(p.length>0){for(i=0;i<p.length;i++){pn=p[i];if(pn.charAt(0)=='-')pn=pn.substring(1);if(!tinyMCE.hasPlugin(pn)){fn=tinyMCE.callbacks;tos={};for(x=0;x<fn.length;x++){if((fu=window['TinyMCE_'+pn+"_"+fn[x]]))tos[fn[x]]=fu}tinyMCE.addPlugin(pn,tos)}this.plugins[this.plugins.length]=pn}}};TinyMCE_Control.prototype={selection:null,settings:null,cleanup:null,getData:function(na){var o=this.data[na];if(!o)o=this.data[na]={};return o},hasPlugin:function(n){var i;for(i=0;i<this.plugins.length;i++){if(this.plugins[i]==n)return true}return false},addPlugin:function(n,p){if(!this.hasPlugin(n)){tinyMCE.addPlugin(n,p);this.plugins[this.plugins.length]=n}},repaint:function(){var s,b,ex;if(tinyMCE.isRealIE)return;try{s=this.selection;b=s.getBookmark(true);this.getBody().style.display='none';this.getDoc().execCommand('selectall',false,null);this.getSel().collapseToStart();this.getBody().style.display='block';s.moveToBookmark(b)}catch(ex){}},switchSettings:function(){if(tinyMCE.configs.length>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.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<scl.length;i++){if(sc.alt==scl[i].alt&&sc.ctrl==scl[i].ctrl&&sc.shift==scl[i].shift&&sc.charCode==scl[i].charCode&&sc.keyCode==scl[i].keyCode){return false}}scl[scl.length]=sc;return true},handleShortcut:function(e){var i,s,o;if(!e.altKey&&!e.ctrlKey)return false;s=this.shortcuts;for(i=0;i<s.length;i++){o=s[i];if(o.alt==e.altKey&&o.ctrl==e.ctrlKey&&(o.keyCode==e.keyCode||o.charCode==e.charCode)){if(o.cmd&&(e.type=="keydown"||(e.type=="keypress"&&!tinyMCE.isOpera)))tinyMCE.execCommand(o.cmd,o.ui,o.val);tinyMCE.cancelEvent(e);return true}}return false},autoResetDesignMode:function(){if(!tinyMCE.isIE&&this.isHidden()&&tinyMCE.getParam('auto_reset_designmode'))eval('try { this.getDoc().designMode = "On"; this.useCSS = false; } catch(e) {}')},isHidden:function(){var s;if(tinyMCE.isIE)return false;s=this.getSel();return(!s||!s.rangeCount||s.rangeCount==0)},isDirty:function(){return tinyMCE.trim(this.startContent)!=tinyMCE.trim(this.getBody().innerHTML)&&!this.isNotDirty},_mergeElements:function(scmd,pa,ch,override){var st,stc,className,n;if(scmd=="removeformat"){pa.className="";pa.style.cssText="";ch.className="";ch.style.cssText="";return}st=tinyMCE.parseStyle(tinyMCE.getAttrib(pa,"style"));stc=tinyMCE.parseStyle(tinyMCE.getAttrib(ch,"style"));className=tinyMCE.getAttrib(pa,"class");className=tinyMCE.getAttrib(ch,"class");if(override){for(n in st){if(typeof(st[n])=='function')continue;stc[n]=st[n]}}else{for(n in stc){if(typeof(stc[n])=='function')continue;st[n]=stc[n]}}tinyMCE.setAttrib(pa,"style",tinyMCE.serializeStyle(st));tinyMCE.setAttrib(pa,"class",tinyMCE.trim(className));ch.className="";ch.style.cssText="";ch.removeAttribute("class");ch.removeAttribute("style")},_fixRootBlocks:function(){var rb,b,ne,be,nx,bm;rb=tinyMCE.getParam('forced_root_block');if(!rb)return;b=this.getBody();ne=b.firstChild;while(ne){nx=ne.nextSibling;if(ne.nodeType==3||!tinyMCE.blockRegExp.test(ne.nodeName)){if(!bm)bm=this.selection.getBookmark();if(!be){be=this.getDoc().createElement(rb);be.appendChild(ne.cloneNode(true));b.replaceChild(be,ne)}else{be.appendChild(ne.cloneNode(true));b.removeChild(ne)}}else be=null;ne=nx}if(bm)this.selection.moveToBookmark(bm)},_fixTrailingNbsp:function(){var s=this.selection,e=s.getFocusElement(),bm,v;if(e&&tinyMCE.blockRegExp.test(e.nodeName)&&e.firstChild){v=e.firstChild.nodeValue;if(v&&v.length>1&&/(^\u00a0|\u00a0$)/.test(v)){e.firstChild.nodeValue=v.replace(/(^\u00a0|\u00a0$)/,'');s.selectNode(e.firstChild,true,false,false);}}},_setUseCSS:function(b){var d=this.getDoc();try{d.execCommand("useCSS",false,!b)}catch(ex){}try{d.execCommand("styleWithCSS",false,b)}catch(ex){}if(!tinyMCE.getParam("table_inline_editing"))try{d.execCommand('enableInlineTableEditing',false,"false")}catch(ex){}if(!tinyMCE.getParam("object_resizing"))try{d.execCommand('enableObjectResizing',false,"false")}catch(ex){}},execCommand:function(command,user_interface,value){var i,x,z,align,img,div,doc=this.getDoc(),win=this.getWin(),focusElm=this.getFocusElement();if(!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel','gi').test(command))this.undoBookmark=null;if(!tinyMCE.isIE&&!this.useCSS){this._setUseCSS(false);this.useCSS=true}this.contentDocument=doc;if(!/mceStartTyping|mceEndTyping/.test(command)){if(tinyMCE.execCommandCallback(this,'execcommand_callback','execCommand',this.editorId,this.getBody(),command,user_interface,value))return}if(focusElm&&focusElm.nodeName=="IMG"){align=focusElm.getAttribute('align');img=command=="JustifyCenter"?focusElm.cloneNode(false):focusElm;switch(command){case"JustifyLeft":if(align=='left')img.removeAttribute('align');else img.setAttribute('align','left');div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case"JustifyCenter":img.removeAttribute('align');div=tinyMCE.getParentElement(focusElm,"div");if(div&&div.style.textAlign=="center"){if(div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div)}else{div=this.getDoc().createElement("div");div.style.textAlign='center';div.appendChild(img);focusElm.parentNode.replaceChild(div,focusElm)}this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case"JustifyRight":if(align=='right')img.removeAttribute('align');else img.setAttribute('align','right');div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selection.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return}}if(tinyMCE.settings.force_br_newlines){var alignValue="";if(doc.selection.type!="Control"){switch(command){case"JustifyLeft":alignValue="left";break;case"JustifyCenter":alignValue="center";break;case"JustifyFull":alignValue="justify";break;case"JustifyRight":alignValue="right";break}if(alignValue!==''){var rng=doc.selection.createRange();if((divElm=tinyMCE.getParentElement(rng.parentElement(),"div"))!=null)divElm.setAttribute("align",alignValue);else if(rng.pasteHTML&&rng.htmlText.length>0)rng.pasteHTML('<div align="'+alignValue+'">'+rng.htmlText+"</div>");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"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(!this.cleanup.isValid(value))return true;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,'<p>');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(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"mceSetStyleInfo":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|img','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,[],1);for(z=0;z<ch.length;z++){if(ch[z]==parentElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','')}}}else{this._setUseCSS(false);doc.execCommand("FontName",false,"#mce_temp_font#");var elementArray=tinyMCE.getElementsByAttributeValue(this.getBody(),"font","face","#mce_temp_font#");for(x=0;x<elementArray.length;x++){elm=elementArray[x];if(elm){var spanElm=doc.createElement(wrapper);if(scmd=="setstyle")tinyMCE.setStyleAttrib(spanElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(spanElm,sname,svalue);if(scmd=="removeformat"){spanElm.style.cssText='';tinyMCE.setAttrib(spanElm,'class','')}if(elm.hasChildNodes()){for(i=0;i<elm.childNodes.length;i++)spanElm.appendChild(elm.childNodes[i].cloneNode(true))}spanElm.setAttribute("mce_new","true");elm.parentNode.replaceChild(spanElm,elm);var ch=tinyMCE.getNodeTree(spanElm,[],1);for(z=0;z<ch.length;z++){if(ch[z]==spanElm)continue;if(scmd=="setstyle")tinyMCE.setStyleAttrib(ch[z],sname,'');if(scmd=="setattrib")tinyMCE.setAttrib(ch[z],sname,'');if(scmd=="removeformat"){ch[z].style.cssText='';tinyMCE.setAttrib(ch[z],'class','')}}}}}var nodes=doc.getElementsByTagName(wrapper);for(i=nodes.length-1;i>=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(i=nodes.length-1;i>=0;i--){var elm=nodes[i],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('<span>','gi').test(tmp.innerHTML)){for(x=0;x<elm.childNodes.length;x++){if(elm.parentNode!=null)elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true),elm)}elm.parentNode.removeChild(elm)}}if(scmd=="removeformat")tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case"FontName":if(value==null){var s=this.getSel();if(tinyMCE.isGecko&&s.isCollapsed){var f=tinyMCE.getParentElement(this.getFocusElement(),"font");if(f!=null)this.selection.selectNode(f,false)}this.getDoc().execCommand("RemoveFormat",false,null);if(f!=null&&tinyMCE.isGecko){var r=this.getRng().cloneRange();r.collapse(true);s.removeAllRanges();s.addRange(r)}}else this.getDoc().execCommand('FontName',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case"FontSize":this.getDoc().execCommand('FontSize',false,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);return;case"forecolor":value=value==null?this.foreColor:value;value=tinyMCE.trim(value);value=value.charAt(0)!='#'?(isNaN('0x'+value)?value:'#'+value):value;this.foreColor=value;this.getDoc().execCommand('forecolor',false,value);break;case"HiliteColor":value=value==null?this.backColor:value;value=tinyMCE.trim(value);value=value.charAt(0)!='#'?(isNaN('0x'+value)?value:'#'+value):value;this.backColor=value;if(tinyMCE.isGecko){this._setUseCSS(true);this.getDoc().execCommand('hilitecolor',false,value);this._setUseCSS(false)}else this.getDoc().execCommand('BackColor',false,value);break;case"Cut":case"Copy":case"Paste":var cmdFailed=false;eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');if(tinyMCE.isOpera&&cmdFailed)alert('Currently not supported by your browser, use keyboard shortcuts instead.');if(tinyMCE.isGecko&&cmdFailed){if(confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_clipboard_msg'))))window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');return}else tinyMCE.triggerNodeChange();break;case"mceSetContent":if(!value)value="";value=tinyMCE.storeAwayURLs(value);value=tinyMCE._customCleanup(this,"insert_to_editor",value);if(this.getBody().nodeName=='BODY')tinyMCE._setHTML(doc,value);else this.getBody().innerHTML=value;tinyMCE.setInnerHTML(this.getBody(),tinyMCE._cleanupHTML(this,doc,this.settings,this.getBody(),false,false,false,true));tinyMCE.convertAllRelativeURLs(this.getBody());tinyMCE._removeInternal(this.getBody());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE._setEventsEnabled(this.getBody(),false);this._addBogusBR();return true;case"mceCleanup":var b=this.selection.getBookmark();tinyMCE._setHTML(this.contentDocument,this.getBody().innerHTML);tinyMCE.setInnerHTML(this.getBody(),tinyMCE._cleanupHTML(this,this.contentDocument,this.settings,this.getBody(),this.visualAid));tinyMCE.convertAllRelativeURLs(doc.body);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE._setEventsEnabled(this.getBody(),false);this._addBogusBR();this.repaint();this.selection.moveToBookmark(b);tinyMCE.triggerNodeChange();break;case"mceReplaceContent":if(!value)value='';this.getWin().focus();var selectedText="";if(tinyMCE.isIE){var rng=doc.selection.createRange();selectedText=rng.text}else selectedText=this.getSel().toString();if(selectedText.length>0){value=tinyMCE.replaceVar(value,"selection",selectedText);tinyMCE.execCommand('mceInsertContent',false,value)}this._addBogusBR();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("mceSetStyleInfo",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(/(&#38;|&#160;|&#60;|&#62;)/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{value=doc.createTextNode(tinyMCE.entityDecode(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('<!--')!=-1;if(c)value=tinyMCE.uniqueTag+value;if(rng.item)rng.item(0).outerHTML=value;else rng.pasteHTML(value);if(c){var e=this.getDoc().getElementById('mceTMPElement');e.parentNode.removeChild(e)}}tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange();break;case"mceStartTyping":if(tinyMCE.settings.custom_undo_redo&&this.undoRedo.typingUndoIndex==-1){this.undoRedo.typingUndoIndex=this.undoRedo.undoIndex;tinyMCE.typingUndoIndex=tinyMCE.undoIndex;this.execCommand('mceAddUndoLevel')}break;case"mceEndTyping":if(tinyMCE.settings.custom_undo_redo&&this.undoRedo.typingUndoIndex!=-1){this.execCommand('mceAddUndoLevel');this.undoRedo.typingUndoIndex=-1}tinyMCE.typingUndoIndex=-1;break;case"mceBeginUndoLevel":this.undoRedoLevel=false;break;case"mceEndUndoLevel":this.undoRedoLevel=true;this.execCommand('mceAddUndoLevel');break;case"mceAddUndoLevel":if(tinyMCE.settings.custom_undo_redo&&this.undoRedoLevel){if(this.undoRedo.add())tinyMCE.triggerNodeChange(false)}break;case"Undo":if(tinyMCE.settings.custom_undo_redo){tinyMCE.execCommand("mceEndTyping");this.undoRedo.undo();tinyMCE.triggerNodeChange()}else this.getDoc().execCommand(command,user_interface,value);break;case"Redo":if(tinyMCE.settings.custom_undo_redo){tinyMCE.execCommand("mceEndTyping");this.undoRedo.redo();tinyMCE.triggerNodeChange()}else this.getDoc().execCommand(command,user_interface,value);break;case"mceToggleVisualAid":this.visualAid=!this.visualAid;tinyMCE.handleVisualAid(this.getBody(),true,this.visualAid,this);tinyMCE.triggerNodeChange();break;case"Indent":this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();if(tinyMCE.isIE){var n=tinyMCE.getParentElement(this.getFocusElement(),"blockquote");do{if(n&&n.nodeName=="BLOCKQUOTE"){n.removeAttribute("dir");n.removeAttribute("style")}}while(n!=null&&(n=n.parentNode)!=null)}break;case"RemoveFormat":case"removeformat":var text=this.selection.getSelectedText();if(tinyMCE.isOpera){this.getDoc().execCommand("RemoveFormat",false,null);return}if(tinyMCE.isIE){try{var rng=doc.selection.createRange();rng.execCommand("RemoveFormat",false,null)}catch(e){}this.execCommand("mceSetStyleInfo",false,{command:"removeformat"})}else{this.getDoc().execCommand(command,user_interface,value);this.execCommand("mceSetStyleInfo",false,{command:"removeformat"})}if(text.length==0)this.execCommand("mceSetCSSClass",false,"");tinyMCE.triggerNodeChange();break;default:this.getDoc().execCommand(command,user_interface,value);if(tinyMCE.isGecko)window.setTimeout('tinyMCE.triggerNodeChange(false);',1);else tinyMCE.triggerNodeChange()}if(command!="mceAddUndoLevel"&&command!="Undo"&&command!="Redo"&&command!="mceStartTyping"&&command!="mceEndTyping")tinyMCE.execCommand("mceAddUndoLevel")},queryCommandValue:function(c){try{return this.getDoc().queryCommandValue(c)}catch(e){return null}},queryCommandState:function(c){return this.getDoc().queryCommandState(c)},_addBogusBR:function(){var b=this.getBody();if(tinyMCE.isGecko&&!b.hasChildNodes())b.innerHTML='<br _moz_editor_bogus_node="TRUE" />'},_onAdd:function(replace_element,form_element_name,target_document){var hc,th,tos,editorTemplate,targetDoc,deltaWidth,deltaHeight,html,rng,fragment;var dynamicIFrame,tElm,doc,parentElm;th=this.settings.theme;tos=tinyMCE.themes[th];targetDoc=target_document?target_document:document;this.targetDoc=targetDoc;tinyMCE.themeURL=tinyMCE.baseURL+"/themes/"+this.settings.theme;this.settings.themeurl=tinyMCE.themeURL;if(!replace_element){alert("Error: Could not find the target element.");return false}if(tos.getEditorTemplate)editorTemplate=tos.getEditorTemplate(this.settings,this.editorId);deltaWidth=editorTemplate.delta_width?editorTemplate.delta_width:0;deltaHeight=editorTemplate.delta_height?editorTemplate.delta_height:0;html='<span id="'+this.editorId+'_parent" class="mceEditorContainer">'+editorTemplate.html;html=tinyMCE.replaceVar(html,"editor_id",this.editorId);if(!this.settings.default_document)this.settings.default_document=tinyMCE.baseURL+"/blank.htm";this.settings.old_width=this.settings.width;this.settings.old_height=this.settings.height;if(this.settings.width==-1)this.settings.width=replace_element.offsetWidth;if(this.settings.height==-1)this.settings.height=replace_element.offsetHeight;if(this.settings.width==0)this.settings.width=replace_element.style.width;if(this.settings.height==0)this.settings.height=replace_element.style.height;if(this.settings.width==0)this.settings.width=320;if(this.settings.height==0)this.settings.height=240;this.settings.area_width=parseInt(this.settings.width);this.settings.area_height=parseInt(this.settings.height);this.settings.area_width+=deltaWidth;this.settings.area_height+=deltaHeight;this.settings.width_style=""+this.settings.width;this.settings.height_style=""+this.settings.height;if((""+this.settings.width).indexOf('%')!=-1)this.settings.area_width="100%";else this.settings.width_style+='px';if((""+this.settings.height).indexOf('%')!=-1)this.settings.area_height="100%";else this.settings.height_style+='px';if((""+replace_element.style.width).indexOf('%')!=-1){this.settings.width=replace_element.style.width;this.settings.area_width="100%";this.settings.width_style="100%"}if((""+replace_element.style.height).indexOf('%')!=-1){this.settings.height=replace_element.style.height;this.settings.area_height="100%";this.settings.height_style="100%"}html=tinyMCE.applyTemplate(html);this.settings.width=this.settings.old_width;this.settings.height=this.settings.old_height;this.visualAid=this.settings.visual;this.formTargetElementId=form_element_name;if(replace_element.nodeName=="TEXTAREA"||replace_element.nodeName=="INPUT")this.startContent=replace_element.value;else this.startContent=replace_element.innerHTML;if(replace_element.nodeName!="TEXTAREA"&&replace_element.nodeName!="INPUT"){this.oldTargetElement=replace_element;hc='<input type="hidden" id="'+form_element_name+'" name="'+form_element_name+'" />';this.oldTargetDisplay=tinyMCE.getStyle(this.oldTargetElement,'display','inline');this.oldTargetElement.style.display="none";html+='</span>';if(tinyMCE.isGecko)html=hc+html;else html+=hc;if(tinyMCE.isGecko){rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element)}else replace_element.insertAdjacentHTML("beforeBegin",html)}else{html+='</span>';this.oldTargetElement=replace_element;this.oldTargetDisplay=tinyMCE.getStyle(this.oldTargetElement,'display','inline');this.oldTargetElement.style.display="none";if(tinyMCE.isGecko){rng=replace_element.ownerDocument.createRange();rng.setStartBefore(replace_element);fragment=rng.createContextualFragment(html);tinyMCE.insertAfter(fragment,replace_element)}else replace_element.insertAdjacentHTML("beforeBegin",html)}dynamicIFrame=false;tElm=targetDoc.getElementById(this.editorId);if(!tinyMCE.isIE){if(tElm&&(tElm.nodeName=="SPAN"||tElm.nodeName=="span")){tElm=tinyMCE._createIFrame(tElm,targetDoc);dynamicIFrame=true}this.targetElement=tElm;this.iframeElement=tElm;this.contentDocument=tElm.contentDocument;this.contentWindow=tElm.contentWindow;}else{if(tElm&&tElm.nodeName=="SPAN")tElm=tinyMCE._createIFrame(tElm,targetDoc,targetDoc.parentWindow);else tElm=targetDoc.frames[this.editorId];this.targetElement=tElm;this.iframeElement=targetDoc.getElementById(this.editorId);if(tinyMCE.isOpera){this.contentDocument=this.iframeElement.contentDocument;this.contentWindow=this.iframeElement.contentWindow;dynamicIFrame=true}else{this.contentDocument=tElm.window.document;this.contentWindow=tElm.window}this.getDoc().designMode="on"}doc=this.contentDocument;if(dynamicIFrame){html=tinyMCE.getParam('doctype')+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+tinyMCE.settings.base_href+'" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';try{if(!this.isHidden())this.getDoc().designMode="on";doc.open();doc.write(html);doc.close()}catch(e){this.getDoc().location.href=tinyMCE.baseURL+"/blank.htm"}}if(tinyMCE.isIE)window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\""+this.editorId+"\"]);",1);parentElm=this.targetDoc.getElementById(this.editorId+'_parent');this.formElement=tinyMCE.isGecko?parentElm.previousSibling:parentElm.nextSibling;tinyMCE.setupContent(this.editorId,true);return true},setBaseHREF:function(u){var h,b,d,nl;d=this.getDoc();nl=d.getElementsByTagName("base");b=nl.length>0?nl[0]:null;if(!b){nl=d.getElementsByTagName("head");h=nl.length>0?nl[0]:null;b=d.createElement("base");b.setAttribute('href',u);h.appendChild(b)}else{if(u==''||u==null)b.parentNode.removeChild(b);else b.setAttribute('href',u)}},getHTML:function(r){var h,d=this.getDoc(),b=this.getBody();if(r)return b.innerHTML;h=tinyMCE._cleanupHTML(this,d,this.settings,b,false,true,false,true);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(d);return h},setHTML:function(h){this.execCommand('mceSetContent',false,h);this.repaint()},getFocusElement:function(){return this.selection.getFocusElement()},getSel:function(){return this.selection.getSel()},getRng:function(){return this.selection.getRng()},triggerSave:function(skip_cleanup,skip_callback){var e,nl=[],i,s,content,htm;if(!this.enabled)return;this.switchSettings();s=tinyMCE.settings;if(tinyMCE.isRealIE){e=this.iframeElement;do{if(e.style&&e.style.display=='none'){e.style.display='block';nl[nl.length]={elm:e,type:'style'}}if(e.style&&s.hidden_tab_class.length>0&&e.className.indexOf(s.hidden_tab_class)!=-1){e.className=s.display_tab_class;nl[nl.length]={elm:e,type:'class'}}}while((e=e.parentNode)!=null)}tinyMCE.settings.preformatted=false;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;tinyMCE._setHTML(this.getDoc(),this.getBody().innerHTML);if(this.settings.cleanup==false){tinyMCE.handleVisualAid(this.getBody(),true,false,this);tinyMCE._setEventsEnabled(this.getBody(),true)}tinyMCE._customCleanup(this,"submit_content_dom",this.contentWindow.document.body);htm=skip_cleanup?this.getBody().innerHTML:tinyMCE._cleanupHTML(this,this.getDoc(),this.settings,this.getBody(),tinyMCE.visualAid,true,true);htm=tinyMCE._customCleanup(this,"submit_content",htm);if(!skip_callback&&tinyMCE.settings.save_callback!=='')content=tinyMCE.resolveDots(tinyMCE.settings.save_callback,window)(this.formTargetElementId,htm,this.getBody());if((typeof(content)!="undefined")&&content!=null)htm=content;htm=tinyMCE.regexpReplace(htm,"&#40;","(","gi");htm=tinyMCE.regexpReplace(htm,"&#41;",")","gi");htm=tinyMCE.regexpReplace(htm,"&#59;",";","gi");htm=tinyMCE.regexpReplace(htm,"&#34;","&quot;","gi");htm=tinyMCE.regexpReplace(htm,"&#94;","^","gi");if(this.formElement)this.formElement.value=htm;if(tinyMCE.isSafari&&this.formElement)this.formElement.innerText=htm;for(i=0;i<nl.length;i++){if(nl[i].type=='style')nl[i].elm.style.display='none';else nl[i].elm.className=s.hidden_tab_class}}};tinyMCE.add(TinyMCE_Engine,{cleanupHTMLCode:function(s){s=s.replace(new RegExp('<p \\/>','gi'),'<p>&nbsp;</p>');s=s.replace(new RegExp('<p>\\s*<\\/p>','gi'),'<p>&nbsp;</p>');s=s.replace(new RegExp('<br>\\s*<\\/br>','gi'),'<br />');s=s.replace(new RegExp('<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>','gi'),'<$1$2$3></$1$2>');s=s.replace(new RegExp('\\s+></','gi'),'></');s=s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>','gi'),'<$1$2 />');if(tinyMCE.isIE)s=s.replace(new RegExp('<p><hr \\/><\\/p>','gi'),"<hr>");if(tinyMCE.isIE)s=s.replace(/<!(\s*)\/>/g,'');return s},parseStyle:function(str){var ar=[],st,i,re,pa;if(str==null)return ar;st=str.split(';');tinyMCE.clearArray(ar);for(i=0;i<st.length;i++){if(st[i]=='')continue;re=new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');pa=st[i].replace(re,'$1||$2').split('||');if(pa.length==2)ar[pa[0].toLowerCase()]=pa[1]}return ar},compressStyle:function(ar,pr,sf,res){var box=[],i,a;box[0]=ar[pr+'-top'+sf];box[1]=ar[pr+'-left'+sf];box[2]=ar[pr+'-right'+sf];box[3]=ar[pr+'-bottom'+sf];for(i=0;i<box.length;i++){if(box[i]==null)return;for(a=0;a<box.length;a++){if(box[a]!=box[i])return}}ar[res]=box[0];ar[pr+'-top'+sf]=null;ar[pr+'-left'+sf]=null;ar[pr+'-right'+sf]=null;ar[pr+'-bottom'+sf]=null},serializeStyle:function(ar){var str="",key,val,m;tinyMCE.compressStyle(ar,"border","","border");tinyMCE.compressStyle(ar,"border","-width","border-width");tinyMCE.compressStyle(ar,"border","-color","border-color");tinyMCE.compressStyle(ar,"border","-style","border-style");tinyMCE.compressStyle(ar,"padding","","padding");tinyMCE.compressStyle(ar,"margin","","margin");for(key in ar){val=ar[key];if(typeof(val)=='function')continue;if(key.indexOf('mso-')==0)continue;if(val!=null&&val!==''){val=''+val;val=val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)",'gi'),"url('$1')");if(val.indexOf('url(')!=-1&&tinyMCE.getParam('convert_urls')){m=new RegExp("url\\('(.*?)'\\)").exec(val);if(m.length>1)val="url('"+eval(tinyMCE.getParam('urlconverter_callback')+"(m[1], null, true);")+"')"}if(tinyMCE.getParam("force_hex_style_colors"))val=tinyMCE.convertRGBToHex(val,true);val=val.replace(/\"/g,'\'');if(val!="url('')")str+=key.toLowerCase()+": "+val+"; "}}if(new RegExp('; $').test(str))str=str.substring(0,str.length-2);return str},convertRGBToHex:function(s,k){var re,rgb;if(s.toLowerCase().indexOf('rgb')!=-1){re=new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)","gi");rgb=s.replace(re,"$1,$2,$3,$4,$5").split(',');if(rgb.length==5){r=parseInt(rgb[1]).toString(16);g=parseInt(rgb[2]).toString(16);b=parseInt(rgb[3]).toString(16);r=r.length==1?'0'+r:r;g=g.length==1?'0'+g:g;b=b.length==1?'0'+b:b;s="#"+r+g+b;if(k)s=rgb[0]+s+rgb[4]}}return s},convertHexToRGB:function(s){if(s.indexOf('#')!=-1){s=s.replace(new RegExp('[^0-9A-F]','gi'),'');return"rgb("+parseInt(s.substring(0,2),16)+","+parseInt(s.substring(2,4),16)+","+parseInt(s.substring(4,6),16)+")"}return s},convertSpansToFonts:function(doc){var s,i,size,fSize,x,fFace,fColor,sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');s=tinyMCE.selectElements(doc,'span,font');for(i=0;i<s.length;i++){size=tinyMCE.trim(s[i].style.fontSize).toLowerCase();fSize=0;for(x=0;x<sizes.length;x++){if(sizes[x]==size){fSize=x+1;break}}if(fSize>0){tinyMCE.setAttrib(s[i],'size',fSize);s[i].style.fontSize=''}fFace=s[i].style.fontFamily;if(fFace!=null&&fFace!==''){tinyMCE.setAttrib(s[i],'face',fFace);s[i].style.fontFamily=''}fColor=s[i].style.color;if(fColor!=null&&fColor!==''){tinyMCE.setAttrib(s[i],'color',tinyMCE.convertRGBToHex(fColor));s[i].style.color=''}}},convertFontsToSpans:function(doc){var fsClasses,s,i,fSize,fFace,fColor,sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');fsClasses=tinyMCE.getParam('font_size_classes');if(fsClasses!=='')fsClasses=fsClasses.replace(/\s+/,'').split(',');else fsClasses=null;s=tinyMCE.selectElements(doc,'span,font');for(i=0;i<s.length;i++){fSize=tinyMCE.getAttrib(s[i],'size');fFace=tinyMCE.getAttrib(s[i],'face');fColor=tinyMCE.getAttrib(s[i],'color');if(fSize!==''){fSize=parseInt(fSize);if(fSize>0&&fSize<8){if(fsClasses!=null)tinyMCE.setAttrib(s[i],'class',fsClasses[fSize-1]);else s[i].style.fontSize=sizes[fSize-1]}s[i].removeAttribute('size')}if(fFace!==''){s[i].style.fontFamily=fFace;s[i].removeAttribute('face')}if(fColor!==''){s[i].style.color=fColor;s[i].removeAttribute('color')}}},cleanupAnchors:function(doc){var i,cn,x,an=doc.getElementsByTagName("a");for(i=an.length-1;i>=0;i--){if(tinyMCE.getAttrib(an[i],"name")!==''&&tinyMCE.getAttrib(an[i],"href")==''){cn=an[i].childNodes;for(x=cn.length-1;x>=0;x--)tinyMCE.insertAfter(cn[x],an[i])}}},getContent:function(editor_id){if(typeof(editor_id)!="undefined")tinyMCE.getInstanceById(editor_id).select();if(tinyMCE.selectedInstance)return tinyMCE.selectedInstance.getHTML();return null},_fixListElements:function(d){var nl,x,a=['ol','ul'],i,n,p,r=new RegExp('^(OL|UL)$'),np;for(x=0;x<a.length;x++){nl=d.getElementsByTagName(a[x]);for(i=0;i<nl.length;i++){n=nl[i];p=n.parentNode;if(r.test(p.nodeName)){np=tinyMCE.prevNode(n,'LI');if(!np){np=d.createElement('li');np.innerHTML='&nbsp;';np.appendChild(n);p.insertBefore(np,p.firstChild)}else np.appendChild(n)}}}},_fixTables:function(d){var nl,i,n,p,np,x,t;nl=d.getElementsByTagName('table');for(i=0;i<nl.length;i++){n=nl[i];if((p=tinyMCE.getParentElement(n,'p,h1,h2,h3,h4,h5,h6'))!=null){np=p.cloneNode(false);np.removeAttribute('id');t=n;while((n=n.nextSibling))np.appendChild(n);tinyMCE.insertAfter(np,p);tinyMCE.insertAfter(t,p)}}},_cleanupHTML:function(inst,doc,config,elm,visual,on_save,on_submit,inn){var h,d,t1,t2,t3,t4,t5,c,s,nb;if(!tinyMCE.getParam('cleanup'))return elm.innerHTML;on_save=typeof(on_save)=='undefined'?false:on_save;c=inst.cleanup;s=inst.settings;d=c.settings.debug;if(d)t1=new Date().getTime();inst._fixRootBlocks();if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertFontsToSpans(doc);if(tinyMCE.getParam("fix_list_elements"))tinyMCE._fixListElements(doc);if(tinyMCE.getParam("fix_table_elements"))tinyMCE._fixTables(doc);tinyMCE._customCleanup(inst,on_save?"get_from_editor_dom":"insert_to_editor_dom",doc.body);if(d)t2=new Date().getTime();c.settings.on_save=on_save;c.idCount=0;c.serializationId=new Date().getTime().toString(32);c.serializedNodes=[];c.sourceIndex=-1;if(s.cleanup_serializer=="xml")h=c.serializeNodeAsXML(elm,inn);else h=c.serializeNodeAsHTML(elm,inn);if(d)t3=new Date().getTime();nb=tinyMCE.getParam('entity_encoding')=='numeric'?'&#160;':'&nbsp;';h=h.replace(/<\/?(body|head|html)[^>]*>/gi,'');h=h.replace(new RegExp(' (rowspan="1"|colspan="1")','g'),'');h=h.replace(/<p><hr \/><\/p>/g,'<hr />');h=h.replace(/<p>(&nbsp;|&#160;)<\/p><hr \/><p>(&nbsp;|&#160;)<\/p>/g,'<hr />');h=h.replace(/<td>\s*<br \/>\s*<\/td>/g,'<td>'+nb+'</td>');h=h.replace(/<p>\s*<br \/>\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<br \/>$/,'');h=h.replace(/<br \/><\/p>/g,'</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g,'<p>'+nb+'</p>');h=h.replace(new RegExp('<a>(.*?)<\\/a>','g'),'$1');h=h.replace(/<p([^>]*)>\s*<\/p>/g,'<p$1>'+nb+'</p>');if(/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))h='';if(s.preformatted){h=h.replace(/^<pre>/,'');h=h.replace(/<\/pre>$/,'');h='<pre>'+h+'</pre>'}if(tinyMCE.isGecko){h=h.replace(/<br \/>\s*<\/li>/g,'</li>');h=h.replace(/&nbsp;\s*<\/(dd|dt)>/g,'</$1>');h=h.replace(/<o:p _moz-userdefined="" \/>/g,'');h=h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g,'<td$1>'+nb+'</td>')}if(s.force_br_newlines)h=h.replace(/<p>(&nbsp;|&#160;)<\/p>/g,'<br />');h=tinyMCE._customCleanup(inst,on_save?"get_from_editor":"insert_to_editor",h);if(on_save){h=h.replace(new RegExp(' ?(mceItem[a-zA-Z0-9]*|'+s.visual_table_class+')','g'),'');h=h.replace(new RegExp(' ?class=""','g'),'')}if(s.remove_linebreaks&&!c.settings.indent)h=h.replace(/\n|\r/g,' ');if(d)t4=new Date().getTime();if(on_save&&c.settings.indent)h=c.formatHTML(h);if(on_submit&&(s.encoding=="xml"||s.encoding=="html"))h=c.xmlEncode(h);if(d)t5=new Date().getTime();if(c.settings.debug)tinyMCE.debug("Cleanup in ms: Pre="+(t2-t1)+", Serialize: "+(t3-t2)+", Post: "+(t4-t3)+", Format: "+(t5-t4)+", Sum: "+(t5-t1)+".");return h}});function TinyMCE_Cleanup(){this.isIE=(navigator.appName=="Microsoft Internet Explorer");this.rules=tinyMCE.clearArray([]);this.settings={indent_elements:'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object',newline_before_elements:'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td',newline_after_elements:'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script',newline_before_after_elements:'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div',indent_char:'\t',indent_levels:1,entity_encoding:'raw',valid_elements:'*[*]',entities:'',url_converter:'',invalid_elements:'',verify_html:false};this.vElements=tinyMCE.clearArray([]);this.vElementsRe='';this.closeElementsRe=/^(IMG|BR|HR|LINK|META|BASE|INPUT|AREA)$/;this.codeElementsRe=/^(SCRIPT|STYLE)$/;this.serializationId=0;this.mceAttribs={href:'mce_href',src:'mce_src',type:'mce_type'}}TinyMCE_Cleanup.prototype={init:function(s){var n,a,i,ir,or,st;for(n in s)this.settings[n]=s[n];s=this.settings;this.inRe=this._arrayToRe(s.indent_elements.split(','),'','^<(',')[^>]*');this.ouRe=this._arrayToRe(s.indent_elements.split(','),'','^<\\/(',')[^>]*');this.nlBeforeRe=this._arrayToRe(s.newline_before_elements.split(','),'gi','<(',')([^>]*)>');this.nlAfterRe=this._arrayToRe(s.newline_after_elements.split(','),'gi','<(',')([^>]*)>');this.nlBeforeAfterRe=this._arrayToRe(s.newline_before_after_elements.split(','),'gi','<(\\/?)(',')([^>]*)>');this.serializedNodes=[];if(s.invalid_elements!=='')this.iveRe=this._arrayToRe(s.invalid_elements.toUpperCase().split(','),'g','^(',')$');else this.iveRe=null;st='';for(i=0;i<s.indent_levels;i++)st+=s.indent_char;this.inStr=st;if(!s.verify_html){s.valid_elements='*[*]';s.extended_valid_elements=''}this.fillStr=s.entity_encoding=="named"?"&nbsp;":"&#160;";this.idCount=0;this.xmlEncodeRe=new RegExp('[\u007F-\uFFFF<>&"]','g')},addRuleStr:function(s){var r=this.parseRuleStr(s),n;for(n in r){if(r[n])this.rules[n]=r[n]}this.vElements=tinyMCE.clearArray([]);for(n in this.rules){if(this.rules[n])this.vElements[this.vElements.length]=this.rules[n].tag}this.vElementsRe=this._arrayToRe(this.vElements,'')},isValid:function(n){if(!this.rulesDone)this._setupRules();if(!n)return true;n=n.replace(/[^a-z0-9]+/gi,'').toUpperCase();return!tinyMCE.getParam('cleanup')||this.vElementsRe.test(n)},addChildRemoveRuleStr:function(s){var x,y,p,i,t,tn,ta,cl,r;if(!s)return;ta=s.split(',');for(x=0;x<ta.length;x++){s=ta[x];p=this.split(/\[|\]/,s);if(p==null||p.length<1)t=s.toUpperCase();else t=p[0].toUpperCase();tn=this.split('/',t);for(y=0;y<tn.length;y++){r="^(";cl=this.split(/\|/,p[1]);for(i=0;i<cl.length;i++){if(cl[i]=='%istrict')r+=tinyMCE.inlineStrict;else if(cl[i]=='%itrans')r+=tinyMCE.inlineTransitional;else if(cl[i]=='%istrict_na')r+=tinyMCE.inlineStrict.substring(2);else if(cl[i]=='%itrans_na')r+=tinyMCE.inlineTransitional.substring(2);else if(cl[i]=='%btrans')r+=tinyMCE.blockElms;else if(cl[i]=='%strict')r+=tinyMCE.blockStrict;else r+=(cl[i].charAt(0)!='#'?cl[i].toUpperCase():cl[i]);r+=(i!=cl.length-1?'|':'')}r+=')$';if(this.childRules==null)this.childRules=tinyMCE.clearArray([]);this.childRules[tn[y]]=new RegExp(r);if(p.length>1)this.childRules[tn[y]].wrapTag=p[2]}}},parseRuleStr:function(s){var ta,p,r,a,i,x,px,t,tn,y,av,or=tinyMCE.clearArray([]),dv;if(s==null||s.length==0)return or;ta=s.split(',');for(x=0;x<ta.length;x++){s=ta[x];if(s.length==0)continue;p=this.split(/\[|\]/,s);if(p==null||p.length<1)t=s.toUpperCase();else t=p[0].toUpperCase();tn=this.split('/',t);for(y=0;y<tn.length;y++){r={};r.tag=tn[y];r.forceAttribs=null;r.defaultAttribs=null;r.validAttribValues=null;px=r.tag.charAt(0);r.forceOpen=px=='+';r.removeEmpty=px=='-';r.fill=px=='#';r.tag=r.tag.replace(/\+|-|#/g,'');r.oTagName=tn[0].replace(/\+|-|#/g,'').toLowerCase();r.isWild=new RegExp('\\*|\\?|\\+','g').test(r.tag);r.validRe=new RegExp(this._wildcardToRe('^'+r.tag+'$'));if(p.length>1){r.vAttribsRe='^(';a=this.split(/\|/,p[1]);for(i=0;i<a.length;i++){t=a[i];if(t.charAt(0)=='!'){a[i]=t=t.substring(1);if(!r.reqAttribsRe)r.reqAttribsRe='\\s+('+t;else r.reqAttribsRe+='|'+t}av=new RegExp('(=|:|<)(.*?)$').exec(t);t=t.replace(new RegExp('(=|:|<).*?$'),'');if(av&&av.length>0){if(av[0].charAt(0)==':'){if(!r.forceAttribs)r.forceAttribs=tinyMCE.clearArray([]);r.forceAttribs[t.toLowerCase()]=av[0].substring(1)}else if(av[0].charAt(0)=='='){if(!r.defaultAttribs)r.defaultAttribs=tinyMCE.clearArray([]);dv=av[0].substring(1);r.defaultAttribs[t.toLowerCase()]=dv==''?"mce_empty":dv}else if(av[0].charAt(0)=='<'){if(!r.validAttribValues)r.validAttribValues=tinyMCE.clearArray([]);r.validAttribValues[t.toLowerCase()]=this._arrayToRe(this.split('?',av[0].substring(1)),'i')}}r.vAttribsRe+=''+t.toLowerCase()+(i!=a.length-1?'|':'');a[i]=t.toLowerCase()}if(r.reqAttribsRe)r.reqAttribsRe=new RegExp(r.reqAttribsRe+')=\"','g');r.vAttribsRe+=')$';r.vAttribsRe=this._wildcardToRe(r.vAttribsRe);r.vAttribsReIsWild=new RegExp('\\*|\\?|\\+','g').test(r.vAttribsRe);r.vAttribsRe=new RegExp(r.vAttribsRe);r.vAttribs=a.reverse();}else{r.vAttribsRe='';r.vAttribs=tinyMCE.clearArray([]);r.vAttribsReIsWild=false}or[r.tag]=r}}return or},serializeNodeAsXML:function(n){var s,b;if(!this.xmlDoc){if(this.isIE){try{this.xmlDoc=new ActiveXObject('MSXML2.DOMDocument')}catch(e){}if(!this.xmlDoc)try{this.xmlDoc=new ActiveXObject('Microsoft.XmlDom')}catch(e){}}else this.xmlDoc=document.implementation.createDocument('','',null);if(!this.xmlDoc)alert("Error XML Parser could not be found.")}if(this.xmlDoc.firstChild)this.xmlDoc.removeChild(this.xmlDoc.firstChild);b=this.xmlDoc.createElement("html");b=this.xmlDoc.appendChild(b);this._convertToXML(n,b);if(this.isIE)return this.xmlDoc.xml;else return new XMLSerializer().serializeToString(this.xmlDoc)},_convertToXML:function(n,xn){var xd,el,i,l,cn,at,no,hc=false;if(tinyMCE.isRealIE&&this._isDuplicate(n))return;xd=this.xmlDoc;switch(n.nodeType){case 1:hc=n.hasChildNodes();el=xd.createElement(n.nodeName.toLowerCase());at=n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified&&no.nodeValue)el.setAttribute(no.nodeName.toLowerCase(),no.nodeValue)}if(!hc&&!this.closeElementsRe.test(n.nodeName))el.appendChild(xd.createTextNode(""));xn=xn.appendChild(el);break;case 3:xn.appendChild(xd.createTextNode(n.nodeValue));return;case 8:xn.appendChild(xd.createComment(n.nodeValue));return}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i<l;i++)this._convertToXML(cn[i],xn)}},serializeNodeAsHTML:function(n,inn){var en,no,h='',i,l,t,st,r,cn,va=false,f=false,at,hc,cr,nn;if(!this.rulesDone)this._setupRules();if(tinyMCE.isRealIE&&this._isDuplicate(n))return'';if(n.parentNode&&this.childRules!=null){cr=this.childRules[n.parentNode.nodeName];if(typeof(cr)!="undefined"&&!cr.test(n.nodeName)){st=true;t=null}}switch(n.nodeType){case 1:hc=n.hasChildNodes();if(st)break;nn=n.nodeName;if(tinyMCE.isRealIE){if(n.nodeName.indexOf('/')!=-1)break;if(n.scopeName&&n.scopeName!='HTML')nn=n.scopeName.toUpperCase()+':'+nn.toUpperCase()}else if(tinyMCE.isOpera&&nn.indexOf(':')>0)nn=nn.toUpperCase();if(this.settings.convert_fonts_to_spans){if(this.settings.on_save&&nn=='FONT')nn='SPAN';if(!this.settings.on_save&&nn=='SPAN')nn='FONT'}if(this.vElementsRe.test(nn)&&(!this.iveRe||!this.iveRe.test(nn))&&!inn){va=true;r=this.rules[nn];if(!r){at=this.rules;for(no in at){if(at[no]&&at[no].validRe.test(nn)){r=at[no];break}}}en=r.isWild?nn.toLowerCase():r.oTagName;f=r.fill;if(r.removeEmpty&&!hc)return"";t='<'+en;if(r.vAttribsReIsWild){at=n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified&&r.vAttribsRe.test(no.nodeName))t+=this._serializeAttribute(n,r,no.nodeName)}}else{for(i=r.vAttribs.length-1;i>-1;i--)t+=this._serializeAttribute(n,r,r.vAttribs[i])}if(!this.settings.on_save){at=this.mceAttribs;for(no in at){if(at[no])t+=this._serializeAttribute(n,r,at[no])}}if(r.reqAttribsRe&&!t.match(r.reqAttribsRe))t=null;if(t!=null&&this.closeElementsRe.test(nn))return t+' />';if(t!=null)h+=t+'>';if(this.isIE&&this.codeElementsRe.test(nn))h+=n.innerHTML}break;case 3:if(st)break;if(n.parentNode&&this.codeElementsRe.test(n.parentNode.nodeName))return this.isIE?'':n.nodeValue;return this.xmlEncode(n.nodeValue);case 8:if(st)break;return"<!--"+this._trimComment(n.nodeValue)+"-->"}if(hc){cn=n.childNodes;for(i=0,l=cn.length;i<l;i++)h+=this.serializeNodeAsHTML(cn[i])}if(f&&!hc)h+=this.fillStr;if(t!=null&&va)h+='</'+en+'>';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&&/^(src|href|longdesc)$/.test(an))av=this._urlConverter(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,1);return" "+an+"="+'"'+av+'"'}return""},formatHTML:function(h){var s=this.settings,p='',i=0,li=0,o='',l;h=h.replace(/<pre([^>]*)>(.*?)<\/pre>/gi,function(a,b,c){c=c.replace(/<br\s*\/>/gi,'\n');return'<pre'+b+'>'+c+'</pre>'});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,re=this.xmlEncodeRe;if(!this.entitiesDone)this._setupEntities();switch(this.settings.entity_encoding){case"raw":return tinyMCE.xmlEncode(s);case"named":return s.replace(re,function(c){var b=cl.entities[c.charCodeAt(0)];return b?'&'+b+';':c});case"numeric":return s.replace(re,function(c){return'&#'+c.charCodeAt(0)+';'})}return s},split:function(re,s){var i,l,o=[],c=s.split(re);for(i=0,l=c.length;i<l;i++){if(c[i]!=='')o[i]=c[i]}return o},_trimComment:function(s){s=s.replace(new RegExp('\\smce_src=\"[^\"]*\"','gi'),"");s=s.replace(new RegExp('\\smce_href=\"[^\"]*\"','gi'),"");return s},_getAttrib:function(e,n,d){var v,ex,nn;if(typeof(d)=="undefined")d="";if(!e||e.nodeType!=1)return d;try{v=e.getAttribute(n,0)}catch(ex){v=e.getAttribute(n,2)}if(n=="class"&&!v)v=e.className;if(this.isIE){if(n=="http-equiv")v=e.httpEquiv;nn=e.nodeName;if(nn=="FORM"&&n=="enctype"&&v=="application/x-www-form-urlencoded")v="";if(nn=="INPUT"&&n=="size"&&v=="20")v="";if(nn=="INPUT"&&n=="maxlength"&&v=="2147483647")v="";if(n=="width"||n=="height")v=e.getAttribute(n,2)}if(n=='style'&&v){if(!tinyMCE.isOpera)v=e.style.cssText;v=tinyMCE.serializeStyle(tinyMCE.parseStyle(v))}if(this.settings.on_save&&n.indexOf('on')!=-1&&this.settings.on_save&&v&&v!=='')v=tinyMCE.cleanupEventStr(v);return(v&&v!=='')?''+v:d},_urlConverter:function(c,n,v){if(!c.settings.on_save)return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,v);else if(tinyMCE.getParam('convert_urls')){if(!this.urlConverter)this.urlConverter=eval(tinyMCE.settings.urlconverter_callback);return this.urlConverter(v,n,true)}return v},_arrayToRe:function(a,op,be,af){var i,r;op=typeof(op)=="undefined"?"gi":op;be=typeof(be)=="undefined"?"^(":be;af=typeof(af)=="undefined"?")$":af;r=be;for(i=0;i<a.length;i++)r+=this._wildcardToRe(a[i])+(i!=a.length-1?"|":"");r+=af;return new RegExp(r,op)},_wildcardToRe:function(s){s=s.replace(/\?/g,'(\\S?)');s=s.replace(/\+/g,'(\\S+)');s=s.replace(/\*/g,'(\\S*)');return s},_setupEntities:function(){var n,a,i,s=this.settings;if(s.entity_encoding=="named"){n=tinyMCE.clearArray([]);a=this.split(',',s.entities);for(i=0;i<a.length;i+=2)n[a[i]]=a[i+1];this.entities=n}this.entitiesDone=true},_setupRules:function(){var s=this.settings;this.addRuleStr(s.valid_elements);this.addRuleStr(s.extended_valid_elements);this.addChildRemoveRuleStr(s.valid_child_elements);this.rulesDone=true},_isDuplicate:function(n){var i,l,sn;if(!this.settings.fix_content_duplication)return false;if(tinyMCE.isRealIE&&n.nodeType==1){if(n.mce_serialized==this.serializationId)return true;n.setAttribute('mce_serialized',this.serializationId)}else{sn=this.serializedNodes;for(i=0,l=sn.length;i<l;i++){if(sn[i]==n)return true}sn.push(n)}return false}};tinyMCE.add(TinyMCE_Engine,{createTagHTML:function(tn,a,h){var o='',f=tinyMCE.xmlEncode,n;o='<'+tn;if(a){for(n in a){if(typeof(a[n])!='function'&&a[n]!=null)o+=' '+f(n)+'="'+f(''+a[n])+'"'}}o+=!h?' />':'>'+h+'</'+tn+'>';return o},createTag:function(d,tn,a,h){var o=d.createElement(tn),n;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},getElementByAttributeValue:function(n,e,a,v){return(n=this.getElementsByAttributeValue(n,e,a,v)).length==0?null:n[0]},getElementsByAttributeValue:function(n,e,a,v){var i,nl=n.getElementsByTagName(e),o=[];for(i=0;i<nl.length;i++){if(tinyMCE.getAttrib(nl[i],a).indexOf(v)!=-1)o[o.length]=nl[i]}return o},isBlockElement:function(n){return n!=null&&n.nodeType==1&&this.blockRegExp.test(n.nodeName)},getParentBlockElement:function(n,r){return this.getParentNode(n,function(n){return tinyMCE.isBlockElement(n)},r);return null},insertAfter:function(n,r){if(r.nextSibling)r.parentNode.insertBefore(n,r.nextSibling);else r.parentNode.appendChild(n)},setInnerHTML:function(e,h){var i,nl,n;if(tinyMCE.isGecko){h=h.replace(/<embed([^>]*)>/gi,'<tmpembed$1>');h=h.replace(/<em([^>]*)>/gi,'<i$1>');h=h.replace(/<tmpembed([^>]*)>/gi,'<embed$1>');h=h.replace(/<strong([^>]*)>/gi,'<b$1>');h=h.replace(/<\/strong>/gi,'</b>');h=h.replace(/<\/em>/gi,'</i>')}if(tinyMCE.isRealIE){h=h.replace(/\s\/>/g,'>');h=h.replace(/<p([^>]*)>\u00A0?<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');h=h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');h=h.replace(/<p([^>]*)>\s+<\/p>/gi,'<p$1 mce_keep="true">&nbsp;</p>');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)}},getOuterHTML:function(e){var d;if(tinyMCE.isIE)return e.outerHTML;d=e.ownerDocument.createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML},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<nl.length;i++)e.parentNode.insertBefore(nl[i].cloneNode(true),e);e.parentNode.removeChild(e)}},_getElementById:function(id,d){var e,i,j,f;if(typeof(d)=="undefined")d=document;e=d.getElementById(id);if(!e){f=d.forms;for(i=0;i<f.length;i++){for(j=0;j<f[i].elements.length;j++){if(f[i].elements[j].name==id){e=f[i].elements[j];break}}}}return e},getNodeTree:function(n,na,t,nn){return this.selectNodes(n,function(n){return(!t||n.nodeType==t)&&(!nn||n.nodeName==nn)},na?na:[])},getParentElement:function(n,na,f,r){var re=na?new RegExp('^('+na.toUpperCase().replace(/,/g,'|')+')$'):0,v;if(f&&typeof(f)=='string')return this.getParentElement(n,na,function(no){return tinyMCE.getAttrib(no,f)!==''});return this.getParentNode(n,function(n){return((n.nodeType==1&&!re)||(re&&re.test(n.nodeName)))&&(!f||f(n))},r)},getParentNode:function(n,f,r){while(n){if(n==r)return null;if(f(n))return n;n=n.parentNode}return null},getAttrib:function(elm,name,dv){var v;if(typeof(dv)=="undefined")dv="";if(!elm||elm.nodeType!=1)return dv;try{v=elm.getAttribute(name,0)}catch(ex){v=elm.getAttribute(name,2)}if(name=="class"&&!v)v=elm.className;if(tinyMCE.isGecko){if(name=="src"&&elm.src!=null&&elm.src!=='')v=elm.src;if(name=="href"&&elm.href!=null&&elm.href!=='')v=elm.href}else if(tinyMCE.isIE){switch(name){case"http-equiv":v=elm.httpEquiv;break;case"width":case"height":v=elm.getAttribute(name,2);break}}if(name=="style"&&!tinyMCE.isOpera)v=elm.style.cssText;return(v&&v!=='')?v:dv},setAttrib:function(el,name,va,fix){if(typeof(va)=="number"&&va!=null)va=""+va;if(fix){if(va==null)va="";va=va.replace(/[^0-9%]/g,'')}if(name=="style")el.style.cssText=va;if(name=="class")el.className=va;if(va!=null&&va!==''&&va!=-1)el.setAttribute(name,va);else el.removeAttribute(name)},setStyleAttrib:function(e,n,v){e.style[n]=v;if(tinyMCE.isIE&&v==null||v==''){v=tinyMCE.serializeStyle(tinyMCE.parseStyle(e.style.cssText));e.style.cssText=v;e.setAttribute("style",v)}},switchClass:function(ei,c){var e;if(tinyMCE.switchClassCache[ei])e=tinyMCE.switchClassCache[ei];else e=tinyMCE.switchClassCache[ei]=document.getElementById(ei);if(e){if(tinyMCE.settings.button_tile_map&&e.className&&e.className.indexOf('mceTiledButton')==0)c='mceTiledButton '+c;e.className=c}},getAbsPosition:function(n,cn){var l=0,t=0;while(n&&n!=cn){l+=n.offsetLeft;t+=n.offsetTop;n=n.offsetParent}return{absLeft:l,absTop:t}},prevNode:function(e,n){var a=n.split(','),i;while((e=e.previousSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e}}return null},nextNode:function(e,n){var a=n.split(','),i;while((e=e.nextSibling)!=null){for(i=0;i<a.length;i++){if(e.nodeName==a[i])return e}}return null},selectElements:function(n,na,f){var i,a=[],nl,x;for(x=0,na=na.split(',');x<na.length;x++)for(i=0,nl=n.getElementsByTagName(na[x]);i<nl.length;i++)(!f||f(nl[i]))&&a.push(nl[i]);return a},selectNodes:function(n,f,a){var i;if(!a)a=[];if(f(n))a[a.length]=n;if(n.hasChildNodes()){for(i=0;i<n.childNodes.length;i++)tinyMCE.selectNodes(n.childNodes[i],f,a)}return a},addCSSClass:function(e,c,b){var o=this.removeCSSClass(e,c);return e.className=b?c+(o!==''?(' '+o):''):(o!==''?(o+' '):'')+c},removeCSSClass:function(e,c){c=e.className.replace(new RegExp("(^|\\s+)"+c+"(\\s+|$)"),' ');return e.className=c!=' '?c:''},hasCSSClass:function(n,c){return new RegExp('\\b'+c+'\\b','g').test(n.className)},renameElement:function(e,n,d){var ne,i,ar;d=typeof(d)=="undefined"?tinyMCE.selectedInstance.getDoc():d;if(e){ne=d.createElement(n);ar=e.attributes;for(i=ar.length-1;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<ar.length;i++)ne.appendChild(ar[i].cloneNode(true));e.parentNode.replaceChild(ne,e)}},getViewPort:function(w){var d=w.document,m=d.compatMode=='CSS1Compat',b=d.body,de=d.documentElement;return{left:w.pageXOffset||(m?de.scrollLeft:b.scrollLeft),top:w.pageYOffset||(m?de.scrollTop:b.scrollTop),width:w.innerWidth||(m?de.clientWidth:b.clientWidth),height:w.innerHeight||(m?de.clientHeight:b.clientHeight)}},getStyle:function(n,na,d){if(!n)return false;if(tinyMCE.isGecko&&n.ownerDocument.defaultView){try{return n.ownerDocument.defaultView.getComputedStyle(n,null).getPropertyValue(na)}catch(n){return null}}na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase()});if(n.currentStyle)return n.currentStyle[na];return false}});tinyMCE.add(TinyMCE_Engine,{parseURL:function(url_str){var urlParts=[],i,pos,lastPos,chr;if(url_str){pos=url_str.indexOf('://');if(pos!=-1){urlParts.protocol=url_str.substring(0,pos);lastPos=pos+3}for(i=lastPos;i<url_str.length;i++){chr=url_str.charAt(i);if(chr==':')break;if(chr=='/')break}pos=i;urlParts.host=url_str.substring(lastPos,pos);urlParts.port="";lastPos=pos;if(url_str.charAt(pos)==':'){pos=url_str.indexOf('/',lastPos);urlParts.port=url_str.substring(lastPos+1,pos)}lastPos=pos;pos=url_str.indexOf('?',lastPos);if(pos==-1)pos=url_str.indexOf('#',lastPos);if(pos==-1)pos=url_str.length;urlParts.path=url_str.substring(lastPos,pos);lastPos=pos;if(url_str.charAt(pos)=='?'){pos=url_str.indexOf('#');pos=(pos==-1)?url_str.length:pos;urlParts.query=url_str.substring(lastPos+1,pos)}lastPos=pos;if(url_str.charAt(pos)=='#'){pos=url_str.length;urlParts.anchor=url_str.substring(lastPos+1,pos)}}return urlParts},serializeURL:function(up){var o="";if(up.protocol)o+=up.protocol+"://";if(up.host)o+=up.host;if(up.port)o+=":"+up.port;if(up.path)o+=up.path;if(up.query)o+="?"+up.query;if(up.anchor)o+="#"+up.anchor;return o},convertAbsoluteURLToRelativeURL:function(base_url,url_to_relative){var baseURL=this.parseURL(base_url),targetURL=this.parseURL(url_to_relative);var i,strTok1,strTok2,breakPoint=0,outPath="",forceSlash=false;var fileName,pos;if(targetURL.path=='')targetURL.path="/";else forceSlash=true;base_url=baseURL.path.substring(0,baseURL.path.lastIndexOf('/'));strTok1=base_url.split('/');strTok2=targetURL.path.split('/');if(strTok1.length>=strTok2.length){for(i=0;i<strTok1.length;i++){if(i>=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(strTok1.length<strTok2.length){for(i=0;i<strTok2.length;i++){if(i>=strTok1.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break}}}if(breakPoint==1)return targetURL.path;for(i=0;i<(strTok1.length-(breakPoint-1));i++)outPath+="../";for(i=breakPoint-1;i<strTok2.length;i++){if(i!=(breakPoint-1))outPath+="/"+strTok2[i];else outPath+=strTok2[i]}targetURL.protocol=null;targetURL.host=null;targetURL.port=null;targetURL.path=outPath==''&&forceSlash?"/":outPath;fileName=baseURL.path;if((pos=fileName.lastIndexOf('/'))!=-1)fileName=fileName.substring(pos+1);if(fileName==targetURL.path&&targetURL.anchor!=='')targetURL.path="";if(targetURL.path==''&&!targetURL.anchor)targetURL.path=fileName!==''?fileName:"/";return this.serializeURL(targetURL)},convertRelativeToAbsoluteURL:function(base_url,relative_url){var baseURL=this.parseURL(base_url),baseURLParts,relURLParts,newRelURLParts,numBack,relURL=this.parseURL(relative_url),i;var len,absPath,start,end,newBaseURLParts;if(relative_url==''||relative_url.indexOf('://')!=-1||/^(mailto:|javascript:|#|\/)/.test(relative_url))return relative_url;baseURLParts=baseURL.path.split('/');relURLParts=relURL.path.split('/');newBaseURLParts=[];for(i=baseURLParts.length-1;i>=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i]}baseURLParts=newBaseURLParts.reverse();newRelURLParts=[];numBack=0;for(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();len=baseURLParts.length-numBack;absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');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)},convertURL:function(url,node,on_save){var dl=document.location,start,portPart,urlParts,baseUrlParts,tmpUrlParts,curl;var prot=dl.protocol,host=dl.hostname,port=dl.port;if(prot=="file:")return url;url=tinyMCE.regexpReplace(url,'(http|https):///','/');if(url.indexOf('mailto:')!=-1||url.indexOf('javascript:')!=-1||/^[ \t\r\n\+]*[#\?]/.test(url))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')){curl=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,url);if(curl.charAt(0)=='/')curl=tinyMCE.settings.document_base_prefix+curl;urlParts=tinyMCE.parseURL(curl);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')){urlParts=tinyMCE.parseURL(url);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')){start="";portPart="";if(port!=='')portPart=":"+port;start=prot+"//"+host+portPart+"/";if(url.indexOf(start)==0)url=url.substring(start.length-1)}return url},convertAllRelativeURLs:function(body){var i,elms,src,href,mhref,msrc;elms=body.getElementsByTagName("img");for(i=0;i<elms.length;i++){src=tinyMCE.getAttrib(elms[i],'src');msrc=tinyMCE.getAttrib(elms[i],'mce_src');if(msrc!=='')src=msrc;if(src!==''){src=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,src);elms[i].setAttribute("src",src)}}elms=body.getElementsByTagName("a");for(i=0;i<elms.length;i++){href=tinyMCE.getAttrib(elms[i],'href');mhref=tinyMCE.getAttrib(elms[i],'mce_href');if(mhref!=='')href=mhref;if(href&&href!==''){href=tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href,href);elms[i].setAttribute("href",href)}}}});tinyMCE.add(TinyMCE_Engine,{clearArray:function(a){var n;for(n in a)a[n]=null;return a},explode:function(d,s){var ar=s.split(d),oar=[],i;for(i=0;i<ar.length;i++){if(ar[i]!=='')oar[oar.length]=ar[i]}return oar}});tinyMCE.add(TinyMCE_Engine,{_setEventsEnabled:function(node,state){var evs,x,y,elms,i,event;var events=['onfocus','onblur','onclick','ondblclick','onmousedown','onmouseup','onmouseover','onmousemove','onmouseout','onkeypress','onkeydown','onkeydown','onkeyup'];evs=tinyMCE.settings.event_elements.split(',');for(y=0;y<evs.length;y++){elms=node.getElementsByTagName(evs[y]);for(i=0;i<elms.length;i++){event="";for(x=0;x<events.length;x++){if((event=tinyMCE.getAttrib(elms[i],events[x]))!==''){event=tinyMCE.cleanupEventStr(""+event);if(!state)event="return true;"+event;else event=event.replace(/^return true;/gi,'');elms[i].removeAttribute(events[x]);elms[i].setAttribute(events[x],event)}}}}},_eventPatch:function(editor_id){var n,inst,win,e;if(typeof(tinyMCE)=="undefined")return true;try{if(tinyMCE.selectedInstance){win=tinyMCE.selectedInstance.getWin();if(win&&win.event){e=win.event;if(!e.target)e.target=e.srcElement;TinyMCE_Engine.prototype.handleEvent(e);return}}for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.select();win=inst.getWin();if(win&&win.event){e=win.event;if(!e.target)e.target=e.srcElement;TinyMCE_Engine.prototype.handleEvent(e);return}}}catch(ex){}},findEvent:function(e){var n,inst;if(e)return e;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(tinyMCE.isInstance(inst)&&inst.getWin().event)return inst.getWin().event}return null},unloadHandler:function(){tinyMCE.triggerSave(true,true)},addEventHandlers:function(inst){this.setEventHandlers(inst,1)},setEventHandlers:function(inst,s){var doc=inst.getDoc(),ie,ot,i,f=s?tinyMCE.addEvent:tinyMCE.removeEvent;ie=['keypress','keyup','keydown','click','mouseup','mousedown','controlselect','dblclick'];ot=['keypress','keyup','keydown','click','mouseup','mousedown','focus','blur','dragdrop'];inst.switchSettings();if(tinyMCE.isIE){for(i=0;i<ie.length;i++)f(doc,ie[i],TinyMCE_Engine.prototype._eventPatch)}else{for(i=0;i<ot.length;i++)f(doc,ot[i],tinyMCE.handleEvent);try{doc.designMode="On"}catch(e){}}},onMouseMove:function(){var inst,lh;if(tinyMCE.lastHover){lh=tinyMCE.lastHover;if(lh.className.indexOf('mceMenu')!=-1)tinyMCE._menuButtonEvent('out',lh);else lh.className=lh.className;tinyMCE.lastHover=null}if(!tinyMCE.hasMouseMoved){inst=tinyMCE.selectedInstance;if(inst.isFocused){inst.undoBookmark=inst.selection.getBookmark();tinyMCE.hasMouseMoved=true}}},cancelEvent:function(e){if(!e)return false;if(tinyMCE.isIE){e.returnValue=false;e.cancelBubble=true}else{e.preventDefault();e.stopPropagation&&e.stopPropagation()}return false},addEvent:function(o,n,h){if(n!='unload'){function clean(){var ex;try{tinyMCE.removeEvent(o,n,h);tinyMCE.removeEvent(window,'unload',clean);o=n=h=null}catch(ex){}}tinyMCE.addEvent(window,'unload',clean)}if(o.attachEvent)o.attachEvent("on"+n,h);else o.addEventListener(n,h,false)},removeEvent:function(o,n,h){if(o.detachEvent)o.detachEvent("on"+n,h);else o.removeEventListener(n,h,false)},addSelectAccessibility:function(e,s,w){if(!s._isAccessible){s.onkeydown=tinyMCE.accessibleEventHandler;s.onblur=tinyMCE.accessibleEventHandler;s._isAccessible=true;s._win=w}return false},accessibleEventHandler:function(e){var elm,win=this._win;e=tinyMCE.isIE?win.event:e;elm=tinyMCE.isIE?e.srcElement:e.target;if(e.type=="blur"){if(elm.oldonchange){elm.onchange=elm.oldonchange;elm.oldonchange=null}return true}if(elm.nodeName=="SELECT"&&!elm.oldonchange){elm.oldonchange=elm.onchange;elm.onchange=null}if(e.keyCode==13||e.keyCode==32){elm.onchange=elm.oldonchange;elm.onchange();elm.oldonchange=null;tinyMCE.cancelEvent(e);return false}return true},_resetIframeHeight:function(){var ife;if(tinyMCE.isRealIE){ife=tinyMCE.selectedInstance.iframeElement;if(ife._oldHeight){ife.style.height=ife._oldHeight;ife.height=ife._oldHeight}}}});function TinyMCE_Selection(inst){this.instance=inst};TinyMCE_Selection.prototype={getSelectedHTML:function(){var inst=this.instance,e,r=this.getRng(),h;if(!r)return null;e=document.createElement("body");if(r.cloneContents)e.appendChild(r.cloneContents());else if(typeof(r.item)!='undefined'||typeof(r.htmlText)!='undefined')e.innerHTML=r.item?r.item(0).outerHTML:r.htmlText;else e.innerHTML=r.toString();h=tinyMCE._cleanupHTML(inst,inst.contentDocument,inst.settings,e,e,false,true,false);return h},getSelectedText:function(){var inst=this.instance,d,r,s,t;if(tinyMCE.isIE){d=inst.getDoc();if(d.selection.type=="Text"){r=d.selection.createRange();t=r.text}else t=''}else{s=this.getSel();if(s&&s.toString)t=s.toString();else t=''}return t},getBookmark:function(simple){var inst=this.instance,rng=this.getRng(),doc=inst.getDoc(),b=inst.getBody();var trng,sx,sy,xx=-999999999,vp=inst.getViewPort();var sp,le,s,e,nl,i,si,ei,w;sx=vp.left;sy=vp.top;if(simple)return{rng:rng,scrollX:sx,scrollY:sy};if(tinyMCE.isRealIE){if(rng.item){e=rng.item(0);nl=b.getElementsByTagName(e.nodeName);for(i=0;i<nl.length;i++){if(e==nl[i]){sp=i;break}}return{tag:e.nodeName,index:sp,scrollX:sx,scrollY:sy}}else{trng=doc.body.createTextRange();trng.moveToElementText(inst.getBody());trng.collapse(true);bp=Math.abs(trng.move('character',xx));trng=rng.duplicate();trng.collapse(true);sp=Math.abs(trng.move('character',xx));trng=rng.duplicate();trng.collapse(false);le=Math.abs(trng.move('character',xx))-sp;return{start:sp-bp,length:le,scrollX:sx,scrollY:sy}}}else{s=this.getSel();e=this.getFocusElement();if(!s)return null;if(e&&e.nodeName=='IMG'){return{start:-1,end:-1,index:sp,scrollX:sx,scrollY:sy}}if(s.anchorNode==s.focusNode&&s.anchorOffset==s.focusOffset){e=this._getPosText(b,s.anchorNode,s.focusNode);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+s.anchorOffset,end:e.end+s.focusOffset,scrollX:sx,scrollY:sy}}else{e=this._getPosText(b,rng.startContainer,rng.endContainer);if(!e)return{scrollX:sx,scrollY:sy};return{start:e.start+rng.startOffset,end:e.end+rng.endOffset,scrollX:sx,scrollY:sy}}}return null},moveToBookmark:function(bookmark){var inst=this.instance,rng,nl,i,ex,b=inst.getBody(),sd;var doc=inst.getDoc(),win=inst.getWin(),sel=this.getSel();if(!bookmark)return false;if(tinyMCE.isSafari&&bookmark.rng){sel.setBaseAndExtent(bookmark.rng.startContainer,bookmark.rng.startOffset,bookmark.rng.endContainer,bookmark.rng.endOffset);return true}if(tinyMCE.isRealIE){if(bookmark.rng){try{bookmark.rng.select()}catch(ex){}return true}win.focus();if(bookmark.tag){rng=b.createControlRange();nl=b.getElementsByTagName(bookmark.tag);if(nl.length>bookmark.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(!sel)return false;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);if(!tinyMCE.isOpera)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,[],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.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);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();if(s.rangeCount>0)return s.getRangeAt(0);return null},isCollapsed:function(){var r=this.getRng();if(r.item)return false;return r.boundingWidth==0||this.getSel().isCollapsed},collapse:function(b){var r=this.getRng(),s=this.getSel();if(r.select){r.collapse(b);r.select()}else{if(b)s.collapseToStart();else s.collapseToEnd()}},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=[];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){inst.isNotDirty=false;tinyMCE.dispatchCallback(inst,'onchange_callback','onChange',inst);customUndoLevels=tinyMCE.settings.custom_undo_redo_levels;if(customUndoLevels!=-1&&this.undoLevels.length>customUndoLevels){for(i=0;i<this.undoLevels.length-1;i++)this.undoLevels[i]=this.undoLevels[i+1];this.undoLevels.length--;this.undoIndex--;}b=inst.undoBookmark;if(!b)b=inst.selection.getBookmark();this.undoIndex++;this.undoLevels[this.undoIndex]={content:newHTML,bookmark:b};ul=tinyMCE.undoLevels;for(i=tinyMCE.undoIndex+1;i<ul.length;i++){ur=ul[i].undoRedo;if(ur.undoIndex==ur.undoLevels.length-1)ur.undoIndex--;ur.undoLevels.length--}tinyMCE.undoLevels[tinyMCE.undoIndex++]=inst;tinyMCE.undoLevels.length=tinyMCE.undoIndex;this.undoLevels.length=this.undoIndex+1;return true}return false},undo:function(){var inst=this.instance;if(this.undoIndex>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()}};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,i;function isEmpty(para){var nodes;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;nodes=tinyMCE.getNodeTree(para,[],3);for(i=0;i<nodes.length;i++){if(!isEmptyHTML(nodes[i].nodeValue))return false}return true}rngBefore=doc.createRange();rngBefore.setStart(sel.anchorNode,sel.anchorOffset);rngBefore.collapse(true);rngAfter=doc.createRange();rngAfter.setStart(sel.focusNode,sel.focusOffset);rngAfter.collapse(true);direct=rngBefore.compareBoundaryPoints(rngBefore.START_TO_END,rngAfter)<0;startNode=direct?sel.anchorNode:sel.focusNode;startOffset=direct?sel.anchorOffset:sel.focusOffset;endNode=direct?sel.focusNode:sel.anchorNode;endOffset=direct?sel.focusOffset:sel.anchorOffset;startNode=startNode.nodeName=="BODY"?startNode.firstChild:startNode;endNode=endNode.nodeName=="BODY"?endNode.firstChild:endNode;startBlock=inst.getParentBlockElement(startNode);endBlock=inst.getParentBlockElement(endNode);if(startBlock&&(startBlock.nodeName=='CAPTION'||/absolute|relative|static/gi.test(startBlock.style.position)))startBlock=null;if(endBlock&&(endBlock.nodeName=='CAPTION'||/absolute|relative|static/gi.test(endBlock.style.position)))endBlock=null;if(startBlock!=null){blockName=startBlock.nodeName;if(/(TD|TABLE|TH|CAPTION)/.test(blockName)||(blockName=="DIV"&&/left|right/gi.test(startBlock.style.cssFloat)))blockName="P"}if(tinyMCE.getParentElement(startBlock,"OL,UL",null,body)!=null)return false;if((startBlock!=null&&startBlock.nodeName=="TABLE")||(endBlock!=null&&endBlock.nodeName=="TABLE"))startBlock=endBlock=null;paraBefore=(startBlock!=null&&startBlock.nodeName==blockName)?startBlock.cloneNode(false):doc.createElement(blockName);paraAfter=(endBlock!=null&&endBlock.nodeName==blockName)?endBlock.cloneNode(false):doc.createElement(blockName);if(/^(H[1-6])$/.test(blockName))paraAfter=doc.createElement("p");startChop=startNode;endChop=endNode;node=startChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;startChop=node}while((node=node.previousSibling?node.previousSibling:node.parentNode));node=endChop;do{if(node==body||node.nodeType==9||tinyMCE.isBlockElement(node))break;endChop=node}while((node=node.nextSibling?node.nextSibling:node.parentNode));if(startChop.nodeName=="TD")startChop=startChop.firstChild;if(endChop.nodeName=="TD")endChop=endChop.lastChild;if(startBlock==null){rng.deleteContents();if(!tinyMCE.isSafari)sel.removeAllRanges();if(startChop!=rootElm&&endChop!=rootElm){rngBefore=rng.cloneRange();if(startChop==body)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);paraBefore.appendChild(rngBefore.cloneContents());if(endChop.parentNode.nodeName==blockName)endChop=endChop.parentNode;rng.setEndAfter(endChop);if(endChop.nodeName!="#text"&&endChop.nodeName!="BODY")rngBefore.setEndAfter(endChop);contents=rng.cloneContents();if(contents.firstChild&&(contents.firstChild.nodeName==blockName||contents.firstChild.nodeName=="BODY"))paraAfter.innerHTML=contents.firstChild.innerHTML;else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";rng.deleteContents();rngAfter.deleteContents();rngBefore.deleteContents();if(tinyMCE.isOpera){paraBefore.normalize();rngBefore.insertNode(paraBefore);paraAfter.normalize();rngBefore.insertNode(paraAfter)}else{paraAfter.normalize();rngBefore.insertNode(paraAfter);paraBefore.normalize();rngBefore.insertNode(paraBefore)}}else{body.innerHTML="<"+blockName+">&nbsp;</"+blockName+"><"+blockName+">&nbsp;</"+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="&nbsp;";if(isEmpty(paraAfter))paraAfter.innerHTML="&nbsp;";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),e=this.getElement(),x,y;var w=parseInt(re.offsetWidth),h=parseInt(re.offsetHeight);var ew=parseInt(e.offsetWidth),eh=parseInt(e.offsetHeight);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(){var el=this.getElement();if(el){el.style.display='block';this.updateBlocker()}},hide:function(){var el=this.getElement();if(el){el.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)},remove:function(){var e=this.getElement(),b=this.getBlocker();if(e)e.parentNode.removeChild(e);if(b)b.parentNode.removeChild(b)}};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=[];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=[]},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+='<span class="mceMenuLine"></span>';h+='<table border="0" cellpadding="0" cellspacing="0">';for(i=0;i<m.length;i++){t=tinyMCE.xmlEncode(m[i].text);c=m[i].class_name?' class="'+m[i].class_name+'"':'';switch(m[i].type){case'separator':h+='<tr class="'+s.separator_class+'"><td>';break;case'title':h+='<tr class="'+s.title_class+'"><td><span'+c+'>'+t+'</span>';break;case'disabled':h+='<tr class="'+s.disabled_class+'"><td><span'+c+'>'+t+'</span>';break;default:h+='<tr><td><a href="'+tinyMCE.xmlEncode(m[i].js)+'" onmousedown="'+tinyMCE.xmlEncode(m[i].js)+';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span'+c+'>'+t+'</span></a>'}h+='</td></tr>'}h+='</table>';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}});tinyMCE.add(TinyMCE_Engine,{debug:function(){var m="",a,i,l=tinyMCE.log.length;for(i=0,a=this.debug.arguments;i<a.length;i++){m+=a[i];if(i<a.length-1)m+=', '}if(l<1000)tinyMCE.log[l]="[debug] "+m}});
\ No newline at end of file
diff --git a/media/tiny_mce/tiny_mce_popup.js b/media/tiny_mce/tiny_mce_popup.js
new file mode 100755 (executable)
index 0000000..eecad28
--- /dev/null
@@ -0,0 +1,294 @@
+// Some global instances, this will be filled later\r
+var tinyMCE = null, tinyMCELang = null;\r
+\r
+function TinyMCE_Popup() {\r
+};\r
+\r
+TinyMCE_Popup.prototype = {\r
+       findWin : function(w) {\r
+               var c;\r
+\r
+               // Check parents\r
+               c = w;\r
+               while (c && (c = c.parent) != null) {\r
+                       if (typeof(c.tinyMCE) != "undefined")\r
+                               return c;\r
+               }\r
+\r
+               // Check openers\r
+               c = w;\r
+               while (c && (c = c.opener) != null) {\r
+                       if (typeof(c.tinyMCE) != "undefined")\r
+                               return c;\r
+               }\r
+\r
+               // Try top\r
+               if (typeof(top.tinyMCE) != "undefined")\r
+                       return top;\r
+\r
+               return null;\r
+       },\r
+\r
+       init : function() {\r
+               var win = window.opener ? window.opener : window.dialogArguments, c;\r
+               var inst, re, title, divElm;\r
+\r
+               if (!win)\r
+                       win = this.findWin(window);\r
+\r
+               if (!win) {\r
+                       alert("tinyMCE object reference not found from popup.");\r
+                       return;\r
+               }\r
+\r
+               window.opener = win;\r
+               this.windowOpener = win;\r
+               this.onLoadEval = "";\r
+\r
+               // Setup parent references\r
+               tinyMCE = win.tinyMCE;\r
+               tinyMCELang = win.tinyMCELang;\r
+\r
+               inst = tinyMCE.selectedInstance;\r
+               this.isWindow = tinyMCE.getWindowArg('mce_inside_iframe', false) == false;\r
+               this.storeSelection = (tinyMCE.isRealIE) && !this.isWindow && tinyMCE.getWindowArg('mce_store_selection', true);\r
+\r
+               if (this.isWindow)\r
+                       window.focus();\r
+\r
+               // Store selection\r
+               if (this.storeSelection)\r
+                       inst.selectionBookmark = inst.selection.getBookmark(true);\r
+\r
+               // Setup dir\r
+               if (tinyMCELang.lang_dir)\r
+                       document.dir = tinyMCELang.lang_dir;\r
+\r
+               // Setup title\r
+               re = new RegExp('{|\\\$|}', 'g');\r
+               title = document.title.replace(re, "");\r
+               if (typeof(tinyMCELang[title]) != "undefined") {\r
+                       divElm = document.createElement("div");\r
+                       divElm.innerHTML = tinyMCELang[title];\r
+                       document.title = divElm.innerHTML;\r
+\r
+                       if (typeof(tinyMCE.setWindowTitle) != 'undefined')\r
+                               tinyMCE.setWindowTitle(window, divElm.innerHTML);\r
+               }\r
+\r
+               // Output Popup CSS class\r
+               document.write('<link href="' + tinyMCE.getParam("popups_css") + '" rel="stylesheet" type="text/css">');\r
+\r
+               if (tinyMCE.getParam("popups_css_add")) {\r
+                       c = tinyMCE.getParam("popups_css_add");\r
+\r
+                       // Is relative\r
+                       if (c.indexOf('://') == -1 && c.charAt(0) != '/')\r
+                               c = tinyMCE.documentBasePath + "/" + c;\r
+\r
+                       document.write('<link href="' + c + '" rel="stylesheet" type="text/css">');\r
+               }\r
+\r
+               tinyMCE.addEvent(window, "load", this.onLoad);\r
+       },\r
+\r
+       onLoad : function() {\r
+               var dir, i, elms, body = document.body;\r
+\r
+               if (tinyMCE.getWindowArg('mce_replacevariables', true))\r
+                       body.innerHTML = tinyMCE.applyTemplate(body.innerHTML, tinyMCE.windowArgs);\r
+\r
+               dir = tinyMCE.selectedInstance.settings.directionality;\r
+               if (dir == "rtl" && document.forms && document.forms.length > 0) {\r
+                       elms = document.forms[0].elements;\r
+                       for (i=0; i<elms.length; i++) {\r
+                               if ((elms[i].type == "text" || elms[i].type == "textarea") && elms[i].getAttribute("dir") != "ltr")\r
+                                       elms[i].dir = dir;\r
+                       }\r
+               }\r
+\r
+               if (body.style.display == 'none')\r
+                       body.style.display = 'block';\r
+\r
+               // Execute real onload (Opera fix)\r
+               if (tinyMCEPopup.onLoadEval !== '')\r
+                       eval(tinyMCEPopup.onLoadEval);\r
+       },\r
+\r
+       executeOnLoad : function(str) {\r
+               if (tinyMCE.isOpera)\r
+                       this.onLoadEval = str;\r
+               else\r
+                       eval(str);\r
+       },\r
+\r
+       resizeToInnerSize : function() {\r
+               var i, doc, body, oldMargin, wrapper, iframe, nodes, dx, dy;\r
+\r
+               // Netscape 7.1 workaround\r
+               if (this.isWindow && tinyMCE.isNS71) {\r
+                       window.resizeBy(0, 10);\r
+                       return;\r
+               }\r
+\r
+               if (this.isWindow) {\r
+                       doc = document;\r
+                       body = doc.body;\r
+\r
+                       if (body.style.display == 'none')\r
+                               body.style.display = 'block';\r
+\r
+                       // Remove margin\r
+                       oldMargin = body.style.margin;\r
+                       body.style.margin = '0';\r
+\r
+                       // Create wrapper\r
+                       wrapper = doc.createElement("div");\r
+                       wrapper.id = 'mcBodyWrapper';\r
+                       wrapper.style.display = 'none';\r
+                       wrapper.style.margin = '0';\r
+\r
+                       // Wrap body elements\r
+                       nodes = doc.body.childNodes;\r
+                       for (i=nodes.length-1; i>=0; i--) {\r
+                               if (wrapper.hasChildNodes())\r
+                                       wrapper.insertBefore(nodes[i].cloneNode(true), wrapper.firstChild);\r
+                               else\r
+                                       wrapper.appendChild(nodes[i].cloneNode(true));\r
+\r
+                               nodes[i].parentNode.removeChild(nodes[i]);\r
+                       }\r
+\r
+                       // Add wrapper\r
+                       doc.body.appendChild(wrapper);\r
+\r
+                       // Create iframe\r
+                       iframe = document.createElement("iframe");\r
+                       iframe.id = "mcWinIframe";\r
+                       iframe.src = document.location.href.toLowerCase().indexOf('https') == -1 ? "about:blank" : tinyMCE.settings.default_document;\r
+                       iframe.width = "100%";\r
+                       iframe.height = "100%";\r
+                       iframe.style.margin = '0';\r
+\r
+                       // Add iframe\r
+                       doc.body.appendChild(iframe);\r
+\r
+                       // Measure iframe\r
+                       iframe = document.getElementById('mcWinIframe');\r
+                       dx = tinyMCE.getWindowArg('mce_width') - iframe.clientWidth;\r
+                       dy = tinyMCE.getWindowArg('mce_height') - iframe.clientHeight;\r
+\r
+                       // Resize window\r
+                       // tinyMCE.debug(tinyMCE.getWindowArg('mce_width') + "," + tinyMCE.getWindowArg('mce_height') + " - " + dx + "," + dy);\r
+                       window.resizeBy(dx, dy);\r
+\r
+                       // Hide iframe and show wrapper\r
+                       body.style.margin = oldMargin;\r
+                       iframe.style.display = 'none';\r
+                       wrapper.style.display = 'block';\r
+               }\r
+       },\r
+\r
+       resizeToContent : function() {\r
+               var isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+               var isOpera = (navigator.userAgent.indexOf("Opera") != -1);\r
+               var elm, width, height, x, y, dx, dy;\r
+\r
+               if (isOpera)\r
+                       return;\r
+\r
+               if (isMSIE) {\r
+                       try { window.resizeTo(10, 10); } catch (e) {}\r
+\r
+                       elm = document.body;\r
+                       width = elm.offsetWidth;\r
+                       height = elm.offsetHeight;\r
+                       dx = (elm.scrollWidth - width) + 4;\r
+                       dy = elm.scrollHeight - height;\r
+\r
+                       try { window.resizeBy(dx, dy); } catch (e) {}\r
+               } else {\r
+                       window.scrollBy(1000, 1000);\r
+                       if (window.scrollX > 0 || window.scrollY > 0) {\r
+                               window.resizeBy(window.innerWidth * 2, window.innerHeight * 2);\r
+                               window.sizeToContent();\r
+                               window.scrollTo(0, 0);\r
+                               x = parseInt(screen.width / 2.0) - (window.outerWidth / 2.0);\r
+                               y = parseInt(screen.height / 2.0) - (window.outerHeight / 2.0);\r
+                               window.moveTo(x, y);\r
+                       }\r
+               }\r
+       },\r
+\r
+       getWindowArg : function(name, default_value) {\r
+               return tinyMCE.getWindowArg(name, default_value);\r
+       },\r
+\r
+       restoreSelection : function() {\r
+               var inst;\r
+\r
+               if (this.storeSelection) {\r
+                       inst = tinyMCE.selectedInstance;\r
+\r
+                       inst.getWin().focus();\r
+\r
+                       if (inst.selectionBookmark)\r
+                               inst.selection.moveToBookmark(inst.selectionBookmark);\r
+               }\r
+       },\r
+\r
+       execCommand : function(command, user_interface, value) {\r
+               var inst = tinyMCE.selectedInstance;\r
+\r
+               this.restoreSelection();\r
+               inst.execCommand(command, user_interface, value);\r
+\r
+               // Store selection\r
+               if (this.storeSelection)\r
+                       inst.selectionBookmark = inst.selection.getBookmark(true);\r
+       },\r
+\r
+       close : function() {\r
+               tinyMCE.closeWindow(window);\r
+       },\r
+\r
+       pickColor : function(e, element_id) {\r
+               tinyMCE.selectedInstance.execCommand('mceColorPicker', true, {\r
+                       element_id : element_id,\r
+                       document : document,\r
+                       window : window,\r
+                       store_selection : false\r
+               });\r
+       },\r
+\r
+       openBrowser : function(element_id, type, option) {\r
+               var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));\r
+               var url = document.getElementById(element_id).value;\r
+\r
+               tinyMCE.setWindowArg("window", window);\r
+               tinyMCE.setWindowArg("document", document);\r
+\r
+               // Call to external callback\r
+               if (eval('typeof(tinyMCEPopup.windowOpener.' + cb + ')') == "undefined")\r
+                       alert("Callback function: " + cb + " could not be found.");\r
+               else\r
+                       eval("tinyMCEPopup.windowOpener." + cb + "(element_id, url, type, window);");\r
+       },\r
+\r
+       importClass : function(c) {\r
+               var n;\r
+\r
+               window[c] = function() {};\r
+\r
+               for (n in window.opener[c].prototype)\r
+                       window[c].prototype[n] = window.opener[c].prototype[n];\r
+\r
+               window[c].constructor = window.opener[c].constructor;\r
+       }\r
+\r
+       };\r
+\r
+// Setup global instance\r
+var tinyMCEPopup = new TinyMCE_Popup();\r
+\r
+tinyMCEPopup.init();\r
diff --git a/media/tiny_mce/tiny_mce_src.js b/media/tiny_mce/tiny_mce_src.js
new file mode 100755 (executable)
index 0000000..ba713a8
--- /dev/null
@@ -0,0 +1,7571 @@
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Engine.class.js */\r
+\r
+function TinyMCE_Engine() {\r
+       var ua;\r
+\r
+       this.majorVersion = "2";\r
+       this.minorVersion = "1.1.1";\r
+       this.releaseDate = "2007-05-14";\r
+\r
+       this.instances = [];\r
+       this.switchClassCache = [];\r
+       this.windowArgs = [];\r
+       this.loadedFiles = [];\r
+       this.pendingFiles = [];\r
+       this.loadingIndex = 0;\r
+       this.configs = [];\r
+       this.currentConfig = 0;\r
+       this.eventHandlers = [];\r
+       this.log = [];\r
+       this.undoLevels = [];\r
+       this.undoIndex = 0;\r
+       this.typingUndoIndex = -1;\r
+       this.settings = [];\r
+\r
+       // Browser check\r
+       ua = navigator.userAgent;\r
+       this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");\r
+       this.isMSIE5 = this.isMSIE && (ua.indexOf('MSIE 5') != -1);\r
+       this.isMSIE5_0 = this.isMSIE && (ua.indexOf('MSIE 5.0') != -1);\r
+       this.isMSIE7 = this.isMSIE && (ua.indexOf('MSIE 7') != -1);\r
+       this.isGecko = ua.indexOf('Gecko') != -1; // Will also be true on Safari\r
+       this.isSafari = ua.indexOf('Safari') != -1;\r
+       this.isOpera = window['opera'] && opera.buildNumber ? true : false;\r
+       this.isMac = ua.indexOf('Mac') != -1;\r
+       this.isNS7 = ua.indexOf('Netscape/7') != -1;\r
+       this.isNS71 = ua.indexOf('Netscape/7.1') != -1;\r
+       this.dialogCounter = 0;\r
+       this.plugins = [];\r
+       this.themes = [];\r
+       this.menus = [];\r
+       this.loadedPlugins = [];\r
+       this.buttonMap = [];\r
+       this.isLoaded = false;\r
+\r
+       // Fake MSIE on Opera and if Opera fakes IE, Gecko or Safari cancel those\r
+       if (this.isOpera) {\r
+               this.isMSIE = true;\r
+               this.isGecko = false;\r
+               this.isSafari =  false;\r
+       }\r
+\r
+       this.isIE = this.isMSIE;\r
+       this.isRealIE = this.isMSIE && !this.isOpera;\r
+\r
+       // TinyMCE editor id instance counter\r
+       this.idCounter = 0;\r
+};\r
+\r
+TinyMCE_Engine.prototype = {\r
+       init : function(settings) {\r
+               var theme, nl, baseHREF = "", i, cssPath, entities, h, p, src, elements = [], head;\r
+\r
+               // 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.\r
+               if (this.isMSIE5_0)\r
+                       return;\r
+\r
+               this.settings = settings;\r
+\r
+               // Check if valid browser has execcommand support\r
+               if (typeof(document.execCommand) == 'undefined')\r
+                       return;\r
+\r
+               // Get script base path\r
+               if (!tinyMCE.baseURL) {\r
+                       // Search through head\r
+                       head = document.getElementsByTagName('head')[0];\r
+\r
+                       if (head) {\r
+                               for (i=0, nl = head.getElementsByTagName('script'); i<nl.length; i++)\r
+                                       elements.push(nl[i]);\r
+                       }\r
+\r
+                       // Search through rest of document\r
+                       for (i=0, nl = document.getElementsByTagName('script'); i<nl.length; i++)\r
+                               elements.push(nl[i]);\r
+\r
+                       // If base element found, add that infront of baseURL\r
+                       nl = document.getElementsByTagName('base');\r
+                       for (i=0; i<nl.length; i++) {\r
+                               if (nl[i].href)\r
+                                       baseHREF = nl[i].href;\r
+                       }\r
+\r
+                       for (i=0; i<elements.length; i++) {\r
+                               if (elements[i].src && (elements[i].src.indexOf("tiny_mce.js") != -1 || elements[i].src.indexOf("tiny_mce_dev.js") != -1 || elements[i].src.indexOf("tiny_mce_src.js") != -1 || elements[i].src.indexOf("tiny_mce_gzip") != -1)) {\r
+                                       src = elements[i].src;\r
+\r
+                                       tinyMCE.srcMode = (src.indexOf('_src') != -1 || src.indexOf('_dev') != -1) ? '_src' : '';\r
+                                       tinyMCE.gzipMode = src.indexOf('_gzip') != -1;\r
+                                       src = src.substring(0, src.lastIndexOf('/'));\r
+\r
+                                       if (settings.exec_mode == "src" || settings.exec_mode == "normal")\r
+                                               tinyMCE.srcMode = settings.exec_mode == "src" ? '_src' : '';\r
+\r
+                                       // Force it absolute if page has a base href\r
+                                       if (baseHREF !== '' && src.indexOf('://') == -1)\r
+                                               tinyMCE.baseURL = baseHREF + src;\r
+                                       else\r
+                                               tinyMCE.baseURL = src;\r
+\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // Get document base path\r
+               this.documentBasePath = document.location.href;\r
+               if (this.documentBasePath.indexOf('?') != -1)\r
+                       this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.indexOf('?'));\r
+               this.documentURL = this.documentBasePath;\r
+               this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.lastIndexOf('/'));\r
+\r
+               // If not HTTP absolute\r
+               if (tinyMCE.baseURL.indexOf('://') == -1 && tinyMCE.baseURL.charAt(0) != '/') {\r
+                       // If site absolute\r
+                       tinyMCE.baseURL = this.documentBasePath + "/" + tinyMCE.baseURL;\r
+               }\r
+\r
+               // Set default values on settings\r
+               this._def("mode", "none");\r
+               this._def("theme", "advanced");\r
+               this._def("plugins", "", true);\r
+               this._def("language", "en");\r
+               this._def("docs_language", this.settings.language);\r
+               this._def("elements", "");\r
+               this._def("textarea_trigger", "mce_editable");\r
+               this._def("editor_selector", "");\r
+               this._def("editor_deselector", "mceNoEditor");\r
+               this._def("valid_elements", "+a[id|style|rel|rev|charset|hreflang|dir|lang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],-strong/-b[class|style],-em/-i[class|style],-strike[class|style],-u[class|style],#p[id|style|dir|class|align],-ol[class|style],-ul[class|style],-li[class|style],br,img[id|dir|lang|longdesc|usemap|style|class|src|onmouseover|onmouseout|border|alt=|title|hspace|vspace|width|height|align],-sub[style|class],-sup[style|class],-blockquote[dir|style],-table[border=0|cellspacing|cellpadding|width|height|class|align|summary|style|dir|id|lang|bgcolor|background|bordercolor],-tr[id|lang|dir|class|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor],tbody[id|class],thead[id|class],tfoot[id|class],#td[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|bgcolor|background|bordercolor|scope],-th[id|lang|dir|class|colspan|rowspan|width|height|align|valign|style|scope],caption[id|lang|dir|class|style],-div[id|dir|class|align|style],-span[style|class|align],-pre[class|align|style],address[class|align|style],-h1[id|style|dir|class|align],-h2[id|style|dir|class|align],-h3[id|style|dir|class|align],-h4[id|style|dir|class|align],-h5[id|style|dir|class|align],-h6[id|style|dir|class|align],hr[class|style],-font[face|size|style|id|class|dir|color],dd[id|class|title|style|dir|lang],dl[id|class|title|style|dir|lang],dt[id|class|title|style|dir|lang],cite[title|id|class|style|dir|lang],abbr[title|id|class|style|dir|lang],acronym[title|id|class|style|dir|lang],del[title|id|class|style|dir|lang|datetime|cite],ins[title|id|class|style|dir|lang|datetime|cite]");\r
+               this._def("extended_valid_elements", "");\r
+               this._def("invalid_elements", "");\r
+               this._def("encoding", "");\r
+               this._def("urlconverter_callback", tinyMCE.getParam("urlconvertor_callback", "TinyMCE_Engine.prototype.convertURL"));\r
+               this._def("save_callback", "");\r
+               this._def("force_br_newlines", false);\r
+               this._def("force_p_newlines", true);\r
+               this._def("add_form_submit_trigger", true);\r
+               this._def("relative_urls", true);\r
+               this._def("remove_script_host", true);\r
+               this._def("focus_alert", true);\r
+               this._def("document_base_url", this.documentURL);\r
+               this._def("visual", true);\r
+               this._def("visual_table_class", "mceVisualAid");\r
+               this._def("setupcontent_callback", "");\r
+               this._def("fix_content_duplication", true);\r
+               this._def("custom_undo_redo", true);\r
+               this._def("custom_undo_redo_levels", -1);\r
+               this._def("custom_undo_redo_keyboard_shortcuts", true);\r
+               this._def("custom_undo_redo_restore_selection", true);\r
+               this._def("custom_undo_redo_global", false);\r
+               this._def("verify_html", true);\r
+               this._def("apply_source_formatting", false);\r
+               this._def("directionality", "ltr");\r
+               this._def("cleanup_on_startup", false);\r
+               this._def("inline_styles", false);\r
+               this._def("convert_newlines_to_brs", false);\r
+               this._def("auto_reset_designmode", true);\r
+               this._def("entities", "39,#39,160,nbsp,161,iexcl,162,cent,163,pound,164,curren,165,yen,166,brvbar,167,sect,168,uml,169,copy,170,ordf,171,laquo,172,not,173,shy,174,reg,175,macr,176,deg,177,plusmn,178,sup2,179,sup3,180,acute,181,micro,182,para,183,middot,184,cedil,185,sup1,186,ordm,187,raquo,188,frac14,189,frac12,190,frac34,191,iquest,192,Agrave,193,Aacute,194,Acirc,195,Atilde,196,Auml,197,Aring,198,AElig,199,Ccedil,200,Egrave,201,Eacute,202,Ecirc,203,Euml,204,Igrave,205,Iacute,206,Icirc,207,Iuml,208,ETH,209,Ntilde,210,Ograve,211,Oacute,212,Ocirc,213,Otilde,214,Ouml,215,times,216,Oslash,217,Ugrave,218,Uacute,219,Ucirc,220,Uuml,221,Yacute,222,THORN,223,szlig,224,agrave,225,aacute,226,acirc,227,atilde,228,auml,229,aring,230,aelig,231,ccedil,232,egrave,233,eacute,234,ecirc,235,euml,236,igrave,237,iacute,238,icirc,239,iuml,240,eth,241,ntilde,242,ograve,243,oacute,244,ocirc,245,otilde,246,ouml,247,divide,248,oslash,249,ugrave,250,uacute,251,ucirc,252,uuml,253,yacute,254,thorn,255,yuml,402,fnof,913,Alpha,914,Beta,915,Gamma,916,Delta,917,Epsilon,918,Zeta,919,Eta,920,Theta,921,Iota,922,Kappa,923,Lambda,924,Mu,925,Nu,926,Xi,927,Omicron,928,Pi,929,Rho,931,Sigma,932,Tau,933,Upsilon,934,Phi,935,Chi,936,Psi,937,Omega,945,alpha,946,beta,947,gamma,948,delta,949,epsilon,950,zeta,951,eta,952,theta,953,iota,954,kappa,955,lambda,956,mu,957,nu,958,xi,959,omicron,960,pi,961,rho,962,sigmaf,963,sigma,964,tau,965,upsilon,966,phi,967,chi,968,psi,969,omega,977,thetasym,978,upsih,982,piv,8226,bull,8230,hellip,8242,prime,8243,Prime,8254,oline,8260,frasl,8472,weierp,8465,image,8476,real,8482,trade,8501,alefsym,8592,larr,8593,uarr,8594,rarr,8595,darr,8596,harr,8629,crarr,8656,lArr,8657,uArr,8658,rArr,8659,dArr,8660,hArr,8704,forall,8706,part,8707,exist,8709,empty,8711,nabla,8712,isin,8713,notin,8715,ni,8719,prod,8721,sum,8722,minus,8727,lowast,8730,radic,8733,prop,8734,infin,8736,ang,8743,and,8744,or,8745,cap,8746,cup,8747,int,8756,there4,8764,sim,8773,cong,8776,asymp,8800,ne,8801,equiv,8804,le,8805,ge,8834,sub,8835,sup,8836,nsub,8838,sube,8839,supe,8853,oplus,8855,otimes,8869,perp,8901,sdot,8968,lceil,8969,rceil,8970,lfloor,8971,rfloor,9001,lang,9002,rang,9674,loz,9824,spades,9827,clubs,9829,hearts,9830,diams,34,quot,38,amp,60,lt,62,gt,338,OElig,339,oelig,352,Scaron,353,scaron,376,Yuml,710,circ,732,tilde,8194,ensp,8195,emsp,8201,thinsp,8204,zwnj,8205,zwj,8206,lrm,8207,rlm,8211,ndash,8212,mdash,8216,lsquo,8217,rsquo,8218,sbquo,8220,ldquo,8221,rdquo,8222,bdquo,8224,dagger,8225,Dagger,8240,permil,8249,lsaquo,8250,rsaquo,8364,euro", true);\r
+               this._def("entity_encoding", "named");\r
+               this._def("cleanup_callback", "");\r
+               this._def("add_unload_trigger", true);\r
+               this._def("ask", false);\r
+               this._def("nowrap", false);\r
+               this._def("auto_resize", false);\r
+               this._def("auto_focus", false);\r
+               this._def("cleanup", true);\r
+               this._def("remove_linebreaks", true);\r
+               this._def("button_tile_map", false);\r
+               this._def("submit_patch", true);\r
+               this._def("browsers", "msie,safari,gecko,opera", true);\r
+               this._def("dialog_type", "window");\r
+               this._def("accessibility_warnings", true);\r
+               this._def("accessibility_focus", true);\r
+               this._def("merge_styles_invalid_parents", "");\r
+               this._def("force_hex_style_colors", true);\r
+               this._def("trim_span_elements", true);\r
+               this._def("convert_fonts_to_spans", false);\r
+               this._def("doctype", '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">');\r
+               this._def("font_size_classes", '');\r
+               this._def("font_size_style_values", 'xx-small,x-small,small,medium,large,x-large,xx-large', true);\r
+               this._def("event_elements", 'a,img', true);\r
+               this._def("convert_urls", true);\r
+               this._def("table_inline_editing", false);\r
+               this._def("object_resizing", true);\r
+               this._def("custom_shortcuts", true);\r
+               this._def("convert_on_click", false);\r
+               this._def("content_css", '');\r
+               this._def("fix_list_elements", true);\r
+               this._def("fix_table_elements", false);\r
+               this._def("strict_loading_mode", document.contentType == 'application/xhtml+xml');\r
+               this._def("hidden_tab_class", '');\r
+               this._def("display_tab_class", '');\r
+               this._def("gecko_spellcheck", false);\r
+               this._def("hide_selects_on_submit", true);\r
+               this._def("forced_root_block", false);\r
+               this._def("remove_trailing_nbsp", false);\r
+\r
+               // Force strict loading mode to false on non Gecko browsers\r
+               if (this.isMSIE && !this.isOpera)\r
+                       this.settings.strict_loading_mode = false;\r
+\r
+               // Browser check IE\r
+               if (this.isMSIE && this.settings.browsers.indexOf('msie') == -1)\r
+                       return;\r
+\r
+               // Browser check Gecko\r
+               if (this.isGecko && this.settings.browsers.indexOf('gecko') == -1)\r
+                       return;\r
+\r
+               // Browser check Safari\r
+               if (this.isSafari && this.settings.browsers.indexOf('safari') == -1)\r
+                       return;\r
+\r
+               // Browser check Opera\r
+               if (this.isOpera && this.settings.browsers.indexOf('opera') == -1)\r
+                       return;\r
+\r
+               // If not super absolute make it so\r
+               baseHREF = tinyMCE.settings.document_base_url;\r
+               h = document.location.href;\r
+               p = h.indexOf('://');\r
+               if (p > 0 && document.location.protocol != "file:") {\r
+                       p = h.indexOf('/', p + 3);\r
+                       h = h.substring(0, p);\r
+\r
+                       if (baseHREF.indexOf('://') == -1)\r
+                               baseHREF = h + baseHREF;\r
+\r
+                       tinyMCE.settings.document_base_url = baseHREF;\r
+                       tinyMCE.settings.document_base_prefix = h;\r
+               }\r
+\r
+               // Trim away query part\r
+               if (baseHREF.indexOf('?') != -1)\r
+                       baseHREF = baseHREF.substring(0, baseHREF.indexOf('?'));\r
+\r
+               this.settings.base_href = baseHREF.substring(0, baseHREF.lastIndexOf('/')) + "/";\r
+\r
+               theme = this.settings.theme;\r
+               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';\r
+               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';\r
+               this.blockElms = 'H[1-6]|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP';\r
+               this.blockRegExp = new RegExp("^(" + this.blockElms + ")$", "i");\r
+               this.posKeyCodes = [13,45,36,35,33,34,37,38,39,40];\r
+               this.uniqueURL = 'javascript:void(091039730);'; // Make unique URL non real URL\r
+               this.uniqueTag = '<div id="mceTMPElement" style="display: none">TMP</div>';\r
+               this.callbacks = ['onInit', 'getInfo', 'getEditorTemplate', 'setupContent', 'onChange', 'onPageLoad', 'handleNodeChange', 'initInstance', 'execCommand', 'getControlHTML', 'handleEvent', 'cleanup', 'removeInstance'];\r
+\r
+               // Theme url\r
+               this.settings.theme_href = tinyMCE.baseURL + "/themes/" + theme;\r
+\r
+               if (!tinyMCE.isIE || tinyMCE.isOpera)\r
+                       this.settings.force_br_newlines = false;\r
+\r
+               if (tinyMCE.getParam("popups_css", false)) {\r
+                       cssPath = tinyMCE.getParam("popups_css", "");\r
+\r
+                       // Is relative\r
+                       if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')\r
+                               this.settings.popups_css = this.documentBasePath + "/" + cssPath;\r
+                       else\r
+                               this.settings.popups_css = cssPath;\r
+               } else\r
+                       this.settings.popups_css = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_popup.css";\r
+\r
+               if (tinyMCE.getParam("editor_css", false)) {\r
+                       cssPath = tinyMCE.getParam("editor_css", "");\r
+\r
+                       // Is relative\r
+                       if (cssPath.indexOf('://') == -1 && cssPath.charAt(0) != '/')\r
+                               this.settings.editor_css = this.documentBasePath + "/" + cssPath;\r
+                       else\r
+                               this.settings.editor_css = cssPath;\r
+               } else {\r
+                       if (this.settings.editor_css !== '')\r
+                               this.settings.editor_css = tinyMCE.baseURL + "/themes/" + theme + "/css/editor_ui.css";\r
+               }\r
+\r
+               // Only do this once\r
+               if (this.configs.length == 0) {\r
+                       if (typeof(TinyMCECompressed) == "undefined") {\r
+                               tinyMCE.addEvent(window, "DOMContentLoaded", TinyMCE_Engine.prototype.onLoad);\r
+\r
+                               if (tinyMCE.isRealIE) {\r
+                                       if (document.body)\r
+                                               tinyMCE.addEvent(document.body, "readystatechange", TinyMCE_Engine.prototype.onLoad);\r
+                                       else\r
+                                               tinyMCE.addEvent(document, "readystatechange", TinyMCE_Engine.prototype.onLoad);\r
+                               }\r
+\r
+                               tinyMCE.addEvent(window, "load", TinyMCE_Engine.prototype.onLoad);\r
+                               tinyMCE._addUnloadEvents();\r
+                       }\r
+               }\r
+\r
+               this.loadScript(tinyMCE.baseURL + '/themes/' + this.settings.theme + '/editor_template' + tinyMCE.srcMode + '.js');\r
+               this.loadScript(tinyMCE.baseURL + '/langs/' + this.settings.language +  '.js');\r
+               this.loadCSS(this.settings.editor_css);\r
+\r
+               // Add plugins\r
+               p = tinyMCE.getParam('plugins', '', true, ',');\r
+               if (p.length > 0) {\r
+                       for (i=0; i<p.length; i++) {\r
+                               if (p[i].charAt(0) != '-')\r
+                                       this.loadScript(tinyMCE.baseURL + '/plugins/' + p[i] + '/editor_plugin' + tinyMCE.srcMode + '.js');\r
+                       }\r
+               }\r
+\r
+               // Setup entities\r
+               if (tinyMCE.getParam('entity_encoding') == 'named') {\r
+                       settings.cleanup_entities = [];\r
+                       entities = tinyMCE.getParam('entities', '', true, ',');\r
+                       for (i=0; i<entities.length; i+=2)\r
+                               settings.cleanup_entities['c' + entities[i]] = entities[i+1];\r
+               }\r
+\r
+               // Save away this config\r
+               settings.index = this.configs.length;\r
+               this.configs[this.configs.length] = settings;\r
+\r
+               // Start loading first one in chain\r
+               this.loadNextScript();\r
+\r
+               // Force flicker free CSS backgrounds in IE\r
+               if (this.isIE && !this.isOpera) {\r
+                       try {\r
+                               document.execCommand('BackgroundImageCache', false, true);\r
+                       } catch (e) {\r
+                               // Ignore\r
+                       }\r
+               }\r
+\r
+               // Setup XML encoding regexps\r
+               this.xmlEncodeRe = new RegExp('[<>&"]', 'g');\r
+       },\r
+\r
+       _addUnloadEvents : function() {\r
+               var st = tinyMCE.settings.add_unload_trigger;\r
+\r
+               if (tinyMCE.isIE) {\r
+                       if (st) {\r
+                               tinyMCE.addEvent(window, "unload", TinyMCE_Engine.prototype.unloadHandler);\r
+                               tinyMCE.addEvent(window.document, "beforeunload", TinyMCE_Engine.prototype.unloadHandler);\r
+                       }\r
+               } else {\r
+                       if (st)\r
+                               tinyMCE.addEvent(window, "unload", function () {tinyMCE.triggerSave(true, true);});\r
+               }\r
+       },\r
+\r
+       _def : function(key, def_val, t) {\r
+               var v = tinyMCE.getParam(key, def_val);\r
+\r
+               v = t ? v.replace(/\s+/g, "") : v;\r
+\r
+               this.settings[key] = v;\r
+       },\r
+\r
+       hasPlugin : function(n) {\r
+               return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;\r
+       },\r
+\r
+       addPlugin : function(n, p) {\r
+               var op = this.plugins[n];\r
+\r
+               // Use the previous plugin object base URL used when loading external plugins\r
+               p.baseURL = op ? op.baseURL : tinyMCE.baseURL + "/plugins/" + n;\r
+               this.plugins[n] = p;\r
+\r
+               this.loadNextScript();\r
+       },\r
+\r
+       setPluginBaseURL : function(n, u) {\r
+               var op = this.plugins[n];\r
+\r
+               if (op)\r
+                       op.baseURL = u;\r
+               else\r
+                       this.plugins[n] = {baseURL : u};\r
+       },\r
+\r
+       loadPlugin : function(n, u) {\r
+               u = u.indexOf('.js') != -1 ? u.substring(0, u.lastIndexOf('/')) : u;\r
+               u = u.charAt(u.length-1) == '/' ? u.substring(0, u.length-1) : u;\r
+               this.plugins[n] = {baseURL : u};\r
+               this.loadScript(u + "/editor_plugin" + (tinyMCE.srcMode ? '_src' : '') + ".js");\r
+       },\r
+\r
+       hasTheme : function(n) {\r
+               return typeof(this.themes[n]) != "undefined" && this.themes[n] != null;\r
+       },\r
+\r
+       addTheme : function(n, t) {\r
+               this.themes[n] = t;\r
+\r
+               this.loadNextScript();\r
+       },\r
+\r
+       addMenu : function(n, m) {\r
+               this.menus[n] = m;\r
+       },\r
+\r
+       hasMenu : function(n) {\r
+               return typeof(this.plugins[n]) != "undefined" && this.plugins[n] != null;\r
+       },\r
+\r
+       loadScript : function(url) {\r
+               var i;\r
+\r
+               for (i=0; i<this.loadedFiles.length; i++) {\r
+                       if (this.loadedFiles[i] == url)\r
+                               return;\r
+               }\r
+\r
+               if (tinyMCE.settings.strict_loading_mode)\r
+                       this.pendingFiles[this.pendingFiles.length] = url;\r
+               else\r
+                       document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></script>');\r
+\r
+               this.loadedFiles[this.loadedFiles.length] = url;\r
+       },\r
+\r
+       loadNextScript : function() {\r
+               var d = document, se;\r
+\r
+               if (!tinyMCE.settings.strict_loading_mode)\r
+                       return;\r
+\r
+               if (this.loadingIndex < this.pendingFiles.length) {\r
+                       se = d.createElementNS('http://www.w3.org/1999/xhtml', 'script');\r
+                       se.setAttribute('language', 'javascript');\r
+                       se.setAttribute('type', 'text/javascript');\r
+                       se.setAttribute('src', this.pendingFiles[this.loadingIndex++]);\r
+\r
+                       d.getElementsByTagName("head")[0].appendChild(se);\r
+               } else\r
+                       this.loadingIndex = -1; // Done with loading\r
+       },\r
+\r
+       loadCSS : function(url) {\r
+               var ar = url.replace(/\s+/, '').split(',');\r
+               var lflen = 0, csslen = 0, skip = false;\r
+               var x = 0, i = 0, nl, le;\r
+\r
+               for (x = 0,csslen = ar.length; x<csslen; x++) {\r
+                       if (ar[x] != null && ar[x] != 'null' && ar[x].length > 0) {\r
+                               /* Make sure it doesn't exist. */\r
+                               for (i=0, lflen=this.loadedFiles.length; i<lflen; i++) {\r
+                                       if (this.loadedFiles[i] == ar[x]) {\r
+                                               skip = true;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               if (!skip) {\r
+                                       if (tinyMCE.settings.strict_loading_mode) {\r
+                                               nl = document.getElementsByTagName("head");\r
+\r
+                                               le = document.createElement('link');\r
+                                               le.setAttribute('href', ar[x]);\r
+                                               le.setAttribute('rel', 'stylesheet');\r
+                                               le.setAttribute('type', 'text/css');\r
+\r
+                                               nl[0].appendChild(le);                  \r
+                                       } else\r
+                                               document.write('<link href="' + ar[x] + '" rel="stylesheet" type="text/css" />');\r
+\r
+                                       this.loadedFiles[this.loadedFiles.length] = ar[x];\r
+                               }\r
+                       }\r
+               }\r
+       },\r
+\r
+       importCSS : function(doc, css) {\r
+               var css_ary = css.replace(/\s+/, '').split(',');\r
+               var csslen, elm, headArr, x, css_file;\r
+\r
+               for (x = 0, csslen = css_ary.length; x<csslen; x++) {\r
+                       css_file = css_ary[x];\r
+\r
+                       if (css_file != null && css_file != 'null' && css_file.length > 0) {\r
+                               // Is relative, make absolute\r
+                               if (css_file.indexOf('://') == -1 && css_file.charAt(0) != '/')\r
+                                       css_file = this.documentBasePath + "/" + css_file;\r
+\r
+                               if (typeof(doc.createStyleSheet) == "undefined") {\r
+                                       elm = doc.createElement("link");\r
+\r
+                                       elm.rel = "stylesheet";\r
+                                       elm.href = css_file;\r
+\r
+                                       if ((headArr = doc.getElementsByTagName("head")) != null && headArr.length > 0)\r
+                                               headArr[0].appendChild(elm);\r
+                               } else\r
+                                       doc.createStyleSheet(css_file);\r
+                       }\r
+               }\r
+       },\r
+\r
+       confirmAdd : function(e, settings) {\r
+               var elm = tinyMCE.isIE ? event.srcElement : e.target;\r
+               var elementId = elm.name ? elm.name : elm.id;\r
+\r
+               tinyMCE.settings = settings;\r
+\r
+               if (tinyMCE.settings.convert_on_click || (!elm.getAttribute('mce_noask') && confirm(tinyMCELang.lang_edit_confirm)))\r
+                       tinyMCE.addMCEControl(elm, elementId);\r
+\r
+               elm.setAttribute('mce_noask', 'true');\r
+       },\r
+\r
+       updateContent : function(form_element_name) {\r
+               var formElement, n, inst, doc;\r
+\r
+               // Find MCE instance linked to given form element and copy it's value\r
+               formElement = document.getElementById(form_element_name);\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       inst.switchSettings();\r
+\r
+                       if (inst.formElement == formElement) {\r
+                               doc = inst.getDoc();\r
+\r
+                               tinyMCE._setHTML(doc, inst.formElement.value);\r
+\r
+                               if (!tinyMCE.isIE)\r
+                                       doc.body.innerHTML = tinyMCE._cleanupHTML(inst, doc, this.settings, doc.body, inst.visualAid);\r
+                       }\r
+               }\r
+       },\r
+\r
+       addMCEControl : function(replace_element, form_element_name, target_document) {\r
+               var id = "mce_editor_" + tinyMCE.idCounter++;\r
+               var inst = new TinyMCE_Control(tinyMCE.settings);\r
+\r
+               inst.editorId = id;\r
+               this.instances[id] = inst;\r
+\r
+               inst._onAdd(replace_element, form_element_name, target_document);\r
+       },\r
+\r
+       removeInstance : function(ti) {\r
+               var t = [], n, i;\r
+\r
+               // Remove from instances\r
+               for (n in tinyMCE.instances) {\r
+                       i = tinyMCE.instances[n];\r
+\r
+                       if (tinyMCE.isInstance(i) && ti != i)\r
+                                       t[n] = i;\r
+               }\r
+\r
+               tinyMCE.instances = t;\r
+\r
+               // Remove from global undo/redo\r
+               n = [];\r
+               t = tinyMCE.undoLevels;\r
+\r
+               for (i=0; i<t.length; i++) {\r
+                       if (t[i] != ti)\r
+                               n.push(t[i]);\r
+               }\r
+\r
+               tinyMCE.undoLevels = n;\r
+               tinyMCE.undoIndex = n.length;\r
+\r
+               // Dispatch remove instance call\r
+               tinyMCE.dispatchCallback(ti, 'remove_instance_callback', 'removeInstance', ti);\r
+\r
+               return ti;\r
+       },\r
+\r
+       removeMCEControl : function(editor_id) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), h, re, ot, tn;\r
+\r
+               if (inst) {\r
+                       inst.switchSettings();\r
+\r
+                       editor_id = inst.editorId;\r
+                       h = tinyMCE.getContent(editor_id);\r
+\r
+                       this.removeInstance(inst);\r
+\r
+                       tinyMCE.selectedElement = null;\r
+                       tinyMCE.selectedInstance = null;\r
+\r
+                       // Remove element\r
+                       re = document.getElementById(editor_id + "_parent");\r
+                       ot = inst.oldTargetElement;\r
+                       tn = ot.nodeName.toLowerCase();\r
+\r
+                       if (tn == "textarea" || tn == "input") {\r
+                               re.parentNode.removeChild(re);\r
+                               ot.style.display = "inline";\r
+                               ot.value = h;\r
+                       } else {\r
+                               ot.innerHTML = h;\r
+                               ot.style.display = 'block';\r
+                               re.parentNode.insertBefore(ot, re);\r
+                               re.parentNode.removeChild(re);\r
+                       }\r
+               }\r
+       },\r
+\r
+       triggerSave : function(skip_cleanup, skip_callback) {\r
+               var inst, n;\r
+\r
+               // Default to false\r
+               if (typeof(skip_cleanup) == "undefined")\r
+                       skip_cleanup = false;\r
+\r
+               // Default to false\r
+               if (typeof(skip_callback) == "undefined")\r
+                       skip_callback = false;\r
+\r
+               // Cleanup and set all form fields\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       inst.triggerSave(skip_cleanup, skip_callback);\r
+               }\r
+       },\r
+\r
+       resetForm : function(form_index) {\r
+               var i, inst, n, formObj = document.forms[form_index];\r
+\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       inst.switchSettings();\r
+\r
+                       for (i=0; i<formObj.elements.length; i++) {\r
+                               if (inst.formTargetElementId == formObj.elements[i].name)\r
+                                       inst.getBody().innerHTML = inst.startContent;\r
+                       }\r
+               }\r
+       },\r
+\r
+       execInstanceCommand : function(editor_id, command, user_interface, value, focus) {\r
+               var inst = tinyMCE.getInstanceById(editor_id), r;\r
+\r
+               if (inst) {\r
+                       r = inst.selection.getRng();\r
+\r
+                       if (typeof(focus) == "undefined")\r
+                               focus = true;\r
+\r
+                       // IE bug lost focus on images in absolute divs Bug #1534575\r
+                       if (focus && (!r || !r.item))\r
+                               inst.contentWindow.focus();\r
+\r
+                       // Reset design mode if lost\r
+                       inst.autoResetDesignMode();\r
+\r
+                       this.selectedElement = inst.getFocusElement();\r
+                       inst.select();\r
+                       tinyMCE.execCommand(command, user_interface, value);\r
+\r
+                       // Cancel event so it doesn't call onbeforeonunlaod\r
+                       if (tinyMCE.isIE && window.event != null)\r
+                               tinyMCE.cancelEvent(window.event);\r
+               }\r
+       },\r
+\r
+       execCommand : function(command, user_interface, value) {\r
+               var inst = tinyMCE.selectedInstance, n, pe, te;\r
+\r
+               // Default input\r
+               user_interface = user_interface ? user_interface : false;\r
+               value = value ? value : null;\r
+\r
+               if (inst)\r
+                       inst.switchSettings();\r
+\r
+               switch (command) {\r
+                       case "Undo":\r
+                               if (this.getParam('custom_undo_redo_global')) {\r
+                                       if (this.undoIndex > 0) {\r
+                                               tinyMCE.nextUndoRedoAction = 'Undo';\r
+                                               inst = this.undoLevels[--this.undoIndex];\r
+                                               inst.select();\r
+\r
+                                               if (!tinyMCE.nextUndoRedoInstanceId)\r
+                                                       inst.execCommand('Undo');\r
+                                       }\r
+                               } else\r
+                                       inst.execCommand('Undo');\r
+                               return true;\r
+\r
+                       case "Redo":\r
+                               if (this.getParam('custom_undo_redo_global')) {\r
+                                       if (this.undoIndex <= this.undoLevels.length - 1) {\r
+                                               tinyMCE.nextUndoRedoAction = 'Redo';\r
+                                               inst = this.undoLevels[this.undoIndex++];\r
+                                               inst.select();\r
+\r
+                                               if (!tinyMCE.nextUndoRedoInstanceId)\r
+                                                       inst.execCommand('Redo');\r
+                                       }\r
+                               } else\r
+                                       inst.execCommand('Redo');\r
+\r
+                               return true;\r
+\r
+                       case 'mceFocus':\r
+                               inst = tinyMCE.getInstanceById(value);\r
+\r
+                               if (inst)\r
+                                       inst.getWin().focus();\r
+                       return;\r
+\r
+                       case "mceAddControl":\r
+                       case "mceAddEditor":\r
+                               tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);\r
+                               return;\r
+\r
+                       case "mceAddFrameControl":\r
+                               tinyMCE.addMCEControl(tinyMCE._getElementById(value.element, value.document), value.element, value.document);\r
+                               return;\r
+\r
+                       case "mceRemoveControl":\r
+                       case "mceRemoveEditor":\r
+                               tinyMCE.removeMCEControl(value);\r
+                               return;\r
+\r
+                       case "mceToggleEditor":\r
+                               inst = tinyMCE.getInstanceById(value);\r
+\r
+                               if (inst) {\r
+                                       pe = document.getElementById(inst.editorId + '_parent');\r
+                                       te = inst.oldTargetElement;\r
+\r
+                                       if (typeof(inst.enabled) == 'undefined')\r
+                                               inst.enabled = true;\r
+\r
+                                       inst.enabled = !inst.enabled;\r
+\r
+                                       if (!inst.enabled) {\r
+                                               pe.style.display = 'none';\r
+\r
+                                               if (te.nodeName == 'TEXTAREA' || te.nodeName == 'INPUT')\r
+                                                       te.value = inst.getHTML();\r
+                                               else\r
+                                                       te.innerHTML = inst.getHTML();\r
+\r
+                                               te.style.display = inst.oldTargetDisplay;\r
+                                               tinyMCE.dispatchCallback(inst, 'hide_instance_callback', 'hideInstance', inst);\r
+                                       } else {\r
+                                               pe.style.display = 'block';\r
+                                               te.style.display = 'none';\r
+\r
+                                               if (te.nodeName == 'TEXTAREA' || te.nodeName == 'INPUT')\r
+                                                       inst.setHTML(te.value);\r
+                                               else\r
+                                                       inst.setHTML(te.innerHTML);\r
+\r
+                                               inst.useCSS = false;\r
+                                               tinyMCE.dispatchCallback(inst, 'show_instance_callback', 'showInstance', inst);\r
+                                       }\r
+                               } else\r
+                                       tinyMCE.addMCEControl(tinyMCE._getElementById(value), value);\r
+\r
+                               return;\r
+\r
+                       case "mceResetDesignMode":\r
+                               // Resets the designmode state of the editors in Gecko\r
+                               if (tinyMCE.isGecko) {\r
+                                       for (n in tinyMCE.instances) {\r
+                                               if (!tinyMCE.isInstance(tinyMCE.instances[n]))\r
+                                                       continue;\r
+\r
+                                               try {\r
+                                                       tinyMCE.instances[n].getDoc().designMode = "off";\r
+                                                       tinyMCE.instances[n].getDoc().designMode = "on";\r
+                                                       tinyMCE.instances[n].useCSS = false;\r
+                                               } catch (e) {\r
+                                                       // Ignore any errors\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               return;\r
+               }\r
+\r
+               if (inst) {\r
+                       inst.execCommand(command, user_interface, value);\r
+               } else if (tinyMCE.settings.focus_alert)\r
+                       alert(tinyMCELang.lang_focus_alert);\r
+       },\r
+\r
+       _createIFrame : function(replace_element, doc, win) {\r
+               var iframe, id = replace_element.getAttribute("id");\r
+               var aw, ah;\r
+\r
+               if (typeof(doc) == "undefined")\r
+                       doc = document;\r
+\r
+               if (typeof(win) == "undefined")\r
+                       win = window;\r
+\r
+               iframe = doc.createElement("iframe");\r
+\r
+               aw = "" + tinyMCE.settings.area_width;\r
+               ah = "" + tinyMCE.settings.area_height;\r
+\r
+               if (aw.indexOf('%') == -1) {\r
+                       aw = parseInt(aw);\r
+                       aw = (isNaN(aw) || aw < 0) ? 300 : aw;\r
+                       aw = aw + "px";\r
+               }\r
+\r
+               if (ah.indexOf('%') == -1) {\r
+                       ah = parseInt(ah);\r
+                       ah = (isNaN(ah) || ah < 0) ? 240 : ah;\r
+                       ah = ah + "px";\r
+               }\r
+\r
+               iframe.setAttribute("id", id);\r
+               iframe.setAttribute("name", id);\r
+               iframe.setAttribute("class", "mceEditorIframe");\r
+               iframe.setAttribute("border", "0");\r
+               iframe.setAttribute("frameBorder", "0");\r
+               iframe.setAttribute("marginWidth", "0");\r
+               iframe.setAttribute("marginHeight", "0");\r
+               iframe.setAttribute("leftMargin", "0");\r
+               iframe.setAttribute("topMargin", "0");\r
+               iframe.setAttribute("width", aw);\r
+               iframe.setAttribute("height", ah);\r
+               iframe.setAttribute("allowtransparency", "true");\r
+               iframe.className = 'mceEditorIframe';\r
+\r
+               if (tinyMCE.settings.auto_resize)\r
+                       iframe.setAttribute("scrolling", "no");\r
+\r
+               // Must have a src element in MSIE HTTPs breaks aswell as absoute URLs\r
+               if (tinyMCE.isRealIE)\r
+                       iframe.setAttribute("src", this.settings.default_document);\r
+\r
+               iframe.style.width = aw;\r
+               iframe.style.height = ah;\r
+\r
+               // Ugly hack for Gecko problem in strict mode\r
+               if (tinyMCE.settings.strict_loading_mode)\r
+                       iframe.style.marginBottom = '-5px';\r
+\r
+               // MSIE 5.0 issue\r
+               if (tinyMCE.isRealIE)\r
+                       replace_element.outerHTML = iframe.outerHTML;\r
+               else\r
+                       replace_element.parentNode.replaceChild(iframe, replace_element);\r
+\r
+               if (tinyMCE.isRealIE)\r
+                       return win.frames[id];\r
+               else\r
+                       return iframe;\r
+       },\r
+\r
+       setupContent : function(editor_id) {\r
+               var inst = tinyMCE.instances[editor_id], i, doc = inst.getDoc(), head = doc.getElementsByTagName('head').item(0);\r
+               var content = inst.startContent, contentElement, body;\r
+\r
+               // HTML values get XML encoded in strict mode\r
+               if (tinyMCE.settings.strict_loading_mode) {\r
+                       content = content.replace(/&lt;/g, '<');\r
+                       content = content.replace(/&gt;/g, '>');\r
+                       content = content.replace(/&quot;/g, '"');\r
+                       content = content.replace(/&amp;/g, '&');\r
+               }\r
+\r
+               tinyMCE.selectedInstance = inst;\r
+               inst.switchSettings();\r
+\r
+               // Not loaded correctly hit it again, Mozilla bug #997860\r
+               if (!tinyMCE.isIE && tinyMCE.getParam("setupcontent_reload", false) && doc.title != "blank_page") {\r
+                       // This part will remove the designMode status\r
+                       // Failes first time in Firefox 1.5b2 on Mac\r
+                       try {doc.location.href = tinyMCE.baseURL + "/blank.htm";} catch (ex) {}\r
+                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 1000);\r
+                       return;\r
+               }\r
+\r
+               // Wait for it to load\r
+               if (!head || !doc.body) {\r
+                       window.setTimeout("tinyMCE.setupContent('" + editor_id + "');", 10);\r
+                       return;\r
+               }\r
+\r
+               // Import theme specific content CSS the user specific\r
+               tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/themes/" + inst.settings.theme + "/css/editor_content.css");\r
+               tinyMCE.importCSS(inst.getDoc(), inst.settings.content_css);\r
+               tinyMCE.dispatchCallback(inst, 'init_instance_callback', 'initInstance', inst);\r
+\r
+               // Setup keyboard shortcuts\r
+               if (tinyMCE.getParam('custom_undo_redo_keyboard_shortcuts')) {\r
+                       inst.addShortcut('ctrl', 'z', 'lang_undo_desc', 'Undo');\r
+                       inst.addShortcut('ctrl', 'y', 'lang_redo_desc', 'Redo');\r
+               }\r
+\r
+               // BlockFormat shortcuts keys\r
+               for (i=1; i<=6; i++)\r
+                       inst.addShortcut('ctrl', '' + i, '', 'FormatBlock', false, '<h' + i + '>');\r
+\r
+               inst.addShortcut('ctrl', '7', '', 'FormatBlock', false, '<p>');\r
+               inst.addShortcut('ctrl', '8', '', 'FormatBlock', false, '<div>');\r
+               inst.addShortcut('ctrl', '9', '', 'FormatBlock', false, '<address>');\r
+\r
+               // Add default shortcuts for gecko\r
+               if (tinyMCE.isGecko) {\r
+                       inst.addShortcut('ctrl', 'b', 'lang_bold_desc', 'Bold');\r
+                       inst.addShortcut('ctrl', 'i', 'lang_italic_desc', 'Italic');\r
+                       inst.addShortcut('ctrl', 'u', 'lang_underline_desc', 'Underline');\r
+               }\r
+\r
+               // Setup span styles\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       inst.getBody().setAttribute('id', 'mceSpanFonts');\r
+\r
+               if (tinyMCE.settings.nowrap)\r
+                       doc.body.style.whiteSpace = "nowrap";\r
+\r
+               doc.body.dir = this.settings.directionality;\r
+               doc.editorId = editor_id;\r
+\r
+               // Add on document element in Mozilla\r
+               if (!tinyMCE.isIE)\r
+                       doc.documentElement.editorId = editor_id;\r
+\r
+               inst.setBaseHREF(tinyMCE.settings.base_href);\r
+\r
+               // Replace new line characters to BRs\r
+               if (tinyMCE.settings.convert_newlines_to_brs) {\r
+                       content = tinyMCE.regexpReplace(content, "\r\n", "<br />", "gi");\r
+                       content = tinyMCE.regexpReplace(content, "\r", "<br />", "gi");\r
+                       content = tinyMCE.regexpReplace(content, "\n", "<br />", "gi");\r
+               }\r
+\r
+               // Open closed anchors\r
+       //      content = content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');\r
+\r
+               // Call custom cleanup code\r
+               content = tinyMCE.storeAwayURLs(content);\r
+               content = tinyMCE._customCleanup(inst, "insert_to_editor", content);\r
+\r
+               if (tinyMCE.isIE) {\r
+                       // Ugly!!!\r
+                       window.setInterval('try{tinyMCE.getCSSClasses(tinyMCE.instances["' + editor_id + '"].getDoc(), "' + editor_id + '");}catch(e){}', 500);\r
+\r
+                       if (tinyMCE.settings.force_br_newlines)\r
+                               doc.styleSheets[0].addRule("p", "margin: 0;");\r
+\r
+                       body = inst.getBody();\r
+                       body.editorId = editor_id;\r
+               }\r
+\r
+               content = tinyMCE.cleanupHTMLCode(content);\r
+\r
+               // Fix for bug #958637\r
+               if (!tinyMCE.isIE) {\r
+                       contentElement = inst.getDoc().createElement("body");\r
+                       doc = inst.getDoc();\r
+\r
+                       contentElement.innerHTML = content;\r
+\r
+                       if (tinyMCE.settings.cleanup_on_startup)\r
+                               tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, doc, this.settings, contentElement));\r
+                       else\r
+                               tinyMCE.setInnerHTML(inst.getBody(), content);\r
+\r
+                       tinyMCE.convertAllRelativeURLs(inst.getBody());\r
+               } else {\r
+                       if (tinyMCE.settings.cleanup_on_startup) {\r
+                               tinyMCE._setHTML(inst.getDoc(), content);\r
+\r
+                               // Produces permission denied error in MSIE 5.5\r
+                               try {\r
+                                       tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));\r
+                               } catch(e) {\r
+                                       // Ignore\r
+                               }\r
+                       } else\r
+                               tinyMCE._setHTML(inst.getDoc(), content);\r
+               }\r
+\r
+               // Fix for bug #957681\r
+               //inst.getDoc().designMode = inst.getDoc().designMode;\r
+\r
+               tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings.visual, inst);\r
+               tinyMCE.dispatchCallback(inst, 'setupcontent_callback', 'setupContent', editor_id, inst.getBody(), inst.getDoc());\r
+\r
+               // Re-add design mode on mozilla\r
+               if (!tinyMCE.isIE)\r
+                       tinyMCE.addEventHandlers(inst);\r
+\r
+               // Add blur handler\r
+               if (tinyMCE.isIE) {\r
+                       tinyMCE.addEvent(inst.getBody(), "blur", TinyMCE_Engine.prototype._eventPatch);\r
+                       tinyMCE.addEvent(inst.getBody(), "beforedeactivate", TinyMCE_Engine.prototype._eventPatch); // Bug #1439953\r
+\r
+                       // Workaround for drag drop/copy paste base href bug\r
+                       if (!tinyMCE.isOpera) {\r
+                               tinyMCE.addEvent(doc.body, "mousemove", TinyMCE_Engine.prototype.onMouseMove);\r
+                               tinyMCE.addEvent(doc.body, "beforepaste", TinyMCE_Engine.prototype._eventPatch);\r
+                               tinyMCE.addEvent(doc.body, "drop", TinyMCE_Engine.prototype._eventPatch);\r
+                       }\r
+               }\r
+\r
+               // Trigger node change, this call locks buttons for tables and so forth\r
+               inst.select();\r
+               tinyMCE.selectedElement = inst.contentWindow.document.body;\r
+\r
+               // Call custom DOM cleanup\r
+               tinyMCE._customCleanup(inst, "insert_to_editor_dom", inst.getBody());\r
+               tinyMCE._customCleanup(inst, "setup_content_dom", inst.getBody());\r
+               tinyMCE._setEventsEnabled(inst.getBody(), false);\r
+               tinyMCE.cleanupAnchors(inst.getDoc());\r
+\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       tinyMCE.convertSpansToFonts(inst.getDoc());\r
+\r
+               inst.startContent = tinyMCE.trim(inst.getBody().innerHTML);\r
+               inst.undoRedo.add({ content : inst.startContent });\r
+\r
+               // Cleanup any mess left from storyAwayURLs\r
+               if (tinyMCE.isGecko) {\r
+                       // Remove mce_src from textnodes and comments\r
+                       tinyMCE.selectNodes(inst.getBody(), function(n) {\r
+                               if (n.nodeType == 3 || n.nodeType == 8)\r
+                                       n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");\r
+\r
+                               return false;\r
+                       });\r
+               }\r
+\r
+               // Remove Gecko spellchecking\r
+               if (tinyMCE.isGecko)\r
+                       inst.getBody().spellcheck = tinyMCE.getParam("gecko_spellcheck");\r
+\r
+               // Cleanup any mess left from storyAwayURLs\r
+               tinyMCE._removeInternal(inst.getBody());\r
+\r
+               inst.select();\r
+               tinyMCE.triggerNodeChange(false, true);\r
+       },\r
+\r
+       storeAwayURLs : function(s) {\r
+               // Remove all mce_src, mce_href and replace them with new ones\r
+               // s = s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');\r
+               // s = s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"', 'gi'), '');\r
+\r
+               if (!s.match(/(mce_src|mce_href)/gi, s)) {\r
+                       s = s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'src="$1" mce_src="$1"');\r
+                       s = s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"', 'gi'), 'href="$1" mce_href="$1"');\r
+               }\r
+\r
+               return s;\r
+       },\r
+\r
+       _removeInternal : function(n) {\r
+               if (tinyMCE.isGecko) {\r
+                       // Remove mce_src from textnodes and comments\r
+                       tinyMCE.selectNodes(n, function(n) {\r
+                               if (n.nodeType == 3 || n.nodeType == 8)\r
+                                       n.nodeValue = n.nodeValue.replace(new RegExp('\\s(mce_src|mce_href)=\"[^\"]*\"', 'gi'), "");\r
+\r
+                               return false;\r
+                       });\r
+               }\r
+       },\r
+\r
+       removeTinyMCEFormElements : function(form_obj) {\r
+               var i, elementId;\r
+\r
+               // Skip form element removal\r
+               if (!tinyMCE.getParam('hide_selects_on_submit'))\r
+                       return;\r
+\r
+               // Check if form is valid\r
+               if (typeof(form_obj) == "undefined" || form_obj == null)\r
+                       return;\r
+\r
+               // If not a form, find the form\r
+               if (form_obj.nodeName != "FORM") {\r
+                       if (form_obj.form)\r
+                               form_obj = form_obj.form;\r
+                       else\r
+                               form_obj = tinyMCE.getParentElement(form_obj, "form");\r
+               }\r
+\r
+               // Still nothing\r
+               if (form_obj == null)\r
+                       return;\r
+\r
+               // Disable all UI form elements that TinyMCE created\r
+               for (i=0; i<form_obj.elements.length; i++) {\r
+                       elementId = form_obj.elements[i].name ? form_obj.elements[i].name : form_obj.elements[i].id;\r
+\r
+                       if (elementId.indexOf('mce_editor_') == 0)\r
+                               form_obj.elements[i].disabled = true;\r
+               }\r
+       },\r
+\r
+       handleEvent : function(e) {\r
+               var inst = tinyMCE.selectedInstance, i, elm, keys;\r
+\r
+               // Remove odd, error\r
+               if (typeof(tinyMCE) == "undefined")\r
+                       return true;\r
+\r
+               //tinyMCE.debug(e.type + " " + e.target.nodeName + " " + (e.relatedTarget ? e.relatedTarget.nodeName : ""));\r
+\r
+               if (tinyMCE.executeCallback(tinyMCE.selectedInstance, 'handle_event_callback', 'handleEvent', e))\r
+                       return false;\r
+\r
+               switch (e.type) {\r
+                       case "beforedeactivate": // Was added due to bug #1439953\r
+                       case "blur":\r
+                               if (tinyMCE.selectedInstance)\r
+                                       tinyMCE.selectedInstance.execCommand('mceEndTyping');\r
+\r
+                               tinyMCE.hideMenus();\r
+\r
+                               return;\r
+\r
+                       // Workaround for drag drop/copy paste base href bug\r
+                       case "drop":\r
+                       case "beforepaste":\r
+                               if (tinyMCE.selectedInstance)\r
+                                       tinyMCE.selectedInstance.setBaseHREF(null);\r
+\r
+                               // Fixes odd MSIE bug where drag/droping elements in a iframe with height 100% breaks\r
+                               // This logic forces the width/height to be in pixels while the user is drag/dropping\r
+                               if (tinyMCE.isRealIE) {\r
+                                       var ife = tinyMCE.selectedInstance.iframeElement;\r
+\r
+                                       /*if (ife.style.width.indexOf('%') != -1) {\r
+                                               ife._oldWidth = ife.width.height;\r
+                                               ife.style.width = ife.clientWidth;\r
+                                       }*/\r
+\r
+                                       if (ife.style.height.indexOf('%') != -1) {\r
+                                               ife._oldHeight = ife.style.height;\r
+                                               ife.style.height = ife.clientHeight;\r
+                                       }\r
+                               }\r
+\r
+                               window.setTimeout("tinyMCE.selectedInstance.setBaseHREF(tinyMCE.settings.base_href);tinyMCE._resetIframeHeight();", 1);\r
+                               return;\r
+\r
+                       case "submit":\r
+                               tinyMCE.formSubmit(tinyMCE.isMSIE ? window.event.srcElement : e.target);\r
+                               return;\r
+\r
+                       case "reset":\r
+                               var formObj = tinyMCE.isIE ? window.event.srcElement : e.target;\r
+\r
+                               for (i=0; i<document.forms.length; i++) {\r
+                                       if (document.forms[i] == formObj)\r
+                                               window.setTimeout('tinyMCE.resetForm(' + i + ');', 10);\r
+                               }\r
+\r
+                               return;\r
+\r
+                       case "keypress":\r
+                               if (inst && inst.handleShortcut(e))\r
+                                       return false;\r
+\r
+                               if (e.target.editorId) {\r
+                                       tinyMCE.instances[e.target.editorId].select();\r
+                               } else {\r
+                                       if (e.target.ownerDocument.editorId)\r
+                                               tinyMCE.instances[e.target.ownerDocument.editorId].select();\r
+                               }\r
+\r
+                               if (tinyMCE.selectedInstance)\r
+                                       tinyMCE.selectedInstance.switchSettings();\r
+\r
+                               // Insert P element\r
+                               if ((tinyMCE.isGecko || tinyMCE.isOpera || tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && e.keyCode == 13 && !e.shiftKey) {\r
+                                       // Insert P element instead of BR\r
+                                       if (TinyMCE_ForceParagraphs._insertPara(tinyMCE.selectedInstance, e)) {\r
+                                               // Cancel event\r
+                                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                                               return tinyMCE.cancelEvent(e);\r
+                                       }\r
+                               }\r
+\r
+                               // Handle backspace\r
+                               if ((tinyMCE.isGecko && !tinyMCE.isSafari) && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {\r
+                                       // Insert P element instead of BR\r
+                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {\r
+                                               // Cancel event\r
+                                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                                               return tinyMCE.cancelEvent(e);\r
+                                       }\r
+                               }\r
+\r
+                               // Return key pressed\r
+                               if (tinyMCE.isIE && tinyMCE.settings.force_br_newlines && e.keyCode == 13) {\r
+                                       if (e.target.editorId)\r
+                                               tinyMCE.instances[e.target.editorId].select();\r
+\r
+                                       if (tinyMCE.selectedInstance) {\r
+                                               var sel = tinyMCE.selectedInstance.getDoc().selection;\r
+                                               var rng = sel.createRange();\r
+\r
+                                               if (tinyMCE.getParentElement(rng.parentElement(), "li") != null)\r
+                                                       return false;\r
+\r
+                                               // Cancel event\r
+                                               e.returnValue = false;\r
+                                               e.cancelBubble = true;\r
+\r
+                                               // Insert BR element\r
+                                               rng.pasteHTML("<br />");\r
+                                               rng.collapse(false);\r
+                                               rng.select();\r
+\r
+                                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                                               tinyMCE.triggerNodeChange(false);\r
+                                               return false;\r
+                                       }\r
+                               }\r
+\r
+                               // Backspace or delete\r
+                               if (e.keyCode == 8 || e.keyCode == 46) {\r
+                                       tinyMCE.selectedElement = e.target;\r
+                                       tinyMCE.linkElement = tinyMCE.getParentElement(e.target, "a");\r
+                                       tinyMCE.imgElement = tinyMCE.getParentElement(e.target, "img");\r
+                                       tinyMCE.triggerNodeChange(false);\r
+                               }\r
+\r
+                               return false;\r
+\r
+                       case "keyup":\r
+                       case "keydown":\r
+                               tinyMCE.hideMenus();\r
+                               tinyMCE.hasMouseMoved = false;\r
+\r
+                               if (inst && inst.handleShortcut(e))\r
+                                       return false;\r
+\r
+                               inst._fixRootBlocks();\r
+\r
+                               if (inst.settings.remove_trailing_nbsp)\r
+                                       inst._fixTrailingNbsp();\r
+\r
+                               if (e.target.editorId)\r
+                                       tinyMCE.instances[e.target.editorId].select();\r
+\r
+                               if (tinyMCE.selectedInstance)\r
+                                       tinyMCE.selectedInstance.switchSettings();\r
+\r
+                               inst = tinyMCE.selectedInstance;\r
+\r
+                               // Handle backspace\r
+                               if (tinyMCE.isGecko && tinyMCE.settings.force_p_newlines && (e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey) {\r
+                                       // Insert P element instead of BR\r
+                                       if (TinyMCE_ForceParagraphs._handleBackSpace(tinyMCE.selectedInstance, e.type)) {\r
+                                               // Cancel event\r
+                                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                                               e.preventDefault();\r
+                                               return false;\r
+                                       }\r
+                               }\r
+\r
+                               tinyMCE.selectedElement = null;\r
+                               tinyMCE.selectedNode = null;\r
+                               elm = tinyMCE.selectedInstance.getFocusElement();\r
+                               tinyMCE.linkElement = tinyMCE.getParentElement(elm, "a");\r
+                               tinyMCE.imgElement = tinyMCE.getParentElement(elm, "img");\r
+                               tinyMCE.selectedElement = elm;\r
+\r
+                               // Update visualaids on tabs\r
+                               if (tinyMCE.isGecko && e.type == "keyup" && e.keyCode == 9)\r
+                                       tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(), true, tinyMCE.settings.visual, tinyMCE.selectedInstance);\r
+\r
+                               // Fix empty elements on return/enter, check where enter occured\r
+                               if (tinyMCE.isIE && e.type == "keydown" && e.keyCode == 13)\r
+                                       tinyMCE.enterKeyElement = tinyMCE.selectedInstance.getFocusElement();\r
+\r
+                               // Fix empty elements on return/enter\r
+                               if (tinyMCE.isIE && e.type == "keyup" && e.keyCode == 13) {\r
+                                       elm = tinyMCE.enterKeyElement;\r
+                                       if (elm) {\r
+                                               var re = new RegExp('^HR|IMG|BR$','g'); // Skip these\r
+                                               var dre = new RegExp('^H[1-6]$','g'); // Add double on these\r
+\r
+                                               if (!elm.hasChildNodes() && !re.test(elm.nodeName)) {\r
+                                                       if (dre.test(elm.nodeName))\r
+                                                               elm.innerHTML = "&nbsp;&nbsp;";\r
+                                                       else\r
+                                                               elm.innerHTML = "&nbsp;";\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Check if it's a position key\r
+                               keys = tinyMCE.posKeyCodes;\r
+                               var posKey = false;\r
+                               for (i=0; i<keys.length; i++) {\r
+                                       if (keys[i] == e.keyCode) {\r
+                                               posKey = true;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               // MSIE custom key handling\r
+                               if (tinyMCE.isIE && tinyMCE.settings.custom_undo_redo) {\r
+                                       keys = [8, 46]; // Backspace,Delete\r
+\r
+                                       for (i=0; i<keys.length; i++) {\r
+                                               if (keys[i] == e.keyCode) {\r
+                                                       if (e.type == "keyup")\r
+                                                               tinyMCE.triggerNodeChange(false);\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // If Ctrl key\r
+                               if (e.keyCode == 17)\r
+                                       return true;\r
+\r
+                               // Handle Undo/Redo when typing content\r
+\r
+                               if (tinyMCE.isGecko) {\r
+                                       // Start typing (not a position key or ctrl key, but ctrl+x and ctrl+p is ok)\r
+                                       if (!posKey && e.type == "keyup" && !e.ctrlKey || (e.ctrlKey && (e.keyCode == 86 || e.keyCode == 88)))\r
+                                               tinyMCE.execCommand("mceStartTyping");\r
+                               } else {\r
+                                       // IE seems to be working better with this setting\r
+                                       if (!posKey && e.type == "keyup")\r
+                                               tinyMCE.execCommand("mceStartTyping");\r
+                               }\r
+\r
+                               // Store undo bookmark\r
+                               if (e.type == "keydown" && (posKey || e.ctrlKey) && inst)\r
+                                       inst.undoBookmark = inst.selection.getBookmark();\r
+\r
+                               // End typing (position key) or some Ctrl event\r
+                               if (e.type == "keyup" && (posKey || e.ctrlKey))\r
+                                       tinyMCE.execCommand("mceEndTyping");\r
+\r
+                               if (posKey && e.type == "keyup")\r
+                                       tinyMCE.triggerNodeChange(false);\r
+\r
+                               if (tinyMCE.isIE && e.ctrlKey)\r
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+                       break;\r
+\r
+                       case "mousedown":\r
+                       case "mouseup":\r
+                       case "click":\r
+                       case "dblclick":\r
+                       case "focus":\r
+                               tinyMCE.hideMenus();\r
+\r
+                               if (tinyMCE.selectedInstance) {\r
+                                       tinyMCE.selectedInstance.switchSettings();\r
+                                       tinyMCE.selectedInstance.isFocused = true;\r
+                               }\r
+\r
+                               // Check instance event trigged on\r
+                               var targetBody = tinyMCE.getParentElement(e.target, "html");\r
+                               for (var instanceName in tinyMCE.instances) {\r
+                                       if (!tinyMCE.isInstance(tinyMCE.instances[instanceName]))\r
+                                               continue;\r
+\r
+                                       inst = tinyMCE.instances[instanceName];\r
+\r
+                                       // Reset design mode if lost (on everything just in case)\r
+                                       inst.autoResetDesignMode();\r
+\r
+                                       // Use HTML element since users might click outside of body element\r
+                                       if (inst.getBody().parentNode == targetBody) {\r
+                                               inst.select();\r
+                                               tinyMCE.selectedElement = e.target;\r
+                                               tinyMCE.linkElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "a");\r
+                                               tinyMCE.imgElement = tinyMCE.getParentElement(tinyMCE.selectedElement, "img");\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               // Add first bookmark location\r
+                               if (!tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark && (e.type == "mouseup" || e.type == "dblclick"))\r
+                                       tinyMCE.selectedInstance.undoRedo.undoLevels[0].bookmark = tinyMCE.selectedInstance.selection.getBookmark();\r
+\r
+                               // Reset selected node\r
+                               if (e.type != "focus")\r
+                                       tinyMCE.selectedNode = null;\r
+\r
+                               tinyMCE.triggerNodeChange(false);\r
+                               tinyMCE.execCommand("mceEndTyping");\r
+\r
+                               if (e.type == "mouseup")\r
+                                       tinyMCE.execCommand("mceAddUndoLevel");\r
+\r
+                               // Just in case\r
+                               if (!tinyMCE.selectedInstance && e.target.editorId)\r
+                                       tinyMCE.instances[e.target.editorId].select();\r
+\r
+                               return false;\r
+               }\r
+       },\r
+\r
+       getButtonHTML : function(id, lang, img, cmd, ui, val) {\r
+               var h = '', m, x, io = '';\r
+\r
+               cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';\r
+\r
+               if (typeof(ui) != "undefined" && ui != null)\r
+                       cmd += ',' + ui;\r
+\r
+               if (typeof(val) != "undefined" && val != null)\r
+                       cmd += ",'" + val + "'";\r
+\r
+               cmd += ');';\r
+\r
+               // Patch for IE7 bug with hover out not restoring correctly\r
+               if (tinyMCE.isRealIE)\r
+                       io = 'onmouseover="tinyMCE.lastHover = this;"';\r
+\r
+               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled\r
+               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = this.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {\r
+                       // Tiled button\r
+                       x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);\r
+                       h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceTiledButton mceButtonNormal" target="_self">';\r
+                       h += '<img src="{$themeurl}/images/spacer.gif" style="background-position: ' + x + 'px 0" alt="{$'+lang+'}" title="{$' + lang + '}" />';\r
+                       h += '</a>';\r
+               } else {\r
+                       // Normal button\r
+                       h += '<a id="{$editor_id}_' + id + '" href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" ' + io + ' class="mceButtonNormal" target="_self">';\r
+                       h += '<img src="' + img + '" alt="{$'+lang+'}" title="{$' + lang + '}" />';\r
+                       h += '</a>';\r
+               }\r
+\r
+               return h;\r
+       },\r
+\r
+       getMenuButtonHTML : function(id, lang, img, mcmd, cmd, ui, val) {\r
+               var h = '', m, x;\r
+\r
+               mcmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + mcmd + '\');';\r
+               cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + cmd + '\'';\r
+\r
+               if (typeof(ui) != "undefined" && ui != null)\r
+                       cmd += ',' + ui;\r
+\r
+               if (typeof(val) != "undefined" && val != null)\r
+                       cmd += ",'" + val + "'";\r
+\r
+               cmd += ');';\r
+\r
+               // Use tilemaps when enabled and found and never in MSIE since it loads the tile each time from cache if cahce is disabled\r
+               if (tinyMCE.getParam('button_tile_map') && (!tinyMCE.isIE || tinyMCE.isOpera) && (m = tinyMCE.buttonMap[id]) != null && (tinyMCE.getParam("language") == "en" || img.indexOf('$lang') == -1)) {\r
+                       x = 0 - (m * 20) == 0 ? '0' : 0 - (m * 20);\r
+\r
+                       if (tinyMCE.isRealIE)\r
+                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';\r
+                       else\r
+                               h += '<span id="{$editor_id}_' + id + '" class="mceMenuButton">';\r
+\r
+                       h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceTiledButton mceMenuButtonNormal" target="_self">';\r
+                       h += '<img src="{$themeurl}/images/spacer.gif" style="width: 20px; height: 20px; background-position: ' + x + 'px 0" title="{$' + lang + '}" /></a>';\r
+                       h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';\r
+                       h += '</a></span>';\r
+               } else {\r
+                       if (tinyMCE.isRealIE)\r
+                               h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton" onmouseover="tinyMCE._menuButtonEvent(\'over\',this);tinyMCE.lastHover = this;" onmouseout="tinyMCE._menuButtonEvent(\'out\',this);">';\r
+                       else\r
+                               h += '<span id="{$editor_id}_' + id + '" dir="ltr" class="mceMenuButton">';\r
+\r
+                       h += '<a href="javascript:' + cmd + '" onclick="' + cmd + 'return false;" onmousedown="return false;" class="mceMenuButtonNormal" target="_self">';\r
+                       h += '<img src="' + img + '" title="{$' + lang + '}" /></a>';\r
+                       h += '<a href="javascript:' + mcmd + '" onclick="' + mcmd + 'return false;" onmousedown="return false;"><img src="{$themeurl}/images/button_menu.gif" title="{$' + lang + '}" class="mceMenuButton" />';\r
+                       h += '</a></span>';\r
+               }\r
+\r
+               return h;\r
+       },\r
+\r
+       _menuButtonEvent : function(e, o) {\r
+               if (o.className == 'mceMenuButtonFocus')\r
+                       return;\r
+\r
+               if (e == 'over')\r
+                       o.className = o.className + ' mceMenuHover';\r
+               else\r
+                       o.className = o.className.replace(/\s.*$/, '');\r
+       },\r
+\r
+       addButtonMap : function(m) {\r
+               var i, a = m.replace(/\s+/, '').split(',');\r
+\r
+               for (i=0; i<a.length; i++)\r
+                       this.buttonMap[a[i]] = i;\r
+       },\r
+\r
+       formSubmit : function(f, p) {\r
+               var n, inst, found = false;\r
+\r
+               if (f.form)\r
+                       f = f.form;\r
+\r
+               // Is it a form that has a TinyMCE instance\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (!tinyMCE.isInstance(inst))\r
+                               continue;\r
+\r
+                       if (inst.formElement) {\r
+                               if (f == inst.formElement.form) {\r
+                                       found = true;\r
+                                       inst.isNotDirty = true;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               // Is valid\r
+               if (found) {\r
+                       tinyMCE.removeTinyMCEFormElements(f);\r
+                       tinyMCE.triggerSave();\r
+               }\r
+\r
+               // Is it patched\r
+               if (f.mceOldSubmit && p)\r
+                       f.mceOldSubmit();\r
+       },\r
+\r
+       submitPatch : function() {\r
+               tinyMCE.formSubmit(this, true);\r
+       },\r
+\r
+       onLoad : function() {\r
+               var r, i, c, mode, trigger, elements, element, settings, elementId, elm;\r
+               var selector, deselector, elementRefAr, form;\r
+\r
+               // Wait for everything to be loaded first\r
+               if (tinyMCE.settings.strict_loading_mode && this.loadingIndex != -1) {\r
+                       window.setTimeout('tinyMCE.onLoad();', 1);\r
+                       return;\r
+               }\r
+\r
+               if (tinyMCE.isRealIE && window.event.type == "readystatechange" && document.readyState != "complete")\r
+                       return true;\r
+\r
+               if (tinyMCE.isLoaded)\r
+                       return true;\r
+\r
+               tinyMCE.isLoaded = true;\r
+\r
+               // IE produces JS error if TinyMCE is placed in a frame\r
+               // It seems to have something to do with the selection not beeing\r
+               // correctly initialized in IE so this hack solves the problem\r
+               if (tinyMCE.isRealIE && document.body && window.location.href != window.top.location.href) {\r
+                       r = document.body.createTextRange();\r
+                       r.collapse(true);\r
+                       r.select();\r
+               }\r
+\r
+               tinyMCE.dispatchCallback(null, 'onpageload', 'onPageLoad');\r
+\r
+               for (c=0; c<tinyMCE.configs.length; c++) {\r
+                       tinyMCE.settings = tinyMCE.configs[c];\r
+\r
+                       selector = tinyMCE.getParam("editor_selector");\r
+                       deselector = tinyMCE.getParam("editor_deselector");\r
+                       elementRefAr = [];\r
+\r
+                       // Add submit triggers\r
+                       if (document.forms && tinyMCE.settings.add_form_submit_trigger && !tinyMCE.submitTriggers) {\r
+                               for (i=0; i<document.forms.length; i++) {\r
+                                       form = document.forms[i];\r
+\r
+                                       tinyMCE.addEvent(form, "submit", TinyMCE_Engine.prototype.handleEvent);\r
+                                       tinyMCE.addEvent(form, "reset", TinyMCE_Engine.prototype.handleEvent);\r
+                                       tinyMCE.submitTriggers = true; // Do it only once\r
+\r
+                                       // Patch the form.submit function\r
+                                       if (tinyMCE.settings.submit_patch) {\r
+                                               try {\r
+                                                       form.mceOldSubmit = form.submit;\r
+                                                       form.submit = TinyMCE_Engine.prototype.submitPatch;\r
+                                               } catch (e) {\r
+                                                       // Do nothing\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Add editor instances based on mode\r
+                       mode = tinyMCE.settings.mode;\r
+                       switch (mode) {\r
+                               case "exact":\r
+                                       elements = tinyMCE.getParam('elements', '', true, ',');\r
+\r
+                                       for (i=0; i<elements.length; i++) {\r
+                                               element = tinyMCE._getElementById(elements[i]);\r
+                                               trigger = element ? element.getAttribute(tinyMCE.settings.textarea_trigger) : "";\r
+\r
+                                               if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(element, "class")))\r
+                                                       continue;\r
+\r
+                                               if (trigger == "false")\r
+                                                       continue;\r
+\r
+                                               if ((tinyMCE.settings.ask || tinyMCE.settings.convert_on_click) && element) {\r
+                                                       elementRefAr[elementRefAr.length] = element;\r
+                                                       continue;\r
+                                               }\r
+\r
+                                               if (element)\r
+                                                       tinyMCE.addMCEControl(element, elements[i]);\r
+                                       }\r
+                               break;\r
+\r
+                               case "specific_textareas":\r
+                               case "textareas":\r
+                                       elements = document.getElementsByTagName("textarea");\r
+\r
+                                       for (i=0; i<elements.length; i++) {\r
+                                               elm = elements.item(i);\r
+                                               trigger = elm.getAttribute(tinyMCE.settings.textarea_trigger);\r
+\r
+                                               if (selector !== '' && !new RegExp('\\b' + selector + '\\b').test(tinyMCE.getAttrib(elm, "class")))\r
+                                                       continue;\r
+\r
+                                               if (selector !== '')\r
+                                                       trigger = selector !== '' ? "true" : "";\r
+\r
+                                               if (new RegExp('\\b' + deselector + '\\b').test(tinyMCE.getAttrib(elm, "class")))\r
+                                                       continue;\r
+\r
+                                               if ((mode == "specific_textareas" && trigger == "true") || (mode == "textareas" && trigger != "false"))\r
+                                                       elementRefAr[elementRefAr.length] = elm;\r
+                                       }\r
+                               break;\r
+                       }\r
+\r
+                       for (i=0; i<elementRefAr.length; i++) {\r
+                               element = elementRefAr[i];\r
+                               elementId = element.name ? element.name : element.id;\r
+\r
+                               if (tinyMCE.settings.ask || tinyMCE.settings.convert_on_click) {\r
+                                       // Focus breaks in Mozilla\r
+                                       if (tinyMCE.isGecko) {\r
+                                               settings = tinyMCE.settings;\r
+\r
+                                               tinyMCE.addEvent(element, "focus", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});\r
+\r
+                                               if (element.nodeName != "TEXTAREA" && element.nodeName != "INPUT")\r
+                                                       tinyMCE.addEvent(element, "click", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});\r
+                                               // tinyMCE.addEvent(element, "mouseover", function (e) {window.setTimeout(function() {TinyMCE_Engine.prototype.confirmAdd(e, settings);}, 10);});\r
+                                       } else {\r
+                                               settings = tinyMCE.settings;\r
+\r
+                                               tinyMCE.addEvent(element, "focus", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });\r
+                                               tinyMCE.addEvent(element, "click", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });\r
+                                               // tinyMCE.addEvent(element, "mouseenter", function () { TinyMCE_Engine.prototype.confirmAdd(null, settings); });\r
+                                       }\r
+                               } else\r
+                                       tinyMCE.addMCEControl(element, elementId);\r
+                       }\r
+\r
+                       // Handle auto focus\r
+                       if (tinyMCE.settings.auto_focus) {\r
+                               window.setTimeout(function () {\r
+                                       var inst = tinyMCE.getInstanceById(tinyMCE.settings.auto_focus);\r
+                                       inst.selection.selectNode(inst.getBody(), true, true);\r
+                                       inst.contentWindow.focus();\r
+                               }, 100);\r
+                       }\r
+\r
+                       tinyMCE.dispatchCallback(null, 'oninit', 'onInit');\r
+               }\r
+       },\r
+\r
+       isInstance : function(o) {\r
+               return o != null && typeof(o) == "object" && o.isTinyMCE_Control;\r
+       },\r
+\r
+       getParam : function(name, default_value, strip_whitespace, split_chr) {\r
+               var i, outArray, value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];\r
+\r
+               // Fix bool values\r
+               if (value == "true" || value == "false")\r
+                       return (value == "true");\r
+\r
+               if (strip_whitespace)\r
+                       value = tinyMCE.regexpReplace(value, "[ \t\r\n]", "");\r
+\r
+               if (typeof(split_chr) != "undefined" && split_chr != null) {\r
+                       value = value.split(split_chr);\r
+                       outArray = [];\r
+\r
+                       for (i=0; i<value.length; i++) {\r
+                               if (value[i] && value[i] !== '')\r
+                                       outArray[outArray.length] = value[i];\r
+                       }\r
+\r
+                       value = outArray;\r
+               }\r
+\r
+               return value;\r
+       },\r
+\r
+       getLang : function(name, default_value, parse_entities, va) {\r
+               var v = (typeof(tinyMCELang[name]) == "undefined") ? default_value : tinyMCELang[name], n;\r
+\r
+               if (parse_entities)\r
+                       v = tinyMCE.entityDecode(v);\r
+\r
+               if (va) {\r
+                       for (n in va)\r
+                               v = this.replaceVar(v, n, va[n]);\r
+               }\r
+\r
+               return v;\r
+       },\r
+\r
+       entityDecode : function(s) {\r
+               var e = document.createElement("div");\r
+\r
+               e.innerHTML = s;\r
+\r
+               return !e.firstChild ? s : e.firstChild.nodeValue;\r
+       },\r
+\r
+       addToLang : function(prefix, ar) {\r
+               var k;\r
+\r
+               for (k in ar) {\r
+                       if (typeof(ar[k]) == 'function')\r
+                               continue;\r
+\r
+                       tinyMCELang[(k.indexOf('lang_') == -1 ? 'lang_' : '') + (prefix !== '' ? (prefix + "_") : '') + k] = ar[k];\r
+               }\r
+\r
+               this.loadNextScript();\r
+       },\r
+\r
+       triggerNodeChange : function(focus, setup_content) {\r
+               var elm, inst, editorId, undoIndex = -1, undoLevels = -1, doc, anySelection = false, st;\r
+\r
+               if (tinyMCE.selectedInstance) {\r
+                       inst = tinyMCE.selectedInstance;\r
+                       elm = (typeof(setup_content) != "undefined" && setup_content) ? tinyMCE.selectedElement : inst.getFocusElement();\r
+\r
+/*                     if (elm == inst.lastTriggerEl)\r
+                               return;\r
+\r
+                       inst.lastTriggerEl = elm;*/\r
+\r
+                       editorId = inst.editorId;\r
+                       st = inst.selection.getSelectedText();\r
+\r
+                       if (tinyMCE.settings.auto_resize)\r
+                               inst.resizeToContent();\r
+\r
+                       if (setup_content && tinyMCE.isGecko && inst.isHidden())\r
+                               elm = inst.getBody();\r
+\r
+                       inst.switchSettings();\r
+\r
+                       if (tinyMCE.selectedElement)\r
+                               anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (st && st.length > 0);\r
+\r
+                       if (tinyMCE.settings.custom_undo_redo) {\r
+                               undoIndex = inst.undoRedo.undoIndex;\r
+                               undoLevels = inst.undoRedo.undoLevels.length;\r
+                       }\r
+\r
+                       tinyMCE.dispatchCallback(inst, 'handle_node_change_callback', 'handleNodeChange', editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content);\r
+               }\r
+\r
+               if (this.selectedInstance && (typeof(focus) == "undefined" || focus))\r
+                       this.selectedInstance.contentWindow.focus();\r
+       },\r
+\r
+       _customCleanup : function(inst, type, content) {\r
+               var pl, po, i, customCleanup;\r
+\r
+               // Call custom cleanup\r
+               customCleanup = tinyMCE.settings.cleanup_callback;\r
+               if (customCleanup != '')\r
+                       content = tinyMCE.resolveDots(tinyMCE.settings.cleanup_callback, window)(type, content, inst);\r
+\r
+               // Trigger theme cleanup\r
+               po = tinyMCE.themes[tinyMCE.settings.theme];\r
+               if (po && po.cleanup)\r
+                       content = po.cleanup(type, content, inst);\r
+\r
+               // Trigger plugin cleanups\r
+               pl = inst.plugins;\r
+               for (i=0; i<pl.length; i++) {\r
+                       po = tinyMCE.plugins[pl[i]];\r
+\r
+                       if (po && po.cleanup)\r
+                               content = po.cleanup(type, content, inst);\r
+               }\r
+\r
+               return content;\r
+       },\r
+\r
+       setContent : function(h) {\r
+               if (tinyMCE.selectedInstance) {\r
+                       tinyMCE.selectedInstance.execCommand('mceSetContent', false, h);\r
+                       tinyMCE.selectedInstance.repaint();\r
+               }\r
+       },\r
+\r
+       importThemeLanguagePack : function(name) {\r
+               if (typeof(name) == "undefined")\r
+                       name = tinyMCE.settings.theme;\r
+\r
+               tinyMCE.loadScript(tinyMCE.baseURL + '/themes/' + name + '/langs/' + tinyMCE.settings.language + '.js');\r
+       },\r
+\r
+       importPluginLanguagePack : function(name) {\r
+               var b = tinyMCE.baseURL + '/plugins/' + name;\r
+\r
+               if (this.plugins[name])\r
+                       b = this.plugins[name].baseURL;\r
+\r
+               tinyMCE.loadScript(b + '/langs/' + tinyMCE.settings.language +  '.js');\r
+       },\r
+\r
+       applyTemplate : function(h, ag) {\r
+               return h.replace(new RegExp('\\{\\$([a-z0-9_]+)\\}', 'gi'), function(m, s) {\r
+                       if (s.indexOf('lang_') == 0 && tinyMCELang[s])\r
+                               return tinyMCELang[s];\r
+\r
+                       if (ag && ag[s])\r
+                               return ag[s];\r
+\r
+                       if (tinyMCE.settings[s])\r
+                               return tinyMCE.settings[s];\r
+\r
+                       if (m == 'themeurl')\r
+                               return tinyMCE.themeURL;\r
+\r
+                       return m;\r
+               });\r
+       },\r
+\r
+       replaceVar : function(h, r, v) {\r
+               return h.replace(new RegExp('{\\\$' + r + '}', 'g'), v);\r
+       },\r
+\r
+       openWindow : function(template, args) {\r
+               var html, width, height, x, y, resizable, scrollbars, url, name, win, modal, features;\r
+\r
+               args = !args ? {} : args;\r
+\r
+               args.mce_template_file = template.file;\r
+               args.mce_width = template.width;\r
+               args.mce_height = template.height;\r
+               tinyMCE.windowArgs = args;\r
+\r
+               html = template.html;\r
+               if (!(width = parseInt(template.width)))\r
+                       width = 320;\r
+\r
+               if (!(height = parseInt(template.height)))\r
+                       height = 200;\r
+\r
+               // Add to height in M$ due to SP2 WHY DON'T YOU GUYS IMPLEMENT innerWidth of windows!!\r
+               if (tinyMCE.isIE)\r
+                       height += 40;\r
+               else\r
+                       height += 20;\r
+\r
+               x = parseInt(screen.width / 2.0) - (width / 2.0);\r
+               y = parseInt(screen.height / 2.0) - (height / 2.0);\r
+\r
+               resizable = (args && args.resizable) ? args.resizable : "no";\r
+               scrollbars = (args && args.scrollbars) ? args.scrollbars : "no";\r
+\r
+               if (template.file.charAt(0) != '/' && template.file.indexOf('://') == -1)\r
+                       url = tinyMCE.baseURL + "/themes/" + tinyMCE.getParam("theme") + "/" + template.file;\r
+               else\r
+                       url = template.file;\r
+\r
+               // Replace all args as variables in URL\r
+               for (name in args) {\r
+                       if (typeof(args[name]) == 'function')\r
+                               continue;\r
+\r
+                       url = tinyMCE.replaceVar(url, name, escape(args[name]));\r
+               }\r
+\r
+               if (html) {\r
+                       html = tinyMCE.replaceVar(html, "css", this.settings.popups_css);\r
+                       html = tinyMCE.applyTemplate(html, args);\r
+\r
+                       win = window.open("", "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=yes,minimizable=" + resizable + ",modal=yes,width=" + width + ",height=" + height + ",resizable=" + resizable);\r
+                       if (win == null) {\r
+                               alert(tinyMCELang.lang_popup_blocked);\r
+                               return;\r
+                       }\r
+\r
+                       win.document.write(html);\r
+                       win.document.close();\r
+                       win.resizeTo(width, height);\r
+                       win.focus();\r
+               } else {\r
+                       if ((tinyMCE.isRealIE) && resizable != 'yes' && tinyMCE.settings.dialog_type == "modal") {\r
+                               height += 10;\r
+\r
+                               features = "resizable:" + resizable + ";scroll:" + scrollbars + ";status:yes;center:yes;help:no;dialogWidth:" + width + "px;dialogHeight:" + height + "px;";\r
+\r
+                               window.showModalDialog(url, window, features);\r
+                       } else {\r
+                               modal = (resizable == "yes") ? "no" : "yes";\r
+\r
+                               if (tinyMCE.isGecko && tinyMCE.isMac)\r
+                                       modal = "no";\r
+\r
+                               if (template.close_previous != "no")\r
+                                       try {tinyMCE.lastWindow.close();} catch (ex) {}\r
+\r
+                               win = window.open(url, "mcePopup" + new Date().getTime(), "top=" + y + ",left=" + x + ",scrollbars=" + scrollbars + ",dialog=" + modal + ",minimizable=" + resizable + ",modal=" + modal + ",width=" + width + ",height=" + height + ",resizable=" + resizable);\r
+                               if (win == null) {\r
+                                       alert(tinyMCELang.lang_popup_blocked);\r
+                                       return;\r
+                               }\r
+\r
+                               if (template.close_previous != "no")\r
+                                       tinyMCE.lastWindow = win;\r
+\r
+                               try {\r
+                                       win.resizeTo(width, height);\r
+                               } catch(e) {\r
+                                       // Ignore\r
+                               }\r
+\r
+                               // Make it bigger if statusbar is forced\r
+                               if (tinyMCE.isGecko) {\r
+                                       if (win.document.defaultView.statusbar.visible)\r
+                                               win.resizeBy(0, tinyMCE.isMac ? 10 : 24);\r
+                               }\r
+\r
+                               win.focus();\r
+                       }\r
+               }\r
+       },\r
+\r
+       closeWindow : function(win) {\r
+               win.close();\r
+       },\r
+\r
+       getVisualAidClass : function(class_name, state) {\r
+               var i, classNames, ar, className, aidClass = tinyMCE.settings.visual_table_class;\r
+\r
+               if (typeof(state) == "undefined")\r
+                       state = tinyMCE.settings.visual;\r
+\r
+               // Split\r
+               classNames = [];\r
+               ar = class_name.split(' ');\r
+               for (i=0; i<ar.length; i++) {\r
+                       if (ar[i] == aidClass)\r
+                               ar[i] = "";\r
+\r
+                       if (ar[i] !== '')\r
+                               classNames[classNames.length] = ar[i];\r
+               }\r
+\r
+               if (state)\r
+                       classNames[classNames.length] = aidClass;\r
+\r
+               // Glue\r
+               className = "";\r
+               for (i=0; i<classNames.length; i++) {\r
+                       if (i > 0)\r
+                               className += " ";\r
+\r
+                       className += classNames[i];\r
+               }\r
+\r
+               return className;\r
+       },\r
+\r
+       handleVisualAid : function(el, deep, state, inst, skip_dispatch) {\r
+               var i, x, y, tableElement, anchorName, oldW, oldH, bo, cn;\r
+\r
+               if (!el)\r
+                       return;\r
+\r
+               if (!skip_dispatch)\r
+                       tinyMCE.dispatchCallback(inst, 'handle_visual_aid_callback', 'handleVisualAid', el, deep, state, inst);\r
+\r
+               tableElement = null;\r
+\r
+               switch (el.nodeName) {\r
+                       case "TABLE":\r
+                               oldW = el.style.width;\r
+                               oldH = el.style.height;\r
+                               bo = tinyMCE.getAttrib(el, "border");\r
+\r
+                               bo = bo == '' || bo == "0" ? true : false;\r
+\r
+                               tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo));\r
+\r
+                               el.style.width = oldW;\r
+                               el.style.height = oldH;\r
+\r
+                               for (y=0; y<el.rows.length; y++) {\r
+                                       for (x=0; x<el.rows[y].cells.length; x++) {\r
+                                               cn = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el.rows[y].cells[x], "class"), state && bo);\r
+                                               tinyMCE.setAttrib(el.rows[y].cells[x], "class", cn);\r
+                                       }\r
+                               }\r
+\r
+                               break;\r
+\r
+                       case "A":\r
+                               anchorName = tinyMCE.getAttrib(el, "name");\r
+\r
+                               if (anchorName !== '' && state) {\r
+                                       el.title = anchorName;\r
+                                       tinyMCE.addCSSClass(el, 'mceItemAnchor');\r
+                               } else if (anchorName !== '' && !state)\r
+                                       el.className = '';\r
+\r
+                               break;\r
+               }\r
+\r
+               if (deep && el.hasChildNodes()) {\r
+                       for (i=0; i<el.childNodes.length; i++)\r
+                               tinyMCE.handleVisualAid(el.childNodes[i], deep, state, inst, true);\r
+               }\r
+       },\r
+\r
+       fixGeckoBaseHREFBug : function(m, e, h) {\r
+               var xsrc, xhref;\r
+\r
+               if (tinyMCE.isGecko) {\r
+                       if (m == 1) {\r
+                               h = h.replace(/\ssrc=/gi, " mce_tsrc=");\r
+                               h = h.replace(/\shref=/gi, " mce_thref=");\r
+\r
+                               return h;\r
+                       } else {\r
+                               // Why bother if there is no src or href broken\r
+                               if (!new RegExp('(src|href)=', 'g').test(h))\r
+                                       return h;\r
+\r
+                               // Restore src and href that gets messed up by Gecko\r
+                               tinyMCE.selectElements(e, 'A,IMG,SELECT,AREA,IFRAME,BASE,INPUT,SCRIPT,EMBED,OBJECT,LINK', function (n) {\r
+                                       xsrc = tinyMCE.getAttrib(n, "mce_tsrc");\r
+                                       xhref = tinyMCE.getAttrib(n, "mce_thref");\r
+\r
+                                       if (xsrc !== '') {\r
+                                               try {\r
+                                                       n.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, xsrc);\r
+                                               } catch (e) {\r
+                                                       // Ignore, Firefox cast exception if local file wasn't found\r
+                                               }\r
+\r
+                                               n.removeAttribute("mce_tsrc");\r
+                                       }\r
+\r
+                                       if (xhref !== '') {\r
+                                               try {\r
+                                                       n.href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, xhref);\r
+                                               } catch (e) {\r
+                                                       // Ignore, Firefox cast exception if local file wasn't found\r
+                                               }\r
+\r
+                                               n.removeAttribute("mce_thref");\r
+                                       }\r
+\r
+                                       return false;\r
+                               });\r
+\r
+                               // Restore text/comment nodes\r
+                               tinyMCE.selectNodes(e, function(n) {\r
+                                       if (n.nodeType == 3 || n.nodeType == 8) {\r
+                                               n.nodeValue = n.nodeValue.replace(/\smce_tsrc=/gi, " src=");\r
+                                               n.nodeValue = n.nodeValue.replace(/\smce_thref=/gi, " href=");\r
+                                       }\r
+\r
+                                       return false;\r
+                               });\r
+                       }\r
+               }\r
+\r
+               return h;\r
+       },\r
+\r
+       _setHTML : function(doc, html_content) {\r
+               var i, html, paras, node;\r
+\r
+               // Force closed anchors open\r
+               //html_content = html_content.replace(new RegExp('<a(.*?)/>', 'gi'), '<a$1></a>');\r
+\r
+               html_content = tinyMCE.cleanupHTMLCode(html_content);\r
+\r
+               // Try innerHTML if it fails use pasteHTML in MSIE\r
+               try {\r
+                       tinyMCE.setInnerHTML(doc.body, html_content);\r
+               } catch (e) {\r
+                       if (this.isMSIE)\r
+                               doc.body.createTextRange().pasteHTML(html_content);\r
+               }\r
+\r
+               // Content duplication bug fix\r
+               if (tinyMCE.isIE && tinyMCE.settings.fix_content_duplication) {\r
+                       // Remove P elements in P elements\r
+                       paras = doc.getElementsByTagName("P");\r
+                       for (i=0; i<paras.length; i++) {\r
+                               node = paras[i];\r
+\r
+                               while ((node = node.parentNode) != null) {\r
+                                       if (node.nodeName == "P")\r
+                                               node.outerHTML = node.innerHTML;\r
+                               }\r
+                       }\r
+\r
+                       // Content duplication bug fix (Seems to be word crap)\r
+                       html = doc.body.innerHTML;\r
+\r
+                       // Always set the htmlText output\r
+                       tinyMCE.setInnerHTML(doc.body, html);\r
+               }\r
+\r
+               tinyMCE.cleanupAnchors(doc);\r
+\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       tinyMCE.convertSpansToFonts(doc);\r
+       },\r
+\r
+       getEditorId : function(form_element) {\r
+               var inst = this.getInstanceById(form_element);\r
+\r
+               if (!inst)\r
+                       return null;\r
+\r
+               return inst.editorId;\r
+       },\r
+\r
+       getInstanceById : function(editor_id) {\r
+               var inst = this.instances[editor_id], n;\r
+\r
+               if (!inst) {\r
+                       for (n in tinyMCE.instances) {\r
+                               inst = tinyMCE.instances[n];\r
+\r
+                               if (!tinyMCE.isInstance(inst))\r
+                                       continue;\r
+\r
+                               if (inst.formTargetElementId == editor_id)\r
+                                       return inst;\r
+                       }\r
+               } else\r
+                       return inst;\r
+\r
+               return null;\r
+       },\r
+\r
+       queryInstanceCommandValue : function(editor_id, command) {\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               if (inst)\r
+                       return inst.queryCommandValue(command);\r
+\r
+               return false;\r
+       },\r
+\r
+       queryInstanceCommandState : function(editor_id, command) {\r
+               var inst = tinyMCE.getInstanceById(editor_id);\r
+\r
+               if (inst)\r
+                       return inst.queryCommandState(command);\r
+\r
+               return null;\r
+       },\r
+\r
+       setWindowArg : function(n, v) {\r
+               this.windowArgs[n] = v;\r
+       },\r
+\r
+       getWindowArg : function(n, d) {\r
+               return (typeof(this.windowArgs[n]) == "undefined") ? d : this.windowArgs[n];\r
+       },\r
+\r
+       getCSSClasses : function(editor_id, doc) {\r
+               var i, c, x, rule, styles, rules, csses, selectorText, inst = tinyMCE.getInstanceById(editor_id);\r
+               var cssClass, addClass, p;\r
+\r
+               if (!inst)\r
+                       inst = tinyMCE.selectedInstance;\r
+\r
+               if (!inst)\r
+                       return [];\r
+\r
+               if (!doc)\r
+                       doc = inst.getDoc();\r
+\r
+               // Is cached, use that\r
+               if (inst && inst.cssClasses.length > 0)\r
+                       return inst.cssClasses;\r
+\r
+               if (!doc)\r
+                       return;\r
+\r
+               styles = doc.styleSheets;\r
+\r
+               if (styles && styles.length > 0) {\r
+                       for (x=0; x<styles.length; x++) {\r
+                               csses = null;\r
+\r
+                               try {\r
+                                       csses = tinyMCE.isIE ? doc.styleSheets(x).rules : styles[x].cssRules;\r
+                               } catch(e) {\r
+                                       // Just ignore any errors I know this is ugly!!\r
+                               }\r
+       \r
+                               if (!csses)\r
+                                       return [];\r
+\r
+                               for (i=0; i<csses.length; i++) {\r
+                                       selectorText = csses[i].selectorText;\r
+\r
+                                       // Can be multiple rules per selector\r
+                                       if (selectorText) {\r
+                                               rules = selectorText.split(',');\r
+                                               for (c=0; c<rules.length; c++) {\r
+                                                       rule = rules[c];\r
+\r
+                                                       // Strip spaces between selectors\r
+                                                       while (rule.indexOf(' ') == 0)\r
+                                                               rule = rule.substring(1);\r
+\r
+                                                       // Invalid rule\r
+                                                       if (rule.indexOf(' ') != -1 || rule.indexOf(':') != -1 || rule.indexOf('mceItem') != -1)\r
+                                                               continue;\r
+\r
+                                                       if (rule.indexOf(tinyMCE.settings.visual_table_class) != -1 || rule.indexOf('mceEditable') != -1 || rule.indexOf('mceNonEditable') != -1)\r
+                                                               continue;\r
+\r
+                                                       // Is class rule\r
+                                                       if (rule.indexOf('.') != -1) {\r
+                                                               cssClass = rule.substring(rule.indexOf('.') + 1);\r
+                                                               addClass = true;\r
+\r
+                                                               for (p=0; p<inst.cssClasses.length && addClass; p++) {\r
+                                                                       if (inst.cssClasses[p] == cssClass)\r
+                                                                               addClass = false;\r
+                                                               }\r
+\r
+                                                               if (addClass)\r
+                                                                       inst.cssClasses[inst.cssClasses.length] = cssClass;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return inst.cssClasses;\r
+       },\r
+\r
+       regexpReplace : function(in_str, reg_exp, replace_str, opts) {\r
+               var re;\r
+\r
+               if (in_str == null)\r
+                       return in_str;\r
+\r
+               if (typeof(opts) == "undefined")\r
+                       opts = 'g';\r
+\r
+               re = new RegExp(reg_exp, opts);\r
+\r
+               return in_str.replace(re, replace_str);\r
+       },\r
+\r
+       trim : function(s) {\r
+               return s.replace(/^\s*|\s*$/g, "");\r
+       },\r
+\r
+       cleanupEventStr : function(s) {\r
+               s = "" + s;\r
+               s = s.replace('function anonymous()\n{\n', '');\r
+               s = s.replace('\n}', '');\r
+               s = s.replace(/^return true;/gi, ''); // Remove event blocker\r
+\r
+               return s;\r
+       },\r
+\r
+       getControlHTML : function(c) {\r
+               var i, l, n, o, v, rtl = tinyMCE.getLang('lang_dir') == 'rtl';\r
+\r
+               l = tinyMCE.plugins;\r
+               for (n in l) {\r
+                       o = l[n];\r
+\r
+                       if (o.getControlHTML && (v = o.getControlHTML(c)) !== '') {\r
+                               if (rtl)\r
+                                       return '<span dir="rtl">' + tinyMCE.replaceVar(v, "pluginurl", o.baseURL) + '</span>';\r
+\r
+                               return tinyMCE.replaceVar(v, "pluginurl", o.baseURL);\r
+                       }\r
+               }\r
+\r
+               o = tinyMCE.themes[tinyMCE.settings.theme];\r
+               if (o.getControlHTML && (v = o.getControlHTML(c)) !== '') {\r
+                       if (rtl)\r
+                               return '<span dir="rtl">' + v + '</span>';\r
+\r
+                       return v;\r
+               }\r
+\r
+               return '';\r
+       },\r
+\r
+       evalFunc : function(f, idx, a, o) {\r
+               o = !o ? window : o;\r
+               f = typeof(f) == 'function' ? f : o[f];\r
+\r
+               return f.apply(o, Array.prototype.slice.call(a, idx));\r
+       },\r
+\r
+       dispatchCallback : function(i, p, n) {\r
+               return this.callFunc(i, p, n, 0, this.dispatchCallback.arguments);\r
+       },\r
+\r
+       executeCallback : function(i, p, n) {\r
+               return this.callFunc(i, p, n, 1, this.executeCallback.arguments);\r
+       },\r
+\r
+       execCommandCallback : function(i, p, n) {\r
+               return this.callFunc(i, p, n, 2, this.execCommandCallback.arguments);\r
+       },\r
+\r
+       callFunc : function(ins, p, n, m, a) {\r
+               var l, i, on, o, s, v;\r
+\r
+               s = m == 2;\r
+\r
+               l = tinyMCE.getParam(p, '');\r
+\r
+               if (l !== '' && (v = tinyMCE.evalFunc(l, 3, a)) == s && m > 0)\r
+                       return true;\r
+\r
+               if (ins != null) {\r
+                       for (i=0, l = ins.plugins; i<l.length; i++) {\r
+                               o = tinyMCE.plugins[l[i]];\r
+\r
+                               if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)\r
+                                       return true;\r
+                       }\r
+               }\r
+\r
+               l = tinyMCE.themes;\r
+               for (on in l) {\r
+                       o = l[on];\r
+\r
+                       if (o[n] && (v = tinyMCE.evalFunc(n, 3, a, o)) == s && m > 0)\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       resolveDots : function(s, o) {\r
+               var i;\r
+\r
+               if (typeof(s) == 'string') {\r
+                       for (i=0, s=s.split('.'); i<s.length; i++)\r
+                               o = o[s[i]];\r
+               } else\r
+                       o = s;\r
+\r
+               return o;\r
+       },\r
+\r
+       xmlEncode : function(s) {\r
+               return s ? ('' + s).replace(this.xmlEncodeRe, function (c, b) {\r
+                       switch (c) {\r
+                               case '&':\r
+                                       return '&amp;';\r
+\r
+                               case '"':\r
+                                       return '&quot;';\r
+\r
+                               case '<':\r
+                                       return '&lt;';\r
+\r
+                               case '>':\r
+                                       return '&gt;';\r
+                       }\r
+\r
+                       return c;\r
+               }) : s;\r
+       },\r
+\r
+       add : function(c, m) {\r
+               var n;\r
+\r
+               for (n in m)\r
+                       c.prototype[n] = m[n];\r
+       },\r
+\r
+       extend : function(p, np) {\r
+               var o = {}, n;\r
+\r
+               o.parent = p;\r
+\r
+               for (n in p)\r
+                       o[n] = p[n];\r
+\r
+               for (n in np)\r
+                       o[n] = np[n];\r
+\r
+               return o;\r
+       },\r
+\r
+       hideMenus : function() {\r
+               var e = tinyMCE.lastSelectedMenuBtn;\r
+\r
+               if (tinyMCE.lastMenu) {\r
+                       tinyMCE.lastMenu.hide();\r
+                       tinyMCE.lastMenu = null;\r
+               }\r
+\r
+               if (e) {\r
+                       tinyMCE.switchClass(e, tinyMCE.lastMenuBtnClass);\r
+                       tinyMCE.lastSelectedMenuBtn = null;\r
+               }\r
+       }\r
+\r
+       };\r
+\r
+// Global instances\r
+var TinyMCE = TinyMCE_Engine; // Compatiblity with gzip compressors\r
+var tinyMCE = new TinyMCE_Engine();\r
+var tinyMCELang = {};\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Control.class.js */\r
+\r
+function TinyMCE_Control(settings) {\r
+       var t, i, tos, fu, p, x, fn, fu, pn, s = settings;\r
+\r
+       this.undoRedoLevel = true;\r
+       this.isTinyMCE_Control = true;\r
+\r
+       // Default settings\r
+       this.enabled = true;\r
+       this.settings = s;\r
+       this.settings.theme = tinyMCE.getParam("theme", "default");\r
+       this.settings.width = tinyMCE.getParam("width", -1);\r
+       this.settings.height = tinyMCE.getParam("height", -1);\r
+       this.selection = new TinyMCE_Selection(this);\r
+       this.undoRedo = new TinyMCE_UndoRedo(this);\r
+       this.cleanup = new TinyMCE_Cleanup();\r
+       this.shortcuts = [];\r
+       this.hasMouseMoved = false;\r
+       this.foreColor = this.backColor = "#999999";\r
+       this.data = {};\r
+       this.cssClasses = [];\r
+\r
+       this.cleanup.init({\r
+               valid_elements : s.valid_elements,\r
+               extended_valid_elements : s.extended_valid_elements,\r
+               valid_child_elements : s.valid_child_elements,\r
+               entities : s.entities,\r
+               entity_encoding : s.entity_encoding,\r
+               debug : s.cleanup_debug,\r
+               indent : s.apply_source_formatting,\r
+               invalid_elements : s.invalid_elements,\r
+               verify_html : s.verify_html,\r
+               fix_content_duplication : s.fix_content_duplication,\r
+               convert_fonts_to_spans : s.convert_fonts_to_spans\r
+       });\r
+\r
+       // Wrap old theme\r
+       t = this.settings.theme;\r
+       if (!tinyMCE.hasTheme(t)) {\r
+               fn = tinyMCE.callbacks;\r
+               tos = {};\r
+\r
+               for (i=0; i<fn.length; i++) {\r
+                       if ((fu = window['TinyMCE_' + t + "_" + fn[i]]))\r
+                               tos[fn[i]] = fu;\r
+               }\r
+\r
+               tinyMCE.addTheme(t, tos);\r
+       }\r
+\r
+       // Wrap old plugins\r
+       this.plugins = [];\r
+       p = tinyMCE.getParam('plugins', '', true, ',');\r
+       if (p.length > 0) {\r
+               for (i=0; i<p.length; i++) {\r
+                       pn = p[i];\r
+\r
+                       if (pn.charAt(0) == '-')\r
+                               pn = pn.substring(1);\r
+\r
+                       if (!tinyMCE.hasPlugin(pn)) {\r
+                               fn = tinyMCE.callbacks;\r
+                               tos = {};\r
+\r
+                               for (x=0; x<fn.length; x++) {\r
+                                       if ((fu = window['TinyMCE_' + pn + "_" + fn[x]]))\r
+                                               tos[fn[x]] = fu;\r
+                               }\r
+\r
+                               tinyMCE.addPlugin(pn, tos);\r
+                       }\r
+\r
+                       this.plugins[this.plugins.length] = pn; \r
+               }\r
+       }\r
+};\r
+\r
+TinyMCE_Control.prototype = {\r
+       selection : null,\r
+\r
+       settings : null,\r
+\r
+       cleanup : null,\r
+\r
+       getData : function(na) {\r
+               var o = this.data[na];\r
+\r
+               if (!o)\r
+                       o = this.data[na] = {};\r
+\r
+               return o;\r
+       },\r
+\r
+       hasPlugin : function(n) {\r
+               var i;\r
+\r
+               for (i=0; i<this.plugins.length; i++) {\r
+                       if (this.plugins[i] == n)\r
+                               return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       addPlugin : function(n, p) {\r
+               if (!this.hasPlugin(n)) {\r
+                       tinyMCE.addPlugin(n, p);\r
+                       this.plugins[this.plugins.length] = n;\r
+               }\r
+       },\r
+\r
+       repaint : function() {\r
+               var s, b, ex;\r
+\r
+               if (tinyMCE.isRealIE)\r
+                       return;\r
+\r
+               try {\r
+                       s = this.selection;\r
+                       b = s.getBookmark(true);\r
+                       this.getBody().style.display = 'none';\r
+                       this.getDoc().execCommand('selectall', false, null);\r
+                       this.getSel().collapseToStart();\r
+                       this.getBody().style.display = 'block';\r
+                       s.moveToBookmark(b);\r
+               } catch (ex) {\r
+                       // Ignore\r
+               }\r
+       },\r
+\r
+       switchSettings : function() {\r
+               if (tinyMCE.configs.length > 1 && tinyMCE.currentConfig != this.settings.index) {\r
+                       tinyMCE.settings = this.settings;\r
+                       tinyMCE.currentConfig = this.settings.index;\r
+               }\r
+       },\r
+\r
+       select : function() {\r
+               var oldInst = tinyMCE.selectedInstance;\r
+\r
+               if (oldInst != this) {\r
+                       if (oldInst)\r
+                               oldInst.execCommand('mceEndTyping');\r
+\r
+                       tinyMCE.dispatchCallback(this, 'select_instance_callback', 'selectInstance', this, oldInst);\r
+                       tinyMCE.selectedInstance = this;\r
+               }\r
+       },\r
+\r
+       getBody : function() {\r
+               return this.contentBody ? this.contentBody : this.getDoc().body;\r
+       },\r
+\r
+       getDoc : function() {\r
+//             return this.contentDocument ? this.contentDocument : this.contentWindow.document; // Removed due to IE 5.5 ?\r
+               return this.contentWindow.document;\r
+       },\r
+\r
+       getWin : function() {\r
+               return this.contentWindow;\r
+       },\r
+\r
+       getContainerWin : function() {\r
+               return this.containerWindow ? this.containerWindow : window;\r
+       },\r
+\r
+       getViewPort : function() {\r
+               return tinyMCE.getViewPort(this.getWin());\r
+       },\r
+\r
+       getParentNode : function(n, f) {\r
+               return tinyMCE.getParentNode(n, f, this.getBody());\r
+       },\r
+\r
+       getParentElement : function(n, na, f) {\r
+               return tinyMCE.getParentElement(n, na, f, this.getBody());\r
+       },\r
+\r
+       getParentBlockElement : function(n) {\r
+               return tinyMCE.getParentBlockElement(n, this.getBody());\r
+       },\r
+\r
+       resizeToContent : function() {\r
+               var d = this.getDoc(), b = d.body, de = d.documentElement;\r
+\r
+               this.iframeElement.style.height = (tinyMCE.isRealIE) ? b.scrollHeight : de.offsetHeight + 'px';\r
+       },\r
+\r
+       addShortcut : function(m, k, d, cmd, ui, va) {\r
+               var n = typeof(k) == "number", ie = tinyMCE.isIE, c, sc, i, scl = this.shortcuts;\r
+\r
+               if (!tinyMCE.getParam('custom_shortcuts'))\r
+                       return false;\r
+\r
+               m = m.toLowerCase();\r
+               k = ie && !n ? k.toUpperCase() : k;\r
+               c = n ? null : k.charCodeAt(0);\r
+               d = d && d.indexOf('lang_') == 0 ? tinyMCE.getLang(d) : d;\r
+\r
+               sc = {\r
+                       alt : m.indexOf('alt') != -1,\r
+                       ctrl : m.indexOf('ctrl') != -1,\r
+                       shift : m.indexOf('shift') != -1,\r
+                       charCode : c,\r
+                       keyCode : n ? k : (ie ? c : null),\r
+                       desc : d,\r
+                       cmd : cmd,\r
+                       ui : ui,\r
+                       val : va\r
+               };\r
+\r
+               for (i=0; i<scl.length; i++) {\r
+                       if (sc.alt == scl[i].alt && sc.ctrl == scl[i].ctrl && sc.shift == scl[i].shift\r
+                               && sc.charCode == scl[i].charCode && sc.keyCode == scl[i].keyCode) {\r
+                               return false;\r
+                       }\r
+               }\r
+\r
+               scl[scl.length] = sc;\r
+\r
+               return true;\r
+       },\r
+\r
+       handleShortcut : function(e) {\r
+               var i, s, o;\r
+\r
+               // Normal key press, then ignore it\r
+               if (!e.altKey && !e.ctrlKey)\r
+                       return false;\r
+\r
+               s = this.shortcuts;\r
+\r
+               for (i=0; i<s.length; i++) {\r
+                       o = s[i];\r
+\r
+                       if (o.alt == e.altKey && o.ctrl == e.ctrlKey && (o.keyCode == e.keyCode || o.charCode == e.charCode)) {\r
+                               if (o.cmd && (e.type == "keydown" || (e.type == "keypress" && !tinyMCE.isOpera)))\r
+                                       tinyMCE.execCommand(o.cmd, o.ui, o.val);\r
+\r
+                               tinyMCE.cancelEvent(e);\r
+                               return true;\r
+                       }\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       autoResetDesignMode : function() {\r
+               // Add fix for tab/style.display none/block problems in Gecko\r
+               if (!tinyMCE.isIE && this.isHidden() && tinyMCE.getParam('auto_reset_designmode'))\r
+                       eval('try { this.getDoc().designMode = "On"; this.useCSS = false; } catch(e) {}');\r
+       },\r
+\r
+       isHidden : function() {\r
+               var s;\r
+\r
+               if (tinyMCE.isIE)\r
+                       return false;\r
+\r
+               s = this.getSel();\r
+\r
+               // Weird, wheres that cursor selection?\r
+               return (!s || !s.rangeCount || s.rangeCount == 0);\r
+       },\r
+\r
+       isDirty : function() {\r
+               // Is content modified and not in a submit procedure\r
+               return tinyMCE.trim(this.startContent) != tinyMCE.trim(this.getBody().innerHTML) && !this.isNotDirty;\r
+       },\r
+\r
+       _mergeElements : function(scmd, pa, ch, override) {\r
+               var st, stc, className, n;\r
+\r
+               if (scmd == "removeformat") {\r
+                       pa.className = "";\r
+                       pa.style.cssText = "";\r
+                       ch.className = "";\r
+                       ch.style.cssText = "";\r
+                       return;\r
+               }\r
+\r
+               st = tinyMCE.parseStyle(tinyMCE.getAttrib(pa, "style"));\r
+               stc = tinyMCE.parseStyle(tinyMCE.getAttrib(ch, "style"));\r
+               className = tinyMCE.getAttrib(pa, "class");\r
+\r
+               // Removed class adding due to bug #1478272\r
+               className = tinyMCE.getAttrib(ch, "class");\r
+\r
+               if (override) {\r
+                       for (n in st) {\r
+                               if (typeof(st[n]) == 'function')\r
+                                       continue;\r
+\r
+                               stc[n] = st[n];\r
+                       }\r
+               } else {\r
+                       for (n in stc) {\r
+                               if (typeof(stc[n]) == 'function')\r
+                                       continue;\r
+\r
+                               st[n] = stc[n];\r
+                       }\r
+               }\r
+\r
+               tinyMCE.setAttrib(pa, "style", tinyMCE.serializeStyle(st));\r
+               tinyMCE.setAttrib(pa, "class", tinyMCE.trim(className));\r
+               ch.className = "";\r
+               ch.style.cssText = "";\r
+               ch.removeAttribute("class");\r
+               ch.removeAttribute("style");\r
+       },\r
+\r
+       _fixRootBlocks : function() {\r
+               var rb, b, ne, be, nx, bm;\r
+\r
+               rb = tinyMCE.getParam('forced_root_block');\r
+               if (!rb)\r
+                       return;\r
+\r
+               b = this.getBody();\r
+               ne = b.firstChild;\r
+\r
+               while (ne) {\r
+                       nx = ne.nextSibling;\r
+\r
+                       // If text node or inline element wrap it in a block element\r
+                       if (ne.nodeType == 3 || !tinyMCE.blockRegExp.test(ne.nodeName)) {\r
+                               if (!bm)\r
+                                       bm = this.selection.getBookmark();\r
+\r
+                               if (!be) {\r
+                                       be = this.getDoc().createElement(rb);\r
+                                       be.appendChild(ne.cloneNode(true));\r
+                                       b.replaceChild(be, ne);\r
+                               } else {\r
+                                       be.appendChild(ne.cloneNode(true));\r
+                                       b.removeChild(ne);\r
+                               }\r
+                       } else\r
+                               be = null;\r
+\r
+                       ne = nx;\r
+               }\r
+\r
+               if (bm)\r
+                       this.selection.moveToBookmark(bm);\r
+       },\r
+\r
+       _fixTrailingNbsp : function() {\r
+               var s = this.selection, e = s.getFocusElement(), bm, v;\r
+\r
+               if (e && tinyMCE.blockRegExp.test(e.nodeName) && e.firstChild) {\r
+                       v = e.firstChild.nodeValue;\r
+\r
+                       if (v && v.length > 1 && /(^\u00a0|\u00a0$)/.test(v)) {\r
+                               e.firstChild.nodeValue = v.replace(/(^\u00a0|\u00a0$)/, '');\r
+                               s.selectNode(e.firstChild, true, false, false); // Select and collapse\r
+                       }\r
+               }\r
+       },\r
+\r
+       _setUseCSS : function(b) {\r
+               var d = this.getDoc();\r
+\r
+               try {d.execCommand("useCSS", false, !b);} catch (ex) {}\r
+               try {d.execCommand("styleWithCSS", false, b);} catch (ex) {}\r
+\r
+               if (!tinyMCE.getParam("table_inline_editing"))\r
+                       try {d.execCommand('enableInlineTableEditing', false, "false");} catch (ex) {}\r
+\r
+               if (!tinyMCE.getParam("object_resizing"))\r
+                       try {d.execCommand('enableObjectResizing', false, "false");} catch (ex) {}\r
+       },\r
+\r
+       execCommand : function(command, user_interface, value) {\r
+               var i, x, z, align, img, div, doc = this.getDoc(), win = this.getWin(), focusElm = this.getFocusElement();\r
+\r
+               // Is not a undo specific command\r
+               if (!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel', 'gi').test(command))\r
+                       this.undoBookmark = null;\r
+\r
+               // Mozilla issue\r
+               if (!tinyMCE.isIE && !this.useCSS) {\r
+                       this._setUseCSS(false);\r
+                       this.useCSS = true;\r
+               }\r
+\r
+               //debug("command: " + command + ", user_interface: " + user_interface + ", value: " + value);\r
+               this.contentDocument = doc; // <-- Strange, unless this is applied Mozilla 1.3 breaks\r
+\r
+               // Don't dispatch key commands\r
+               if (!/mceStartTyping|mceEndTyping/.test(command)) {\r
+                       if (tinyMCE.execCommandCallback(this, 'execcommand_callback', 'execCommand', this.editorId, this.getBody(), command, user_interface, value))\r
+                               return;\r
+               }\r
+\r
+               // Fix align on images\r
+               if (focusElm && focusElm.nodeName == "IMG") {\r
+                       align = focusElm.getAttribute('align');\r
+                       img = command == "JustifyCenter" ? focusElm.cloneNode(false) : focusElm;\r
+\r
+                       switch (command) {\r
+                               case "JustifyLeft":\r
+                                       if (align == 'left')\r
+                                               img.removeAttribute('align');\r
+                                       else\r
+                                               img.setAttribute('align', 'left');\r
+\r
+                                       // Remove the div\r
+                                       div = focusElm.parentNode;\r
+                                       if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
+                                               div.parentNode.replaceChild(img, div);\r
+\r
+                                       this.selection.selectNode(img);\r
+                                       this.repaint();\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return;\r
+\r
+                               case "JustifyCenter":\r
+                                       img.removeAttribute('align');\r
+\r
+                                       // Is centered\r
+                                       div = tinyMCE.getParentElement(focusElm, "div");\r
+                                       if (div && div.style.textAlign == "center") {\r
+                                               // Remove div\r
+                                               if (div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
+                                                       div.parentNode.replaceChild(img, div);\r
+                                       } else {\r
+                                               // Add div\r
+                                               div = this.getDoc().createElement("div");\r
+                                               div.style.textAlign = 'center';\r
+                                               div.appendChild(img);\r
+                                               focusElm.parentNode.replaceChild(div, focusElm);\r
+                                       }\r
+\r
+                                       this.selection.selectNode(img);\r
+                                       this.repaint();\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return;\r
+\r
+                               case "JustifyRight":\r
+                                       if (align == 'right')\r
+                                               img.removeAttribute('align');\r
+                                       else\r
+                                               img.setAttribute('align', 'right');\r
+\r
+                                       // Remove the div\r
+                                       div = focusElm.parentNode;\r
+                                       if (div && div.nodeName == "DIV" && div.childNodes.length == 1 && div.parentNode)\r
+                                               div.parentNode.replaceChild(img, div);\r
+\r
+                                       this.selection.selectNode(img);\r
+                                       this.repaint();\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return;\r
+                       }\r
+               }\r
+\r
+               if (tinyMCE.settings.force_br_newlines) {\r
+                       var alignValue = "";\r
+\r
+                       if (doc.selection.type != "Control") {\r
+                               switch (command) {\r
+                                               case "JustifyLeft":\r
+                                                       alignValue = "left";\r
+                                                       break;\r
+\r
+                                               case "JustifyCenter":\r
+                                                       alignValue = "center";\r
+                                                       break;\r
+\r
+                                               case "JustifyFull":\r
+                                                       alignValue = "justify";\r
+                                                       break;\r
+\r
+                                               case "JustifyRight":\r
+                                                       alignValue = "right";\r
+                                                       break;\r
+                               }\r
+\r
+                               if (alignValue !== '') {\r
+                                       var rng = doc.selection.createRange();\r
+\r
+                                       if ((divElm = tinyMCE.getParentElement(rng.parentElement(), "div")) != null)\r
+                                               divElm.setAttribute("align", alignValue);\r
+                                       else if (rng.pasteHTML && rng.htmlText.length > 0)\r
+                                               rng.pasteHTML('<div align="' + alignValue + '">' + rng.htmlText + "</div>");\r
+\r
+                                       tinyMCE.triggerNodeChange();\r
+                                       return;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               switch (command) {\r
+                       case "mceRepaint":\r
+                               this.repaint();\r
+                               return true;\r
+\r
+                       case "unlink":\r
+                               // Unlink if caret is inside link\r
+                               if (tinyMCE.isGecko && this.getSel().isCollapsed) {\r
+                                       focusElm = tinyMCE.getParentElement(focusElm, 'A');\r
+\r
+                                       if (focusElm)\r
+                                               this.selection.selectNode(focusElm, false);\r
+                               }\r
+\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                               tinyMCE.isGecko && this.getSel().collapseToEnd();\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               return true;\r
+\r
+                       case "InsertUnorderedList":\r
+                       case "InsertOrderedList":\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+                               tinyMCE.triggerNodeChange();\r
+                               break;\r
+\r
+                       case "Strikethrough":\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+                               tinyMCE.triggerNodeChange();\r
+                               break;\r
+\r
+                       case "mceSelectNode":\r
+                               this.selection.selectNode(value);\r
+                               tinyMCE.triggerNodeChange();\r
+                               tinyMCE.selectedNode = value;\r
+                               break;\r
+\r
+                       case "FormatBlock":\r
+                               if (value == null || value == '') {\r
+                                       var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address,blockquote,dt,dl,dd,samp");\r
+\r
+                                       if (elm)\r
+                                               this.execCommand("mceRemoveNode", false, elm);\r
+                               } else {\r
+                                       if (!this.cleanup.isValid(value))\r
+                                               return true;\r
+\r
+                                       if (tinyMCE.isGecko && new RegExp('<(div|blockquote|code|dt|dd|dl|samp)>', 'gi').test(value))\r
+                                               value = value.replace(/[^a-z]/gi, '');\r
+\r
+                                       if (tinyMCE.isIE && new RegExp('blockquote|code|samp', 'gi').test(value)) {\r
+                                               var b = this.selection.getBookmark();\r
+                                               this.getDoc().execCommand("FormatBlock", false, '<p>');\r
+                                               tinyMCE.renameElement(tinyMCE.getParentBlockElement(this.getFocusElement()), value);\r
+                                               this.selection.moveToBookmark(b);\r
+                                       } else\r
+                                               this.getDoc().execCommand("FormatBlock", false, value);\r
+                               }\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               break;\r
+\r
+                       case "mceRemoveNode":\r
+                               if (!value)\r
+                                       value = tinyMCE.getParentElement(this.getFocusElement());\r
+\r
+                               if (tinyMCE.isIE) {\r
+                                       value.outerHTML = value.innerHTML;\r
+                               } else {\r
+                                       var rng = value.ownerDocument.createRange();\r
+                                       rng.setStartBefore(value);\r
+                                       rng.setEndAfter(value);\r
+                                       rng.deleteContents();\r
+                                       rng.insertNode(rng.createContextualFragment(value.innerHTML));\r
+                               }\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               break;\r
+\r
+                       case "mceSelectNodeDepth":\r
+                               var parentNode = this.getFocusElement();\r
+                               for (i=0; parentNode; i++) {\r
+                                       if (parentNode.nodeName.toLowerCase() == "body")\r
+                                               break;\r
+\r
+                                       if (parentNode.nodeName.toLowerCase() == "#text") {\r
+                                               i--;\r
+                                               parentNode = parentNode.parentNode;\r
+                                               continue;\r
+                                       }\r
+\r
+                                       if (i == value) {\r
+                                               this.selection.selectNode(parentNode, false);\r
+                                               tinyMCE.triggerNodeChange();\r
+                                               tinyMCE.selectedNode = parentNode;\r
+                                               return;\r
+                                       }\r
+\r
+                                       parentNode = parentNode.parentNode;\r
+                               }\r
+\r
+                               break;\r
+\r
+                       case "mceSetStyleInfo":\r
+                       case "SetStyleInfo":\r
+                               var rng = this.getRng();\r
+                               var sel = this.getSel();\r
+                               var scmd = value.command;\r
+                               var sname = value.name;\r
+                               var svalue = value.value == null ? '' : value.value;\r
+                               //var svalue = value['value'] == null ? '' : value['value'];\r
+                               var wrapper = value.wrapper ? value.wrapper : "span";\r
+                               var parentElm = null;\r
+                               var invalidRe = new RegExp("^BODY|HTML$", "g");\r
+                               var invalidParentsRe = tinyMCE.settings.merge_styles_invalid_parents !== '' ? new RegExp(tinyMCE.settings.merge_styles_invalid_parents, "gi") : null;\r
+\r
+                               // Whole element selected check\r
+                               if (tinyMCE.isIE) {\r
+                                       // Control range\r
+                                       if (rng.item)\r
+                                               parentElm = rng.item(0);\r
+                                       else {\r
+                                               var pelm = rng.parentElement();\r
+                                               var prng = doc.selection.createRange();\r
+                                               prng.moveToElementText(pelm);\r
+\r
+                                               if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) {\r
+                                                       if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName))\r
+                                                               parentElm = pelm;\r
+                                               }\r
+                                       }\r
+                               } else {\r
+                                       var felm = this.getFocusElement();\r
+                                       if (sel.isCollapsed || (new RegExp('td|tr|tbody|table|img', 'gi').test(felm.nodeName) && sel.anchorNode == felm.parentNode))\r
+                                               parentElm = felm;\r
+                               }\r
+\r
+                               // Whole element selected\r
+                               if (parentElm && !invalidRe.test(parentElm.nodeName)) {\r
+                                       if (scmd == "setstyle")\r
+                                               tinyMCE.setStyleAttrib(parentElm, sname, svalue);\r
+\r
+                                       if (scmd == "setattrib")\r
+                                               tinyMCE.setAttrib(parentElm, sname, svalue);\r
+\r
+                                       if (scmd == "removeformat") {\r
+                                               parentElm.style.cssText = '';\r
+                                               tinyMCE.setAttrib(parentElm, 'class', '');\r
+                                       }\r
+\r
+                                       // Remove style/attribs from all children\r
+                                       var ch = tinyMCE.getNodeTree(parentElm, [], 1);\r
+                                       for (z=0; z<ch.length; z++) {\r
+                                               if (ch[z] == parentElm)\r
+                                                       continue;\r
+\r
+                                               if (scmd == "setstyle")\r
+                                                       tinyMCE.setStyleAttrib(ch[z], sname, '');\r
+\r
+                                               if (scmd == "setattrib")\r
+                                                       tinyMCE.setAttrib(ch[z], sname, '');\r
+\r
+                                               if (scmd == "removeformat") {\r
+                                                       ch[z].style.cssText = '';\r
+                                                       tinyMCE.setAttrib(ch[z], 'class', '');\r
+                                               }\r
+                                       }\r
+                               } else {\r
+                                       this._setUseCSS(false); // Bug in FF when running in fullscreen\r
+                                       doc.execCommand("FontName", false, "#mce_temp_font#");\r
+                                       var elementArray = tinyMCE.getElementsByAttributeValue(this.getBody(), "font", "face", "#mce_temp_font#");\r
+\r
+                                       // Change them all\r
+                                       for (x=0; x<elementArray.length; x++) {\r
+                                               elm = elementArray[x];\r
+                                               if (elm) {\r
+                                                       var spanElm = doc.createElement(wrapper);\r
+\r
+                                                       if (scmd == "setstyle")\r
+                                                               tinyMCE.setStyleAttrib(spanElm, sname, svalue);\r
+\r
+                                                       if (scmd == "setattrib")\r
+                                                               tinyMCE.setAttrib(spanElm, sname, svalue);\r
+\r
+                                                       if (scmd == "removeformat") {\r
+                                                               spanElm.style.cssText = '';\r
+                                                               tinyMCE.setAttrib(spanElm, 'class', '');\r
+                                                       }\r
+\r
+                                                       if (elm.hasChildNodes()) {\r
+                                                               for (i=0; i<elm.childNodes.length; i++)\r
+                                                                       spanElm.appendChild(elm.childNodes[i].cloneNode(true));\r
+                                                       }\r
+\r
+                                                       spanElm.setAttribute("mce_new", "true");\r
+                                                       elm.parentNode.replaceChild(spanElm, elm);\r
+\r
+                                                       // Remove style/attribs from all children\r
+                                                       var ch = tinyMCE.getNodeTree(spanElm, [], 1);\r
+                                                       for (z=0; z<ch.length; z++) {\r
+                                                               if (ch[z] == spanElm)\r
+                                                                       continue;\r
+\r
+                                                               if (scmd == "setstyle")\r
+                                                                       tinyMCE.setStyleAttrib(ch[z], sname, '');\r
+\r
+                                                               if (scmd == "setattrib")\r
+                                                                       tinyMCE.setAttrib(ch[z], sname, '');\r
+\r
+                                                               if (scmd == "removeformat") {\r
+                                                                       ch[z].style.cssText = '';\r
+                                                                       tinyMCE.setAttrib(ch[z], 'class', '');\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               // Cleaup wrappers\r
+                               var nodes = doc.getElementsByTagName(wrapper);\r
+                               for (i=nodes.length-1; i>=0; i--) {\r
+                                       var elm = nodes[i];\r
+                                       var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true";\r
+\r
+                                       elm.removeAttribute("mce_new");\r
+\r
+                                       // Is only child a element\r
+                                       if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) {\r
+                                               //tinyMCE.debug("merge1" + isNew);\r
+                                               this._mergeElements(scmd, elm, elm.childNodes[0], isNew);\r
+                                               continue;\r
+                                       }\r
+\r
+                                       // Is I the only child\r
+                                       if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) {\r
+                                               //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName);\r
+                                               if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName))\r
+                                                       this._mergeElements(scmd, elm.parentNode, elm, false);\r
+                                       }\r
+                               }\r
+\r
+                               // Remove empty wrappers\r
+                               var nodes = doc.getElementsByTagName(wrapper);\r
+                               for (i=nodes.length-1; i>=0; i--) {\r
+                                       var elm = nodes[i], isEmpty = true;\r
+\r
+                                       // Check if it has any attribs\r
+                                       var tmp = doc.createElement("body");\r
+                                       tmp.appendChild(elm.cloneNode(false));\r
+\r
+                                       // Is empty span, remove it\r
+                                       tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), '');\r
+                                       //tinyMCE.debug(tmp.innerHTML);\r
+                                       if (new RegExp('<span>', 'gi').test(tmp.innerHTML)) {\r
+                                               for (x=0; x<elm.childNodes.length; x++) {\r
+                                                       if (elm.parentNode != null)\r
+                                                               elm.parentNode.insertBefore(elm.childNodes[x].cloneNode(true), elm);\r
+                                               }\r
+\r
+                                               elm.parentNode.removeChild(elm);\r
+                                       }\r
+                               }\r
+\r
+                               // Re add the visual aids\r
+                               if (scmd == "removeformat")\r
+                                       tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               break;\r
+\r
+                       case "FontName":\r
+                               if (value == null) {\r
+                                       var s = this.getSel();\r
+\r
+                                       // Find font and select it\r
+                                       if (tinyMCE.isGecko && s.isCollapsed) {\r
+                                               var f = tinyMCE.getParentElement(this.getFocusElement(), "font");\r
+\r
+                                               if (f != null)\r
+                                                       this.selection.selectNode(f, false);\r
+                                       }\r
+\r
+                                       // Remove format\r
+                                       this.getDoc().execCommand("RemoveFormat", false, null);\r
+\r
+                                       // Collapse range if font was found\r
+                                       if (f != null && tinyMCE.isGecko) {\r
+                                               var r = this.getRng().cloneRange();\r
+                                               r.collapse(true);\r
+                                               s.removeAllRanges();\r
+                                               s.addRange(r);\r
+                                       }\r
+                               } else\r
+                                       this.getDoc().execCommand('FontName', false, value);\r
+\r
+                               if (tinyMCE.isGecko)\r
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+\r
+                               return;\r
+\r
+                       case "FontSize":\r
+                               this.getDoc().execCommand('FontSize', false, value);\r
+\r
+                               if (tinyMCE.isGecko)\r
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+\r
+                               return;\r
+\r
+                       case "forecolor":\r
+                               value = value == null ? this.foreColor : value;\r
+                               value = tinyMCE.trim(value);\r
+                               value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;\r
+\r
+                               this.foreColor = value;\r
+                               this.getDoc().execCommand('forecolor', false, value);\r
+                               break;\r
+\r
+                       case "HiliteColor":\r
+                               value = value == null ? this.backColor : value;\r
+                               value = tinyMCE.trim(value);\r
+                               value = value.charAt(0) != '#' ? (isNaN('0x' + value) ? value : '#' + value) : value;\r
+                               this.backColor = value;\r
+\r
+                               if (tinyMCE.isGecko) {\r
+                                       this._setUseCSS(true);\r
+                                       this.getDoc().execCommand('hilitecolor', false, value);\r
+                                       this._setUseCSS(false);\r
+                               } else\r
+                                       this.getDoc().execCommand('BackColor', false, value);\r
+                               break;\r
+\r
+                       case "Cut":\r
+                       case "Copy":\r
+                       case "Paste":\r
+                               var cmdFailed = false;\r
+\r
+                               // Try executing command\r
+                               eval('try {this.getDoc().execCommand(command, user_interface, value);} catch (e) {cmdFailed = true;}');\r
+\r
+                               if (tinyMCE.isOpera && cmdFailed)\r
+                                       alert('Currently not supported by your browser, use keyboard shortcuts instead.');\r
+\r
+                               // Alert error in gecko if command failed\r
+                               if (tinyMCE.isGecko && cmdFailed) {\r
+                                       // Confirm more info\r
+                                       if (confirm(tinyMCE.entityDecode(tinyMCE.getLang('lang_clipboard_msg'))))\r
+                                               window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal');\r
+\r
+                                       return;\r
+                               } else\r
+                                       tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+                       case "mceSetContent":\r
+                               if (!value)\r
+                                       value = "";\r
+\r
+                               // Call custom cleanup code\r
+                               value = tinyMCE.storeAwayURLs(value);\r
+                               value = tinyMCE._customCleanup(this, "insert_to_editor", value);\r
+\r
+                               if (this.getBody().nodeName == 'BODY')\r
+                                       tinyMCE._setHTML(doc, value);\r
+                               else\r
+                                       this.getBody().innerHTML = value;\r
+\r
+                               tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, doc, this.settings, this.getBody(), false, false, false, true));\r
+                               tinyMCE.convertAllRelativeURLs(this.getBody());\r
+\r
+                               // Cleanup any mess left from storyAwayURLs\r
+                               tinyMCE._removeInternal(this.getBody());\r
+\r
+                               // When editing always use fonts internaly\r
+                               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                                       tinyMCE.convertSpansToFonts(doc);\r
+\r
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+                               tinyMCE._setEventsEnabled(this.getBody(), false);\r
+                               this._addBogusBR();\r
+\r
+                               return true;\r
+\r
+                       case "mceCleanup":\r
+                               var b = this.selection.getBookmark();\r
+                               tinyMCE._setHTML(this.contentDocument, this.getBody().innerHTML);\r
+                               tinyMCE.setInnerHTML(this.getBody(), tinyMCE._cleanupHTML(this, this.contentDocument, this.settings, this.getBody(), this.visualAid));\r
+                               tinyMCE.convertAllRelativeURLs(doc.body);\r
+\r
+                               // When editing always use fonts internaly\r
+                               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                                       tinyMCE.convertSpansToFonts(doc);\r
+\r
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+                               tinyMCE._setEventsEnabled(this.getBody(), false);\r
+                               this._addBogusBR();\r
+                               this.repaint();\r
+                               this.selection.moveToBookmark(b);\r
+                               tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+                       case "mceReplaceContent":\r
+                               // Force empty string\r
+                               if (!value)\r
+                                       value = '';\r
+\r
+                               this.getWin().focus();\r
+\r
+                               var selectedText = "";\r
+\r
+                               if (tinyMCE.isIE) {\r
+                                       var rng = doc.selection.createRange();\r
+                                       selectedText = rng.text;\r
+                               } else\r
+                                       selectedText = this.getSel().toString();\r
+\r
+                               if (selectedText.length > 0) {\r
+                                       value = tinyMCE.replaceVar(value, "selection", selectedText);\r
+                                       tinyMCE.execCommand('mceInsertContent', false, value);\r
+                               }\r
+\r
+                               this._addBogusBR();\r
+                               tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+                       case "mceSetAttribute":\r
+                               if (typeof(value) == 'object') {\r
+                                       var targetElms = (typeof(value.targets) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value.targets;\r
+                                       var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms);\r
+\r
+                                       if (targetNode) {\r
+                                               targetNode.setAttribute(value.name, value.value);\r
+                                               tinyMCE.triggerNodeChange();\r
+                                       }\r
+                               }\r
+                       break;\r
+\r
+                       case "mceSetCSSClass":\r
+                               this.execCommand("mceSetStyleInfo", false, {command : "setattrib", name : "class", value : value});\r
+                       break;\r
+\r
+                       case "mceInsertRawHTML":\r
+                               var key = 'tiny_mce_marker';\r
+\r
+                               this.execCommand('mceBeginUndoLevel');\r
+\r
+                               // Insert marker key\r
+                               this.execCommand('mceInsertContent', false, key);\r
+\r
+                               // Store away scroll pos\r
+                               var scrollX = this.getBody().scrollLeft + this.getDoc().documentElement.scrollLeft;\r
+                               var scrollY = this.getBody().scrollTop + this.getDoc().documentElement.scrollTop;\r
+\r
+                               // Find marker and replace with RAW HTML\r
+                               var html = this.getBody().innerHTML;\r
+                               if ((pos = html.indexOf(key)) != -1)\r
+                                       tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length));\r
+\r
+                               // Restore scoll pos\r
+                               this.contentWindow.scrollTo(scrollX, scrollY);\r
+\r
+                               this.execCommand('mceEndUndoLevel');\r
+\r
+                               break;\r
+\r
+                       case "mceInsertContent":\r
+                               // Force empty string\r
+                               if (!value)\r
+                                       value = '';\r
+\r
+                               var insertHTMLFailed = false;\r
+\r
+                               // Removed since it produced problems in IE\r
+                               // this.getWin().focus();\r
+\r
+                               if (tinyMCE.isGecko || tinyMCE.isOpera) {\r
+                                       try {\r
+                                               // Is plain text or HTML, &amp;, &nbsp; etc will be encoded wrong in FF\r
+                                               if (value.indexOf('<') == -1 && !value.match(/(&#38;|&#160;|&#60;|&#62;)/g)) {\r
+                                                       var r = this.getRng();\r
+                                                       var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value));\r
+                                                       var s = this.getSel();\r
+                                                       var r2 = r.cloneRange();\r
+\r
+                                                       // Insert text at cursor position\r
+                                                       s.removeAllRanges();\r
+                                                       r.deleteContents();\r
+                                                       r.insertNode(n);\r
+\r
+                                                       // Move the cursor to the end of text\r
+                                                       r2.selectNode(n);\r
+                                                       r2.collapse(false);\r
+                                                       s.removeAllRanges();\r
+                                                       s.addRange(r2);\r
+                                               } else {\r
+                                                       value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value);\r
+                                                       this.getDoc().execCommand('inserthtml', false, value);\r
+                                                       tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);\r
+                                               }\r
+                                       } catch (ex) {\r
+                                               insertHTMLFailed = true;\r
+                                       }\r
+\r
+                                       if (!insertHTMLFailed) {\r
+                                               tinyMCE.triggerNodeChange();\r
+                                               return;\r
+                                       }\r
+                               }\r
+\r
+                               if (!tinyMCE.isIE) {\r
+                                       var isHTML = value.indexOf('<') != -1;\r
+                                       var sel = this.getSel();\r
+                                       var rng = this.getRng();\r
+\r
+                                       if (isHTML) {\r
+                                               if (tinyMCE.isSafari) {\r
+                                                       var tmpRng = this.getDoc().createRange();\r
+\r
+                                                       tmpRng.setStart(this.getBody(), 0);\r
+                                                       tmpRng.setEnd(this.getBody(), 0);\r
+\r
+                                                       value = tmpRng.createContextualFragment(value);\r
+                                               } else\r
+                                                       value = rng.createContextualFragment(value);\r
+                                       } else {\r
+                                               // Setup text node\r
+                                               value = doc.createTextNode(tinyMCE.entityDecode(value));\r
+                                       }\r
+\r
+                                       // Insert plain text in Safari\r
+                                       if (tinyMCE.isSafari && !isHTML) {\r
+                                               this.execCommand('InsertText', false, value.nodeValue);\r
+                                               tinyMCE.triggerNodeChange();\r
+                                               return true;\r
+                                       } else if (tinyMCE.isSafari && isHTML) {\r
+                                               rng.deleteContents();\r
+                                               rng.insertNode(value);\r
+                                               tinyMCE.triggerNodeChange();\r
+                                               return true;\r
+                                       }\r
+\r
+                                       rng.deleteContents();\r
+\r
+                                       // If target node is text do special treatment, (Mozilla 1.3 fix)\r
+                                       if (rng.startContainer.nodeType == 3) {\r
+                                               var node = rng.startContainer.splitText(rng.startOffset);\r
+                                               node.parentNode.insertBefore(value, node); \r
+                                       } else\r
+                                               rng.insertNode(value);\r
+\r
+                                       if (!isHTML) {\r
+                                               // Removes weird selection trails\r
+                                               sel.selectAllChildren(doc.body);\r
+                                               sel.removeAllRanges();\r
+\r
+                                               // Move cursor to end of content\r
+                                               var rng = doc.createRange();\r
+\r
+                                               rng.selectNode(value);\r
+                                               rng.collapse(false);\r
+\r
+                                               sel.addRange(rng);\r
+                                       } else\r
+                                               rng.collapse(false);\r
+\r
+                                       tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value);\r
+                               } else {\r
+                                       var rng = doc.selection.createRange(), tmpRng = null;\r
+                                       var c = value.indexOf('<!--') != -1;\r
+\r
+                                       // Fix comment bug, add tag before comments\r
+                                       if (c)\r
+                                               value = tinyMCE.uniqueTag + value;\r
+\r
+                                       //      tmpRng = rng.duplicate(); // Store away range (Fixes Undo bookmark bug in IE)\r
+\r
+                                       if (rng.item)\r
+                                               rng.item(0).outerHTML = value;\r
+                                       else\r
+                                               rng.pasteHTML(value);\r
+\r
+                                       //if (tmpRng)\r
+                                       //      tmpRng.select(); // Restore range  (Fixes Undo bookmark bug in IE)\r
+\r
+                                       // Remove unique tag\r
+                                       if (c) {\r
+                                               var e = this.getDoc().getElementById('mceTMPElement');\r
+                                               e.parentNode.removeChild(e);\r
+                                       }\r
+                               }\r
+\r
+                               tinyMCE.execCommand("mceAddUndoLevel");\r
+                               tinyMCE.triggerNodeChange();\r
+                       break;\r
+\r
+                       case "mceStartTyping":\r
+                               if (tinyMCE.settings.custom_undo_redo && this.undoRedo.typingUndoIndex == -1) {\r
+                                       this.undoRedo.typingUndoIndex = this.undoRedo.undoIndex;\r
+                                       tinyMCE.typingUndoIndex = tinyMCE.undoIndex;\r
+                                       this.execCommand('mceAddUndoLevel');\r
+                               }\r
+                               break;\r
+\r
+                       case "mceEndTyping":\r
+                               if (tinyMCE.settings.custom_undo_redo && this.undoRedo.typingUndoIndex != -1) {\r
+                                       this.execCommand('mceAddUndoLevel');\r
+                                       this.undoRedo.typingUndoIndex = -1;\r
+                               }\r
+\r
+                               tinyMCE.typingUndoIndex = -1;\r
+                               break;\r
+\r
+                       case "mceBeginUndoLevel":\r
+                               this.undoRedoLevel = false;\r
+                               break;\r
+\r
+                       case "mceEndUndoLevel":\r
+                               this.undoRedoLevel = true;\r
+                               this.execCommand('mceAddUndoLevel');\r
+                               break;\r
+\r
+                       case "mceAddUndoLevel":\r
+                               if (tinyMCE.settings.custom_undo_redo && this.undoRedoLevel) {\r
+                                       if (this.undoRedo.add())\r
+                                               tinyMCE.triggerNodeChange(false);\r
+                               }\r
+                               break;\r
+\r
+                       case "Undo":\r
+                               if (tinyMCE.settings.custom_undo_redo) {\r
+                                       tinyMCE.execCommand("mceEndTyping");\r
+                                       this.undoRedo.undo();\r
+                                       tinyMCE.triggerNodeChange();\r
+                               } else\r
+                                       this.getDoc().execCommand(command, user_interface, value);\r
+                               break;\r
+\r
+                       case "Redo":\r
+                               if (tinyMCE.settings.custom_undo_redo) {\r
+                                       tinyMCE.execCommand("mceEndTyping");\r
+                                       this.undoRedo.redo();\r
+                                       tinyMCE.triggerNodeChange();\r
+                               } else\r
+                                       this.getDoc().execCommand(command, user_interface, value);\r
+                               break;\r
+\r
+                       case "mceToggleVisualAid":\r
+                               this.visualAid = !this.visualAid;\r
+                               tinyMCE.handleVisualAid(this.getBody(), true, this.visualAid, this);\r
+                               tinyMCE.triggerNodeChange();\r
+                               break;\r
+\r
+                       case "Indent":\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+                               tinyMCE.triggerNodeChange();\r
+\r
+                               if (tinyMCE.isIE) {\r
+                                       var n = tinyMCE.getParentElement(this.getFocusElement(), "blockquote");\r
+                                       do {\r
+                                               if (n && n.nodeName == "BLOCKQUOTE") {\r
+                                                       n.removeAttribute("dir");\r
+                                                       n.removeAttribute("style");\r
+                                               }\r
+                                       } while (n != null && (n = n.parentNode) != null);\r
+                               }\r
+                               break;\r
+\r
+                       case "RemoveFormat":\r
+                       case "removeformat":\r
+                               var text = this.selection.getSelectedText();\r
+\r
+                               if (tinyMCE.isOpera) {\r
+                                       this.getDoc().execCommand("RemoveFormat", false, null);\r
+                                       return;\r
+                               }\r
+\r
+                               if (tinyMCE.isIE) {\r
+                                       try {\r
+                                               var rng = doc.selection.createRange();\r
+                                               rng.execCommand("RemoveFormat", false, null);\r
+                                       } catch (e) {\r
+                                               // Do nothing\r
+                                       }\r
+\r
+                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});\r
+                               } else {\r
+                                       this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                                       this.execCommand("mceSetStyleInfo", false, {command : "removeformat"});\r
+                               }\r
+\r
+                               // Remove class\r
+                               if (text.length == 0)\r
+                                       this.execCommand("mceSetCSSClass", false, "");\r
+\r
+                               tinyMCE.triggerNodeChange();\r
+                               break;\r
+\r
+                       default:\r
+                               this.getDoc().execCommand(command, user_interface, value);\r
+\r
+                               if (tinyMCE.isGecko)\r
+                                       window.setTimeout('tinyMCE.triggerNodeChange(false);', 1);\r
+                               else\r
+                                       tinyMCE.triggerNodeChange();\r
+               }\r
+\r
+               // Add undo level after modification\r
+               if (command != "mceAddUndoLevel" && command != "Undo" && command != "Redo" && command != "mceStartTyping" && command != "mceEndTyping")\r
+                       tinyMCE.execCommand("mceAddUndoLevel");\r
+       },\r
+\r
+       queryCommandValue : function(c) {\r
+               try {\r
+                       return this.getDoc().queryCommandValue(c);\r
+               } catch (e) {\r
+                       return null;\r
+               }\r
+       },\r
+\r
+       queryCommandState : function(c) {\r
+               return this.getDoc().queryCommandState(c);\r
+       },\r
+\r
+       _addBogusBR : function() {\r
+               var b = this.getBody();\r
+\r
+               if (tinyMCE.isGecko && !b.hasChildNodes())\r
+                       b.innerHTML = '<br _moz_editor_bogus_node="TRUE" />';\r
+       },\r
+\r
+       _onAdd : function(replace_element, form_element_name, target_document) {\r
+               var hc, th, tos, editorTemplate, targetDoc, deltaWidth, deltaHeight, html, rng, fragment;\r
+               var dynamicIFrame, tElm, doc, parentElm;\r
+\r
+               th = this.settings.theme;\r
+               tos = tinyMCE.themes[th];\r
+\r
+               targetDoc = target_document ? target_document : document;\r
+\r
+               this.targetDoc = targetDoc;\r
+\r
+               tinyMCE.themeURL = tinyMCE.baseURL + "/themes/" + this.settings.theme;\r
+               this.settings.themeurl = tinyMCE.themeURL;\r
+\r
+               if (!replace_element) {\r
+                       alert("Error: Could not find the target element.");\r
+                       return false;\r
+               }\r
+\r
+               if (tos.getEditorTemplate)\r
+                       editorTemplate = tos.getEditorTemplate(this.settings, this.editorId);\r
+\r
+               deltaWidth = editorTemplate.delta_width ? editorTemplate.delta_width : 0;\r
+               deltaHeight = editorTemplate.delta_height ? editorTemplate.delta_height : 0;\r
+               html = '<span id="' + this.editorId + '_parent" class="mceEditorContainer">' + editorTemplate.html;\r
+\r
+               html = tinyMCE.replaceVar(html, "editor_id", this.editorId);\r
+\r
+               if (!this.settings.default_document)\r
+                       this.settings.default_document = tinyMCE.baseURL + "/blank.htm";\r
+\r
+               this.settings.old_width = this.settings.width;\r
+               this.settings.old_height = this.settings.height;\r
+\r
+               // Set default width, height\r
+               if (this.settings.width == -1)\r
+                       this.settings.width = replace_element.offsetWidth;\r
+\r
+               if (this.settings.height == -1)\r
+                       this.settings.height = replace_element.offsetHeight;\r
+\r
+               // Try the style width\r
+               if (this.settings.width == 0)\r
+                       this.settings.width = replace_element.style.width;\r
+\r
+               // Try the style height\r
+               if (this.settings.height == 0)\r
+                       this.settings.height = replace_element.style.height; \r
+\r
+               // If no width/height then default to 320x240, better than nothing\r
+               if (this.settings.width == 0)\r
+                       this.settings.width = 320;\r
+\r
+               if (this.settings.height == 0)\r
+                       this.settings.height = 240;\r
+\r
+               this.settings.area_width = parseInt(this.settings.width);\r
+               this.settings.area_height = parseInt(this.settings.height);\r
+               this.settings.area_width += deltaWidth;\r
+               this.settings.area_height += deltaHeight;\r
+               this.settings.width_style = "" + this.settings.width;\r
+               this.settings.height_style = "" + this.settings.height;\r
+\r
+               // Special % handling\r
+               if (("" + this.settings.width).indexOf('%') != -1)\r
+                       this.settings.area_width = "100%";\r
+               else\r
+                       this.settings.width_style += 'px';\r
+\r
+               if (("" + this.settings.height).indexOf('%') != -1)\r
+                       this.settings.area_height = "100%";\r
+               else\r
+                       this.settings.height_style += 'px';\r
+\r
+               if (("" + replace_element.style.width).indexOf('%') != -1) {\r
+                       this.settings.width = replace_element.style.width;\r
+                       this.settings.area_width = "100%";\r
+                       this.settings.width_style = "100%";\r
+               }\r
+\r
+               if (("" + replace_element.style.height).indexOf('%') != -1) {\r
+                       this.settings.height = replace_element.style.height;\r
+                       this.settings.area_height = "100%";\r
+                       this.settings.height_style = "100%";\r
+               }\r
+\r
+               html = tinyMCE.applyTemplate(html);\r
+\r
+               this.settings.width = this.settings.old_width;\r
+               this.settings.height = this.settings.old_height;\r
+\r
+               this.visualAid = this.settings.visual;\r
+               this.formTargetElementId = form_element_name;\r
+\r
+               // Get replace_element contents\r
+               if (replace_element.nodeName == "TEXTAREA" || replace_element.nodeName == "INPUT")\r
+                       this.startContent = replace_element.value;\r
+               else\r
+                       this.startContent = replace_element.innerHTML;\r
+\r
+               // If not text area or input\r
+               if (replace_element.nodeName != "TEXTAREA" && replace_element.nodeName != "INPUT") {\r
+                       this.oldTargetElement = replace_element;\r
+\r
+                       // Debug mode\r
+                       hc = '<input type="hidden" id="' + form_element_name + '" name="' + form_element_name + '" />';\r
+                       this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');\r
+                       this.oldTargetElement.style.display = "none";\r
+\r
+                       html += '</span>';\r
+\r
+                       if (tinyMCE.isGecko)\r
+                               html = hc + html;\r
+                       else\r
+                               html += hc;\r
+\r
+                       // Output HTML and set editable\r
+                       if (tinyMCE.isGecko) {\r
+                               rng = replace_element.ownerDocument.createRange();\r
+                               rng.setStartBefore(replace_element);\r
+\r
+                               fragment = rng.createContextualFragment(html);\r
+                               tinyMCE.insertAfter(fragment, replace_element);\r
+                       } else\r
+                               replace_element.insertAdjacentHTML("beforeBegin", html);\r
+               } else {\r
+                       html += '</span>';\r
+\r
+                       // Just hide the textarea element\r
+                       this.oldTargetElement = replace_element;\r
+\r
+                       this.oldTargetDisplay = tinyMCE.getStyle(this.oldTargetElement, 'display', 'inline');\r
+                       this.oldTargetElement.style.display = "none";\r
+\r
+                       // Output HTML and set editable\r
+                       if (tinyMCE.isGecko) {\r
+                               rng = replace_element.ownerDocument.createRange();\r
+                               rng.setStartBefore(replace_element);\r
+\r
+                               fragment = rng.createContextualFragment(html);\r
+                               tinyMCE.insertAfter(fragment, replace_element);\r
+                       } else\r
+                               replace_element.insertAdjacentHTML("beforeBegin", html);\r
+               }\r
+\r
+               // Setup iframe\r
+               dynamicIFrame = false;\r
+               tElm = targetDoc.getElementById(this.editorId);\r
+\r
+               if (!tinyMCE.isIE) {\r
+                       // Node case is preserved in XML strict mode\r
+                       if (tElm && (tElm.nodeName == "SPAN" || tElm.nodeName == "span")) {\r
+                               tElm = tinyMCE._createIFrame(tElm, targetDoc);\r
+                               dynamicIFrame = true;\r
+                       }\r
+\r
+                       this.targetElement = tElm;\r
+                       this.iframeElement = tElm;\r
+                       this.contentDocument = tElm.contentDocument;\r
+                       this.contentWindow = tElm.contentWindow;\r
+\r
+                       //this.getDoc().designMode = "on";\r
+               } else {\r
+                       if (tElm && tElm.nodeName == "SPAN")\r
+                               tElm = tinyMCE._createIFrame(tElm, targetDoc, targetDoc.parentWindow);\r
+                       else\r
+                               tElm = targetDoc.frames[this.editorId];\r
+\r
+                       this.targetElement = tElm;\r
+                       this.iframeElement = targetDoc.getElementById(this.editorId);\r
+\r
+                       if (tinyMCE.isOpera) {\r
+                               this.contentDocument = this.iframeElement.contentDocument;\r
+                               this.contentWindow = this.iframeElement.contentWindow;\r
+                               dynamicIFrame = true;\r
+                       } else {\r
+                               this.contentDocument = tElm.window.document;\r
+                               this.contentWindow = tElm.window;\r
+                       }\r
+\r
+                       this.getDoc().designMode = "on";\r
+               }\r
+\r
+               // Setup base HTML\r
+               doc = this.contentDocument;\r
+               if (dynamicIFrame) {\r
+                       html = tinyMCE.getParam('doctype') + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + tinyMCE.settings.base_href + '" /><title>blank_page</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body class="mceContentBody"></body></html>';\r
+\r
+                       try {\r
+                               if (!this.isHidden())\r
+                                       this.getDoc().designMode = "on";\r
+\r
+                               doc.open();\r
+                               doc.write(html);\r
+                               doc.close();\r
+                       } catch (e) {\r
+                               // Failed Mozilla 1.3\r
+                               this.getDoc().location.href = tinyMCE.baseURL + "/blank.htm";\r
+                       }\r
+               }\r
+\r
+               // This timeout is needed in MSIE 5.5 for some odd reason\r
+               // it seems that the document.frames isn't initialized yet?\r
+               if (tinyMCE.isIE)\r
+                       window.setTimeout("tinyMCE.addEventHandlers(tinyMCE.instances[\"" + this.editorId + "\"]);", 1);\r
+\r
+               // Setup element references\r
+               parentElm = this.targetDoc.getElementById(this.editorId + '_parent');\r
+               this.formElement = tinyMCE.isGecko ? parentElm.previousSibling : parentElm.nextSibling;\r
+\r
+               tinyMCE.setupContent(this.editorId, true);\r
+\r
+               return true;\r
+       },\r
+\r
+       setBaseHREF : function(u) {\r
+               var h, b, d, nl;\r
+\r
+               d = this.getDoc();\r
+               nl = d.getElementsByTagName("base");\r
+               b = nl.length > 0 ? nl[0] : null;\r
+\r
+               if (!b) {\r
+                       nl = d.getElementsByTagName("head");\r
+                       h = nl.length > 0 ? nl[0] : null;\r
+\r
+                       b = d.createElement("base");\r
+                       b.setAttribute('href', u);\r
+                       h.appendChild(b);\r
+               } else {\r
+                       if (u == '' || u == null)\r
+                               b.parentNode.removeChild(b);\r
+                       else\r
+                               b.setAttribute('href', u);\r
+               }\r
+       },\r
+\r
+       getHTML : function(r) {\r
+               var h, d = this.getDoc(), b = this.getBody();\r
+\r
+               if (r)\r
+                       return b.innerHTML;\r
+\r
+               h = tinyMCE._cleanupHTML(this, d, this.settings, b, false, true, false, true);\r
+\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       tinyMCE.convertSpansToFonts(d);\r
+\r
+               return h;\r
+       },\r
+\r
+       setHTML : function(h) {\r
+               this.execCommand('mceSetContent', false, h);\r
+               this.repaint();\r
+       },\r
+\r
+       getFocusElement : function() {\r
+               return this.selection.getFocusElement();\r
+       },\r
+\r
+       getSel : function() {\r
+               return this.selection.getSel();\r
+       },\r
+\r
+       getRng : function() {\r
+               return this.selection.getRng();\r
+       },\r
+\r
+       triggerSave : function(skip_cleanup, skip_callback) {\r
+               var e, nl = [], i, s, content, htm;\r
+\r
+               if (!this.enabled)\r
+                       return;\r
+\r
+               this.switchSettings();\r
+               s = tinyMCE.settings;\r
+\r
+               // Force hidden tabs visible while serializing\r
+               if (tinyMCE.isRealIE) {\r
+                       e = this.iframeElement;\r
+\r
+                       do {\r
+                               if (e.style && e.style.display == 'none') {\r
+                                       e.style.display = 'block';\r
+                                       nl[nl.length] = {elm : e, type : 'style'};\r
+                               }\r
+\r
+                               if (e.style && s.hidden_tab_class.length > 0 && e.className.indexOf(s.hidden_tab_class) != -1) {\r
+                                       e.className = s.display_tab_class;\r
+                                       nl[nl.length] = {elm : e, type : 'class'};\r
+                               }\r
+                       } while ((e = e.parentNode) != null)\r
+               }\r
+\r
+               tinyMCE.settings.preformatted = false;\r
+\r
+               // Default to false\r
+               if (typeof(skip_cleanup) == "undefined")\r
+                       skip_cleanup = false;\r
+\r
+               // Default to false\r
+               if (typeof(skip_callback) == "undefined")\r
+                       skip_callback = false;\r
+\r
+               tinyMCE._setHTML(this.getDoc(), this.getBody().innerHTML);\r
+\r
+               // Remove visual aids when cleanup is disabled\r
+               if (this.settings.cleanup == false) {\r
+                       tinyMCE.handleVisualAid(this.getBody(), true, false, this);\r
+                       tinyMCE._setEventsEnabled(this.getBody(), true);\r
+               }\r
+\r
+               tinyMCE._customCleanup(this, "submit_content_dom", this.contentWindow.document.body);\r
+               htm = skip_cleanup ? this.getBody().innerHTML : tinyMCE._cleanupHTML(this, this.getDoc(), this.settings, this.getBody(), tinyMCE.visualAid, true, true);\r
+               htm = tinyMCE._customCleanup(this, "submit_content", htm);\r
+\r
+               if (!skip_callback && tinyMCE.settings.save_callback !== '')\r
+                       content = tinyMCE.resolveDots(tinyMCE.settings.save_callback, window)(this.formTargetElementId,htm,this.getBody());\r
+\r
+               // Use callback content if available\r
+               if ((typeof(content) != "undefined") && content != null)\r
+                       htm = content;\r
+\r
+               // Replace some weird entities (Bug: #1056343)\r
+               htm = tinyMCE.regexpReplace(htm, "&#40;", "(", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#41;", ")", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#59;", ";", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#34;", "&quot;", "gi");\r
+               htm = tinyMCE.regexpReplace(htm, "&#94;", "^", "gi");\r
+\r
+               if (this.formElement)\r
+                       this.formElement.value = htm;\r
+\r
+               if (tinyMCE.isSafari && this.formElement)\r
+                       this.formElement.innerText = htm;\r
+\r
+               // Hide them again (tabs in MSIE)\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (nl[i].type == 'style')\r
+                               nl[i].elm.style.display = 'none';\r
+                       else\r
+                               nl[i].elm.className = s.hidden_tab_class;\r
+               }\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Cleanup.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       cleanupHTMLCode : function(s) {\r
+               s = s.replace(new RegExp('<p \\/>', 'gi'), '<p>&nbsp;</p>');\r
+               s = s.replace(new RegExp('<p>\\s*<\\/p>', 'gi'), '<p>&nbsp;</p>');\r
+\r
+               // Fix close BR elements\r
+               s = s.replace(new RegExp('<br>\\s*<\\/br>', 'gi'), '<br />');\r
+\r
+               // Open closed tags like <b/> to <b></b>\r
+               s = s.replace(new RegExp('<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|font|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\\\|>]*)\\/>', 'gi'), '<$1$2$3></$1$2>');\r
+\r
+               // Remove trailing space <b > to <b>\r
+               s = s.replace(new RegExp('\\s+></', 'gi'), '></');\r
+\r
+               // Close tags <img></img> to <img/>\r
+               s = s.replace(new RegExp('<(img|br|hr)([^>]*)><\\/(img|br|hr)>', 'gi'), '<$1$2 />');\r
+\r
+               // Weird MSIE bug, <p><hr /></p> breaks runtime?\r
+               if (tinyMCE.isIE)\r
+                       s = s.replace(new RegExp('<p><hr \\/><\\/p>', 'gi'), "<hr>");\r
+\r
+               // Weird tags will make IE error #bug: 1538495\r
+               if (tinyMCE.isIE)\r
+                       s = s.replace(/<!(\s*)\/>/g, '');\r
+\r
+               // Convert relative anchors to absolute URLs ex: #something to file.htm#something\r
+               // Removed: Since local document anchors should never be forced absolute example edit.php?id=something\r
+               //if (tinyMCE.getParam('convert_urls'))\r
+               //      s = s.replace(new RegExp('(href=\"{0,1})(\\s*#)', 'gi'), '$1' + tinyMCE.settings.document_base_url + "#");\r
+\r
+               return s;\r
+       },\r
+\r
+       parseStyle : function(str) {\r
+               var ar = [], st, i, re, pa;\r
+\r
+               if (str == null)\r
+                       return ar;\r
+\r
+               st = str.split(';');\r
+\r
+               tinyMCE.clearArray(ar);\r
+\r
+               for (i=0; i<st.length; i++) {\r
+                       if (st[i] == '')\r
+                               continue;\r
+\r
+                       re = new RegExp('^\\s*([^:]*):\\s*(.*)\\s*$');\r
+                       pa = st[i].replace(re, '$1||$2').split('||');\r
+       //tinyMCE.debug(str, pa[0] + "=" + pa[1], st[i].replace(re, '$1||$2'));\r
+                       if (pa.length == 2)\r
+                               ar[pa[0].toLowerCase()] = pa[1];\r
+               }\r
+\r
+               return ar;\r
+       },\r
+\r
+       compressStyle : function(ar, pr, sf, res) {\r
+               var box = [], i, a;\r
+\r
+               box[0] = ar[pr + '-top' + sf];\r
+               box[1] = ar[pr + '-left' + sf];\r
+               box[2] = ar[pr + '-right' + sf];\r
+               box[3] = ar[pr + '-bottom' + sf];\r
+\r
+               for (i=0; i<box.length; i++) {\r
+                       if (box[i] == null)\r
+                               return;\r
+\r
+                       for (a=0; a<box.length; a++) {\r
+                               if (box[a] != box[i])\r
+                                       return;\r
+                       }\r
+               }\r
+\r
+               // They are all the same\r
+               ar[res] = box[0];\r
+               ar[pr + '-top' + sf] = null;\r
+               ar[pr + '-left' + sf] = null;\r
+               ar[pr + '-right' + sf] = null;\r
+               ar[pr + '-bottom' + sf] = null;\r
+       },\r
+\r
+       serializeStyle : function(ar) {\r
+               var str = "", key, val, m;\r
+\r
+               // Compress box\r
+               tinyMCE.compressStyle(ar, "border", "", "border");\r
+               tinyMCE.compressStyle(ar, "border", "-width", "border-width");\r
+               tinyMCE.compressStyle(ar, "border", "-color", "border-color");\r
+               tinyMCE.compressStyle(ar, "border", "-style", "border-style");\r
+               tinyMCE.compressStyle(ar, "padding", "", "padding");\r
+               tinyMCE.compressStyle(ar, "margin", "", "margin");\r
+\r
+               for (key in ar) {\r
+                       val = ar[key];\r
+\r
+                       if (typeof(val) == 'function')\r
+                               continue;\r
+\r
+                       if (key.indexOf('mso-') == 0)\r
+                               continue;\r
+\r
+                       if (val != null && val !== '') {\r
+                               val = '' + val; // Force string\r
+\r
+                               // Fix style URL\r
+                               val = val.replace(new RegExp("url\\(\\'?([^\\']*)\\'?\\)", 'gi'), "url('$1')");\r
+\r
+                               // Convert URL\r
+                               if (val.indexOf('url(') != -1 && tinyMCE.getParam('convert_urls')) {\r
+                                       m = new RegExp("url\\('(.*?)'\\)").exec(val);\r
+\r
+                                       if (m.length > 1)\r
+                                               val = "url('" + eval(tinyMCE.getParam('urlconverter_callback') + "(m[1], null, true);") + "')";\r
+                               }\r
+\r
+                               // Force HEX colors\r
+                               if (tinyMCE.getParam("force_hex_style_colors"))\r
+                                       val = tinyMCE.convertRGBToHex(val, true);\r
+\r
+                               val = val.replace(/\"/g, '\'');\r
+\r
+                               if (val != "url('')")\r
+                                       str += key.toLowerCase() + ": " + val + "; ";\r
+                       }\r
+               }\r
+\r
+               if (new RegExp('; $').test(str))\r
+                       str = str.substring(0, str.length - 2);\r
+\r
+               return str;\r
+       },\r
+\r
+       convertRGBToHex : function(s, k) {\r
+               var re, rgb;\r
+\r
+               if (s.toLowerCase().indexOf('rgb') != -1) {\r
+                       re = new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)", "gi");\r
+                       rgb = s.replace(re, "$1,$2,$3,$4,$5").split(',');\r
+\r
+                       if (rgb.length == 5) {\r
+                               r = parseInt(rgb[1]).toString(16);\r
+                               g = parseInt(rgb[2]).toString(16);\r
+                               b = parseInt(rgb[3]).toString(16);\r
+\r
+                               r = r.length == 1 ? '0' + r : r;\r
+                               g = g.length == 1 ? '0' + g : g;\r
+                               b = b.length == 1 ? '0' + b : b;\r
+\r
+                               s = "#" + r + g + b;\r
+\r
+                               if (k)\r
+                                       s = rgb[0] + s + rgb[4];\r
+                       }\r
+               }\r
+\r
+               return s;\r
+       },\r
+\r
+       convertHexToRGB : function(s) {\r
+               if (s.indexOf('#') != -1) {\r
+                       s = s.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
+                       return "rgb(" + parseInt(s.substring(0, 2), 16) + "," + parseInt(s.substring(2, 4), 16) + "," + parseInt(s.substring(4, 6), 16) + ")";\r
+               }\r
+\r
+               return s;\r
+       },\r
+\r
+       convertSpansToFonts : function(doc) {\r
+               var s, i, size, fSize, x, fFace, fColor, sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');\r
+\r
+               s = tinyMCE.selectElements(doc, 'span,font');\r
+               for (i=0; i<s.length; i++) {\r
+                       size = tinyMCE.trim(s[i].style.fontSize).toLowerCase();\r
+                       fSize = 0;\r
+\r
+                       for (x=0; x<sizes.length; x++) {\r
+                               if (sizes[x] == size) {\r
+                                       fSize = x + 1;\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if (fSize > 0) {\r
+                               tinyMCE.setAttrib(s[i], 'size', fSize);\r
+                               s[i].style.fontSize = '';\r
+                       }\r
+\r
+                       fFace = s[i].style.fontFamily;\r
+                       if (fFace != null && fFace !== '') {\r
+                               tinyMCE.setAttrib(s[i], 'face', fFace);\r
+                               s[i].style.fontFamily = '';\r
+                       }\r
+\r
+                       fColor = s[i].style.color;\r
+                       if (fColor != null && fColor !== '') {\r
+                               tinyMCE.setAttrib(s[i], 'color', tinyMCE.convertRGBToHex(fColor));\r
+                               s[i].style.color = '';\r
+                       }\r
+               }\r
+       },\r
+\r
+       convertFontsToSpans : function(doc) {\r
+               var fsClasses, s, i, fSize, fFace, fColor, sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(',');\r
+\r
+               fsClasses = tinyMCE.getParam('font_size_classes');\r
+               if (fsClasses !== '')\r
+                       fsClasses = fsClasses.replace(/\s+/, '').split(',');\r
+               else\r
+                       fsClasses = null;\r
+\r
+               s = tinyMCE.selectElements(doc, 'span,font');\r
+               for (i=0; i<s.length; i++) {\r
+                       fSize = tinyMCE.getAttrib(s[i], 'size');\r
+                       fFace = tinyMCE.getAttrib(s[i], 'face');\r
+                       fColor = tinyMCE.getAttrib(s[i], 'color');\r
+\r
+                       if (fSize !== '') {\r
+                               fSize = parseInt(fSize);\r
+\r
+                               if (fSize > 0 && fSize < 8) {\r
+                                       if (fsClasses != null)\r
+                                               tinyMCE.setAttrib(s[i], 'class', fsClasses[fSize-1]);\r
+                                       else\r
+                                               s[i].style.fontSize = sizes[fSize-1];\r
+                               }\r
+\r
+                               s[i].removeAttribute('size');\r
+                       }\r
+\r
+                       if (fFace !== '') {\r
+                               s[i].style.fontFamily = fFace;\r
+                               s[i].removeAttribute('face');\r
+                       }\r
+\r
+                       if (fColor !== '') {\r
+                               s[i].style.color = fColor;\r
+                               s[i].removeAttribute('color');\r
+                       }\r
+               }\r
+       },\r
+\r
+       cleanupAnchors : function(doc) {\r
+               var i, cn, x, an = doc.getElementsByTagName("a");\r
+\r
+               // Loops backwards due to bug #1467987\r
+               for (i=an.length-1; i>=0; i--) {\r
+                       if (tinyMCE.getAttrib(an[i], "name") !== '' && tinyMCE.getAttrib(an[i], "href") == '') {\r
+                               cn = an[i].childNodes;\r
+\r
+                               for (x=cn.length-1; x>=0; x--)\r
+                                       tinyMCE.insertAfter(cn[x], an[i]);\r
+                       }\r
+               }\r
+       },\r
+\r
+       getContent : function(editor_id) {\r
+               if (typeof(editor_id) != "undefined")\r
+                        tinyMCE.getInstanceById(editor_id).select();\r
+\r
+               if (tinyMCE.selectedInstance)\r
+                       return tinyMCE.selectedInstance.getHTML();\r
+\r
+               return null;\r
+       },\r
+\r
+       _fixListElements : function(d) {\r
+               var nl, x, a = ['ol', 'ul'], i, n, p, r = new RegExp('^(OL|UL)$'), np;\r
+\r
+               for (x=0; x<a.length; x++) {\r
+                       nl = d.getElementsByTagName(a[x]);\r
+\r
+                       for (i=0; i<nl.length; i++) {\r
+                               n = nl[i];\r
+                               p = n.parentNode;\r
+\r
+                               if (r.test(p.nodeName)) {\r
+                                       np = tinyMCE.prevNode(n, 'LI');\r
+\r
+                                       if (!np) {\r
+                                               np = d.createElement('li');\r
+                                               np.innerHTML = '&nbsp;';\r
+                                               np.appendChild(n);\r
+                                               p.insertBefore(np, p.firstChild);\r
+                                       } else\r
+                                               np.appendChild(n);\r
+                               }\r
+                       }\r
+               }\r
+       },\r
+\r
+       _fixTables : function(d) {\r
+               var nl, i, n, p, np, x, t;\r
+\r
+               nl = d.getElementsByTagName('table');\r
+               for (i=0; i<nl.length; i++) {\r
+                       n = nl[i];\r
+\r
+                       if ((p = tinyMCE.getParentElement(n, 'p,h1,h2,h3,h4,h5,h6')) != null) {\r
+                               np = p.cloneNode(false);\r
+                               np.removeAttribute('id');\r
+\r
+                               t = n;\r
+\r
+                               while ((n = n.nextSibling))\r
+                                       np.appendChild(n);\r
+\r
+                               tinyMCE.insertAfter(np, p);\r
+                               tinyMCE.insertAfter(t, p);\r
+                       }\r
+               }\r
+       },\r
+\r
+       _cleanupHTML : function(inst, doc, config, elm, visual, on_save, on_submit, inn) {\r
+               var h, d, t1, t2, t3, t4, t5, c, s, nb;\r
+\r
+               if (!tinyMCE.getParam('cleanup'))\r
+                       return elm.innerHTML;\r
+\r
+               on_save = typeof(on_save) == 'undefined' ? false : on_save;\r
+\r
+               c = inst.cleanup;\r
+               s = inst.settings;\r
+               d = c.settings.debug;\r
+\r
+               if (d)\r
+                       t1 = new Date().getTime();\r
+\r
+               inst._fixRootBlocks();\r
+\r
+               if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+                       tinyMCE.convertFontsToSpans(doc);\r
+\r
+               if (tinyMCE.getParam("fix_list_elements"))\r
+                       tinyMCE._fixListElements(doc);\r
+\r
+               if (tinyMCE.getParam("fix_table_elements"))\r
+                       tinyMCE._fixTables(doc);\r
+\r
+               // Call custom cleanup code\r
+               tinyMCE._customCleanup(inst, on_save ? "get_from_editor_dom" : "insert_to_editor_dom", doc.body);\r
+\r
+               if (d)\r
+                       t2 = new Date().getTime();\r
+\r
+               c.settings.on_save = on_save;\r
+\r
+               c.idCount = 0;\r
+               c.serializationId = new Date().getTime().toString(32); // Unique ID needed for the content duplication bug\r
+               c.serializedNodes = [];\r
+               c.sourceIndex = -1;\r
+\r
+               if (s.cleanup_serializer == "xml")\r
+                       h = c.serializeNodeAsXML(elm, inn);\r
+               else\r
+                       h = c.serializeNodeAsHTML(elm, inn);\r
+\r
+               if (d)\r
+                       t3 = new Date().getTime();\r
+\r
+               // Post processing\r
+               nb = tinyMCE.getParam('entity_encoding') == 'numeric' ? '&#160;' : '&nbsp;';\r
+               h = h.replace(/<\/?(body|head|html)[^>]*>/gi, '');\r
+               h = h.replace(new RegExp(' (rowspan="1"|colspan="1")', 'g'), '');\r
+               h = h.replace(/<p><hr \/><\/p>/g, '<hr />');\r
+               h = h.replace(/<p>(&nbsp;|&#160;)<\/p><hr \/><p>(&nbsp;|&#160;)<\/p>/g, '<hr />');\r
+               h = h.replace(/<td>\s*<br \/>\s*<\/td>/g, '<td>' + nb + '</td>');\r
+               h = h.replace(/<p>\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');\r
+               h = h.replace(/<br \/>$/, ''); // Remove last BR for Gecko\r
+               h = h.replace(/<br \/><\/p>/g, '</p>'); // Remove last BR in P tags for Gecko\r
+               h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*(&nbsp;|&#160;)\s*<\/p>/g, '<p>' + nb + '</p>');\r
+               h = h.replace(/<p>\s*(&nbsp;|&#160;)\s*<br \/>\s*<\/p>/g, '<p>' + nb + '</p>');\r
+               h = h.replace(/<p>\s*<br \/>\s*&nbsp;\s*<\/p>/g, '<p>' + nb + '</p>');\r
+               h = h.replace(new RegExp('<a>(.*?)<\\/a>', 'g'), '$1');\r
+               h = h.replace(/<p([^>]*)>\s*<\/p>/g, '<p$1>' + nb + '</p>');\r
+\r
+               // Clean body\r
+               if (/^\s*(<br \/>|<p>&nbsp;<\/p>|<p>&#160;<\/p>|<p><\/p>)\s*$/.test(h))\r
+                       h = '';\r
+\r
+               // If preformatted\r
+               if (s.preformatted) {\r
+                       h = h.replace(/^<pre>/, '');\r
+                       h = h.replace(/<\/pre>$/, '');\r
+                       h = '<pre>' + h + '</pre>';\r
+               }\r
+\r
+               // Gecko specific processing\r
+               if (tinyMCE.isGecko) {\r
+                       // Makes no sence but FF generates it!!\r
+                       h = h.replace(/<br \/>\s*<\/li>/g, '</li>');\r
+                       h = h.replace(/&nbsp;\s*<\/(dd|dt)>/g, '</$1>');\r
+                       h = h.replace(/<o:p _moz-userdefined="" \/>/g, '');\r
+                       h = h.replace(/<td([^>]*)>\s*<br \/>\s*<\/td>/g, '<td$1>' + nb + '</td>');\r
+               }\r
+\r
+               if (s.force_br_newlines)\r
+                       h = h.replace(/<p>(&nbsp;|&#160;)<\/p>/g, '<br />');\r
+\r
+               // Call custom cleanup code\r
+               h = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", h);\r
+\r
+               // Remove internal classes\r
+               if (on_save) {\r
+                       h = h.replace(new RegExp(' ?(mceItem[a-zA-Z0-9]*|' + s.visual_table_class + ')', 'g'), '');\r
+                       h = h.replace(new RegExp(' ?class=""', 'g'), '');\r
+               }\r
+\r
+               if (s.remove_linebreaks && !c.settings.indent)\r
+                       h = h.replace(/\n|\r/g, ' ');\r
+\r
+               if (d)\r
+                       t4 = new Date().getTime();\r
+\r
+               if (on_save && c.settings.indent)\r
+                       h = c.formatHTML(h);\r
+\r
+               // If encoding (not recommended option)\r
+               if (on_submit && (s.encoding == "xml" || s.encoding == "html"))\r
+                       h = c.xmlEncode(h);\r
+\r
+               if (d)\r
+                       t5 = new Date().getTime();\r
+\r
+               if (c.settings.debug)\r
+                       tinyMCE.debug("Cleanup in ms: Pre=" + (t2-t1) + ", Serialize: " + (t3-t2) + ", Post: " + (t4-t3) + ", Format: " + (t5-t4) + ", Sum: " + (t5-t1) + ".");\r
+\r
+               return h;\r
+       }\r
+});\r
+\r
+function TinyMCE_Cleanup() {\r
+       this.isIE = (navigator.appName == "Microsoft Internet Explorer");\r
+       this.rules = tinyMCE.clearArray([]);\r
+\r
+       // Default config\r
+       this.settings = {\r
+               indent_elements : 'head,table,tbody,thead,tfoot,form,tr,ul,ol,blockquote,object',\r
+               newline_before_elements : 'h1,h2,h3,h4,h5,h6,pre,address,div,ul,ol,li,meta,option,area,title,link,base,script,td',\r
+               newline_after_elements : 'br,hr,p,pre,address,div,ul,ol,meta,option,area,link,base,script',\r
+               newline_before_after_elements : 'html,head,body,table,thead,tbody,tfoot,tr,form,ul,ol,blockquote,p,object,param,hr,div',\r
+               indent_char : '\t',\r
+               indent_levels : 1,\r
+               entity_encoding : 'raw',\r
+               valid_elements : '*[*]',\r
+               entities : '',\r
+               url_converter : '',\r
+               invalid_elements : '',\r
+               verify_html : false\r
+       };\r
+\r
+       this.vElements = tinyMCE.clearArray([]);\r
+       this.vElementsRe = '';\r
+       this.closeElementsRe = /^(IMG|BR|HR|LINK|META|BASE|INPUT|AREA)$/;\r
+       this.codeElementsRe = /^(SCRIPT|STYLE)$/;\r
+       this.serializationId = 0;\r
+       this.mceAttribs = {\r
+               href : 'mce_href',\r
+               src : 'mce_src',\r
+               type : 'mce_type'\r
+       };\r
+}\r
+\r
+TinyMCE_Cleanup.prototype = {\r
+       init : function(s) {\r
+               var n, a, i, ir, or, st;\r
+\r
+               for (n in s)\r
+                       this.settings[n] = s[n];\r
+\r
+               // Setup code formating\r
+               s = this.settings;\r
+\r
+               // Setup regexps\r
+               this.inRe = this._arrayToRe(s.indent_elements.split(','), '', '^<(', ')[^>]*');\r
+               this.ouRe = this._arrayToRe(s.indent_elements.split(','), '', '^<\\/(', ')[^>]*');\r
+               this.nlBeforeRe = this._arrayToRe(s.newline_before_elements.split(','), 'gi', '<(',  ')([^>]*)>');\r
+               this.nlAfterRe = this._arrayToRe(s.newline_after_elements.split(','), 'gi', '<(',  ')([^>]*)>');\r
+               this.nlBeforeAfterRe = this._arrayToRe(s.newline_before_after_elements.split(','), 'gi', '<(\\/?)(', ')([^>]*)>');\r
+               this.serializedNodes = [];\r
+\r
+               if (s.invalid_elements !== '')\r
+                       this.iveRe = this._arrayToRe(s.invalid_elements.toUpperCase().split(','), 'g', '^(', ')$');\r
+               else\r
+                       this.iveRe = null;\r
+\r
+               // Setup separator\r
+               st = '';\r
+               for (i=0; i<s.indent_levels; i++)\r
+                       st += s.indent_char;\r
+\r
+               this.inStr = st;\r
+\r
+               // If verify_html if false force *[*]\r
+               if (!s.verify_html) {\r
+                       s.valid_elements = '*[*]';\r
+                       s.extended_valid_elements = '';\r
+               }\r
+\r
+               this.fillStr = s.entity_encoding == "named" ? "&nbsp;" : "&#160;";\r
+               this.idCount = 0;\r
+               this.xmlEncodeRe = new RegExp('[\u007F-\uFFFF<>&"]', 'g');\r
+       },\r
+\r
+       addRuleStr : function(s) {\r
+               var r = this.parseRuleStr(s), n;\r
+\r
+               for (n in r) {\r
+                       if (r[n])\r
+                               this.rules[n] = r[n];\r
+               }\r
+\r
+               this.vElements = tinyMCE.clearArray([]);\r
+\r
+               for (n in this.rules) {\r
+                       if (this.rules[n])\r
+                               this.vElements[this.vElements.length] = this.rules[n].tag;\r
+               }\r
+\r
+               this.vElementsRe = this._arrayToRe(this.vElements, '');\r
+       },\r
+\r
+       isValid : function(n) {\r
+               if (!this.rulesDone)\r
+                       this._setupRules(); // Will initialize cleanup rules\r
+\r
+               // Empty is true since it removes formatting\r
+               if (!n)\r
+                       return true;\r
+\r
+               // Clean the name up a bit\r
+               n = n.replace(/[^a-z0-9]+/gi, '').toUpperCase();\r
+\r
+               return !tinyMCE.getParam('cleanup') || this.vElementsRe.test(n);\r
+       },\r
+\r
+       addChildRemoveRuleStr : function(s) {\r
+               var x, y, p, i, t, tn, ta, cl, r;\r
+\r
+               if (!s)\r
+                       return;\r
+\r
+               ta = s.split(',');\r
+               for (x=0; x<ta.length; x++) {\r
+                       s = ta[x];\r
+\r
+                       // Split tag/children\r
+                       p = this.split(/\[|\]/, s);\r
+                       if (p == null || p.length < 1)\r
+                               t = s.toUpperCase();\r
+                       else\r
+                               t = p[0].toUpperCase();\r
+\r
+                       // Handle all tag names\r
+                       tn = this.split('/', t);\r
+                       for (y=0; y<tn.length; y++) {\r
+                               r = "^(";\r
+\r
+                               // Build regex\r
+                               cl = this.split(/\|/, p[1]);\r
+                               for (i=0; i<cl.length; i++) {\r
+                                       if (cl[i] == '%istrict')\r
+                                               r += tinyMCE.inlineStrict;\r
+                                       else if (cl[i] == '%itrans')\r
+                                               r += tinyMCE.inlineTransitional;\r
+                                       else if (cl[i] == '%istrict_na')\r
+                                               r += tinyMCE.inlineStrict.substring(2);\r
+                                       else if (cl[i] == '%itrans_na')\r
+                                               r += tinyMCE.inlineTransitional.substring(2);\r
+                                       else if (cl[i] == '%btrans')\r
+                                               r += tinyMCE.blockElms;\r
+                                       else if (cl[i] == '%strict')\r
+                                               r += tinyMCE.blockStrict;\r
+                                       else\r
+                                               r += (cl[i].charAt(0) != '#' ? cl[i].toUpperCase() : cl[i]);\r
+\r
+                                       r += (i != cl.length - 1 ? '|' : '');\r
+                               }\r
+\r
+                               r += ')$';\r
+\r
+                               if (this.childRules == null)\r
+                                       this.childRules = tinyMCE.clearArray([]);\r
+\r
+                               this.childRules[tn[y]] = new RegExp(r);\r
+\r
+                               if (p.length > 1)\r
+                                       this.childRules[tn[y]].wrapTag = p[2];\r
+                       }\r
+               }\r
+       },\r
+\r
+       parseRuleStr : function(s) {\r
+               var ta, p, r, a, i, x, px, t, tn, y, av, or = tinyMCE.clearArray([]), dv;\r
+\r
+               if (s == null || s.length == 0)\r
+                       return or;\r
+\r
+               ta = s.split(',');\r
+               for (x=0; x<ta.length; x++) {\r
+                       s = ta[x];\r
+                       if (s.length == 0)\r
+                               continue;\r
+\r
+                       // Split tag/attrs\r
+                       p = this.split(/\[|\]/, s);\r
+                       if (p == null || p.length < 1)\r
+                               t = s.toUpperCase();\r
+                       else\r
+                               t = p[0].toUpperCase();\r
+\r
+                       // Handle all tag names\r
+                       tn = this.split('/', t);\r
+                       for (y=0; y<tn.length; y++) {\r
+                               r = {};\r
+\r
+                               r.tag = tn[y];\r
+                               r.forceAttribs = null;\r
+                               r.defaultAttribs = null;\r
+                               r.validAttribValues = null;\r
+\r
+                               // Handle prefixes\r
+                               px = r.tag.charAt(0);\r
+                               r.forceOpen = px == '+';\r
+                               r.removeEmpty = px == '-';\r
+                               r.fill = px == '#';\r
+                               r.tag = r.tag.replace(/\+|-|#/g, '');\r
+                               r.oTagName = tn[0].replace(/\+|-|#/g, '').toLowerCase();\r
+                               r.isWild = new RegExp('\\*|\\?|\\+', 'g').test(r.tag);\r
+                               r.validRe = new RegExp(this._wildcardToRe('^' + r.tag + '$'));\r
+\r
+                               // Setup valid attributes\r
+                               if (p.length > 1) {\r
+                                       r.vAttribsRe = '^(';\r
+                                       a = this.split(/\|/, p[1]);\r
+\r
+                                       for (i=0; i<a.length; i++) {\r
+                                               t = a[i];\r
+\r
+                                               if (t.charAt(0) == '!') {\r
+                                                       a[i] = t = t.substring(1);\r
+\r
+                                                       if (!r.reqAttribsRe)\r
+                                                               r.reqAttribsRe = '\\s+(' + t;\r
+                                                       else\r
+                                                               r.reqAttribsRe += '|' + t;\r
+                                               }\r
+\r
+                                               av = new RegExp('(=|:|<)(.*?)$').exec(t);\r
+                                               t = t.replace(new RegExp('(=|:|<).*?$'), '');\r
+                                               if (av && av.length > 0) {\r
+                                                       if (av[0].charAt(0) == ':') {\r
+                                                               if (!r.forceAttribs)\r
+                                                                       r.forceAttribs = tinyMCE.clearArray([]);\r
+\r
+                                                               r.forceAttribs[t.toLowerCase()] = av[0].substring(1);\r
+                                                       } else if (av[0].charAt(0) == '=') {\r
+                                                               if (!r.defaultAttribs)\r
+                                                                       r.defaultAttribs = tinyMCE.clearArray([]);\r
+\r
+                                                               dv = av[0].substring(1);\r
+\r
+                                                               r.defaultAttribs[t.toLowerCase()] = dv == '' ? "mce_empty" : dv;\r
+                                                       } else if (av[0].charAt(0) == '<') {\r
+                                                               if (!r.validAttribValues)\r
+                                                                       r.validAttribValues = tinyMCE.clearArray([]);\r
+\r
+                                                               r.validAttribValues[t.toLowerCase()] = this._arrayToRe(this.split('?', av[0].substring(1)), 'i');\r
+                                                       }\r
+                                               }\r
+\r
+                                               r.vAttribsRe += '' + t.toLowerCase() + (i != a.length - 1 ? '|' : '');\r
+\r
+                                               a[i] = t.toLowerCase();\r
+                                       }\r
+\r
+                                       if (r.reqAttribsRe)\r
+                                               r.reqAttribsRe = new RegExp(r.reqAttribsRe + ')=\"', 'g');\r
+\r
+                                       r.vAttribsRe += ')$';\r
+                                       r.vAttribsRe = this._wildcardToRe(r.vAttribsRe);\r
+                                       r.vAttribsReIsWild = new RegExp('\\*|\\?|\\+', 'g').test(r.vAttribsRe);\r
+                                       r.vAttribsRe = new RegExp(r.vAttribsRe);\r
+                                       r.vAttribs = a.reverse();\r
+\r
+                                       //tinyMCE.debug(r.tag, r.oTagName, r.vAttribsRe, r.vAttribsReWC);\r
+                               } else {\r
+                                       r.vAttribsRe = '';\r
+                                       r.vAttribs = tinyMCE.clearArray([]);\r
+                                       r.vAttribsReIsWild = false;\r
+                               }\r
+\r
+                               or[r.tag] = r;\r
+                       }\r
+               }\r
+\r
+               return or;\r
+       },\r
+\r
+       serializeNodeAsXML : function(n) {\r
+               var s, b;\r
+\r
+               if (!this.xmlDoc) {\r
+                       if (this.isIE) {\r
+                               try {this.xmlDoc = new ActiveXObject('MSXML2.DOMDocument');} catch (e) {}\r
+\r
+                               if (!this.xmlDoc)\r
+                                       try {this.xmlDoc = new ActiveXObject('Microsoft.XmlDom');} catch (e) {}\r
+                       } else\r
+                               this.xmlDoc = document.implementation.createDocument('', '', null);\r
+\r
+                       if (!this.xmlDoc)\r
+                               alert("Error XML Parser could not be found.");\r
+               }\r
+\r
+               if (this.xmlDoc.firstChild)\r
+                       this.xmlDoc.removeChild(this.xmlDoc.firstChild);\r
+\r
+               b = this.xmlDoc.createElement("html");\r
+               b = this.xmlDoc.appendChild(b);\r
+\r
+               this._convertToXML(n, b);\r
+\r
+               if (this.isIE)\r
+                       return this.xmlDoc.xml;\r
+               else\r
+                       return new XMLSerializer().serializeToString(this.xmlDoc);\r
+       },\r
+\r
+       _convertToXML : function(n, xn) {\r
+               var xd, el, i, l, cn, at, no, hc = false;\r
+\r
+               if (tinyMCE.isRealIE && this._isDuplicate(n))\r
+                       return;\r
+\r
+               xd = this.xmlDoc;\r
+\r
+               switch (n.nodeType) {\r
+                       case 1: // Element\r
+                               hc = n.hasChildNodes();\r
+\r
+                               el = xd.createElement(n.nodeName.toLowerCase());\r
+\r
+                               at = n.attributes;\r
+                               for (i=at.length-1; i>-1; i--) {\r
+                                       no = at[i];\r
+\r
+                                       if (no.specified && no.nodeValue)\r
+                                               el.setAttribute(no.nodeName.toLowerCase(), no.nodeValue);\r
+                               }\r
+\r
+                               if (!hc && !this.closeElementsRe.test(n.nodeName))\r
+                                       el.appendChild(xd.createTextNode(""));\r
+\r
+                               xn = xn.appendChild(el);\r
+                               break;\r
+\r
+                       case 3: // Text\r
+                               xn.appendChild(xd.createTextNode(n.nodeValue));\r
+                               return;\r
+\r
+                       case 8: // Comment\r
+                               xn.appendChild(xd.createComment(n.nodeValue));\r
+                               return;\r
+               }\r
+\r
+               if (hc) {\r
+                       cn = n.childNodes;\r
+\r
+                       for (i=0, l=cn.length; i<l; i++)\r
+                               this._convertToXML(cn[i], xn);\r
+               }\r
+       },\r
+\r
+       serializeNodeAsHTML : function(n, inn) {\r
+               var en, no, h = '', i, l, t, st, r, cn, va = false, f = false, at, hc, cr, nn;\r
+\r
+               if (!this.rulesDone)\r
+                       this._setupRules(); // Will initialize cleanup rules\r
+\r
+               if (tinyMCE.isRealIE && this._isDuplicate(n))\r
+                       return '';\r
+\r
+               // Skip non valid child elements\r
+               if (n.parentNode && this.childRules != null) {\r
+                       cr = this.childRules[n.parentNode.nodeName];\r
+\r
+                       if (typeof(cr) != "undefined" && !cr.test(n.nodeName)) {\r
+                               st = true;\r
+                               t = null;\r
+                       }\r
+               }\r
+\r
+               switch (n.nodeType) {\r
+                       case 1: // Element\r
+                               hc = n.hasChildNodes();\r
+\r
+                               if (st)\r
+                                       break;\r
+\r
+                               nn = n.nodeName;\r
+\r
+                               if (tinyMCE.isRealIE) {\r
+                                       // MSIE sometimes produces <//tag>\r
+                                       if (n.nodeName.indexOf('/') != -1)\r
+                                               break;\r
+\r
+                                       // MSIE has it's NS in a separate attrib\r
+                                       if (n.scopeName && n.scopeName != 'HTML')\r
+                                               nn = n.scopeName.toUpperCase() + ':' + nn.toUpperCase();\r
+                               } else if (tinyMCE.isOpera && nn.indexOf(':') > 0)\r
+                                       nn = nn.toUpperCase();\r
+\r
+                               // Convert fonts to spans\r
+                               if (this.settings.convert_fonts_to_spans) {\r
+                                       // On get content FONT -> SPAN\r
+                                       if (this.settings.on_save && nn == 'FONT')\r
+                                               nn = 'SPAN';\r
+\r
+                                       // On insert content SPAN -> FONT\r
+                                       if (!this.settings.on_save && nn == 'SPAN')\r
+                                               nn = 'FONT';\r
+                               }\r
+\r
+                               if (this.vElementsRe.test(nn) && (!this.iveRe || !this.iveRe.test(nn)) && !inn) {\r
+                                       va = true;\r
+\r
+                                       r = this.rules[nn];\r
+                                       if (!r) {\r
+                                               at = this.rules;\r
+                                               for (no in at) {\r
+                                                       if (at[no] && at[no].validRe.test(nn)) {\r
+                                                               r = at[no];\r
+                                                               break;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+\r
+                                       en = r.isWild ? nn.toLowerCase() : r.oTagName;\r
+                                       f = r.fill;\r
+\r
+                                       if (r.removeEmpty && !hc)\r
+                                               return "";\r
+\r
+                                       t = '<' + en;\r
+\r
+                                       if (r.vAttribsReIsWild) {\r
+                                               // Serialize wildcard attributes\r
+                                               at = n.attributes;\r
+                                               for (i=at.length-1; i>-1; i--) {\r
+                                                       no = at[i];\r
+                                                       if (no.specified && r.vAttribsRe.test(no.nodeName))\r
+                                                               t += this._serializeAttribute(n, r, no.nodeName);\r
+                                               }\r
+                                       } else {\r
+                                               // Serialize specific attributes\r
+                                               for (i=r.vAttribs.length-1; i>-1; i--)\r
+                                                       t += this._serializeAttribute(n, r, r.vAttribs[i]);\r
+                                       }\r
+\r
+                                       // Serialize mce_ atts\r
+                                       if (!this.settings.on_save) {\r
+                                               at = this.mceAttribs;\r
+\r
+                                               for (no in at) {\r
+                                                       if (at[no])\r
+                                                               t += this._serializeAttribute(n, r, at[no]);\r
+                                               }\r
+                                       }\r
+\r
+                                       // Check for required attribs\r
+                                       if (r.reqAttribsRe && !t.match(r.reqAttribsRe))\r
+                                               t = null;\r
+\r
+                                       // Close these\r
+                                       if (t != null && this.closeElementsRe.test(nn))\r
+                                               return t + ' />';\r
+\r
+                                       if (t != null)\r
+                                               h += t + '>';\r
+\r
+                                       if (this.isIE && this.codeElementsRe.test(nn))\r
+                                               h += n.innerHTML;\r
+                               }\r
+                       break;\r
+\r
+                       case 3: // Text\r
+                               if (st)\r
+                                       break;\r
+\r
+                               if (n.parentNode && this.codeElementsRe.test(n.parentNode.nodeName))\r
+                                       return this.isIE ? '' : n.nodeValue;\r
+\r
+                               return this.xmlEncode(n.nodeValue);\r
+\r
+                       case 8: // Comment\r
+                               if (st)\r
+                                       break;\r
+\r
+                               return "<!--" + this._trimComment(n.nodeValue) + "-->";\r
+               }\r
+\r
+               if (hc) {\r
+                       cn = n.childNodes;\r
+\r
+                       for (i=0, l=cn.length; i<l; i++)\r
+                               h += this.serializeNodeAsHTML(cn[i]);\r
+               }\r
+\r
+               // Fill empty nodes\r
+               if (f && !hc)\r
+                       h += this.fillStr;\r
+\r
+               // End element\r
+               if (t != null && va)\r
+                       h += '</' + en + '>';\r
+\r
+               return h;\r
+       },\r
+\r
+       _serializeAttribute : function(n, r, an) {\r
+               var av = '', t, os = this.settings.on_save;\r
+\r
+               if (os && (an.indexOf('mce_') == 0 || an.indexOf('_moz') == 0))\r
+                       return '';\r
+\r
+               if (os && this.mceAttribs[an])\r
+                       av = this._getAttrib(n, this.mceAttribs[an]);\r
+\r
+               if (av.length == 0)\r
+                       av = this._getAttrib(n, an);\r
+\r
+               if (av.length == 0 && r.defaultAttribs && (t = r.defaultAttribs[an])) {\r
+                       av = t;\r
+\r
+                       if (av == "mce_empty")\r
+                               return " " + an + '=""';\r
+               }\r
+\r
+               if (r.forceAttribs && (t = r.forceAttribs[an]))\r
+                       av = t;\r
+\r
+               if (os && av.length != 0 && /^(src|href|longdesc)$/.test(an))\r
+                       av = this._urlConverter(this, n, av);\r
+\r
+               if (av.length != 0 && r.validAttribValues && r.validAttribValues[an] && !r.validAttribValues[an].test(av))\r
+                       return "";\r
+\r
+               if (av.length != 0 && av == "{$uid}")\r
+                       av = "uid_" + (this.idCount++);\r
+\r
+               if (av.length != 0) {\r
+                       if (an.indexOf('on') != 0)\r
+                               av = this.xmlEncode(av, 1);\r
+\r
+                       return " " + an + "=" + '"' + av + '"';\r
+               }\r
+\r
+               return "";\r
+       },\r
+\r
+       formatHTML : function(h) {\r
+               var s = this.settings, p = '', i = 0, li = 0, o = '', l;\r
+\r
+               // Replace BR in pre elements to \n\r
+               h = h.replace(/<pre([^>]*)>(.*?)<\/pre>/gi, function (a, b, c) {\r
+                       c = c.replace(/<br\s*\/>/gi, '\n');\r
+                       return '<pre' + b + '>' + c + '</pre>';\r
+               });\r
+\r
+               h = h.replace(/\r/g, ''); // Windows sux, isn't carriage return a thing of the past :)\r
+               h = '\n' + h;\r
+               h = h.replace(new RegExp('\\n\\s+', 'gi'), '\n'); // Remove previous formatting\r
+               h = h.replace(this.nlBeforeRe, '\n<$1$2>');\r
+               h = h.replace(this.nlAfterRe, '<$1$2>\n');\r
+               h = h.replace(this.nlBeforeAfterRe, '\n<$1$2$3>\n');\r
+               h += '\n';\r
+\r
+               //tinyMCE.debug(h);\r
+\r
+               while ((i = h.indexOf('\n', i + 1)) != -1) {\r
+                       if ((l = h.substring(li + 1, i)).length != 0) {\r
+                               if (this.ouRe.test(l) && p.length >= s.indent_levels)\r
+                                       p = p.substring(s.indent_levels);\r
+\r
+                               o += p + l + '\n';\r
+       \r
+                               if (this.inRe.test(l))\r
+                                       p += this.inStr;\r
+                       }\r
+\r
+                       li = i;\r
+               }\r
+\r
+               //tinyMCE.debug(h);\r
+\r
+               return o;\r
+       },\r
+\r
+       xmlEncode : function(s) {\r
+               var cl = this, re = this.xmlEncodeRe;\r
+\r
+               if (!this.entitiesDone)\r
+                       this._setupEntities(); // Will intialize lookup table\r
+\r
+               switch (this.settings.entity_encoding) {\r
+                       case "raw":\r
+                               return tinyMCE.xmlEncode(s);\r
+\r
+                       case "named":\r
+                               return s.replace(re, function (c) {\r
+                                       var b = cl.entities[c.charCodeAt(0)];\r
+\r
+                                       return b ? '&' + b + ';' : c;\r
+                               });\r
+\r
+                       case "numeric":\r
+                               return s.replace(re, function (c) {\r
+                                       return '&#' + c.charCodeAt(0) + ';';\r
+                               });\r
+               }\r
+\r
+               return s;\r
+       },\r
+\r
+       split : function(re, s) {\r
+               var i, l, o = [], c = s.split(re);\r
+\r
+               for (i=0, l=c.length; i<l; i++) {\r
+                       if (c[i] !== '')\r
+                               o[i] = c[i];\r
+               }\r
+\r
+               return o;\r
+       },\r
+\r
+       _trimComment : function(s) {\r
+               // Remove mce_src, mce_href\r
+               s = s.replace(new RegExp('\\smce_src=\"[^\"]*\"', 'gi'), "");\r
+               s = s.replace(new RegExp('\\smce_href=\"[^\"]*\"', 'gi'), "");\r
+\r
+               return s;\r
+       },\r
+\r
+       _getAttrib : function(e, n, d) {\r
+               var v, ex, nn;\r
+\r
+               if (typeof(d) == "undefined")\r
+                       d = "";\r
+\r
+               if (!e || e.nodeType != 1)\r
+                       return d;\r
+\r
+               try {\r
+                       v = e.getAttribute(n, 0);\r
+               } catch (ex) {\r
+                       // IE 7 may cast exception on invalid attributes\r
+                       v = e.getAttribute(n, 2);\r
+               }\r
+\r
+               if (n == "class" && !v)\r
+                       v = e.className;\r
+\r
+               if (this.isIE) {\r
+                       if (n == "http-equiv")\r
+                               v = e.httpEquiv;\r
+\r
+                       nn = e.nodeName;\r
+\r
+                       // Skip the default values that IE returns\r
+                       if (nn == "FORM" && n == "enctype" && v == "application/x-www-form-urlencoded")\r
+                               v = "";\r
+\r
+                       if (nn == "INPUT" && n == "size" && v == "20")\r
+                               v = "";\r
+\r
+                       if (nn == "INPUT" && n == "maxlength" && v == "2147483647")\r
+                               v = "";\r
+\r
+                       // Images\r
+                       if (n == "width" || n == "height")\r
+                               v = e.getAttribute(n, 2);\r
+               }\r
+\r
+               if (n == 'style' && v) {\r
+                       if (!tinyMCE.isOpera)\r
+                               v = e.style.cssText;\r
+\r
+                       v = tinyMCE.serializeStyle(tinyMCE.parseStyle(v));\r
+               }\r
+\r
+               if (this.settings.on_save && n.indexOf('on') != -1 && this.settings.on_save && v && v !== '')\r
+                       v = tinyMCE.cleanupEventStr(v);\r
+\r
+               return (v && v !== '') ? '' + v : d;\r
+       },\r
+\r
+       _urlConverter : function(c, n, v) {\r
+               if (!c.settings.on_save)\r
+                       return tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, v);\r
+               else if (tinyMCE.getParam('convert_urls')) {\r
+                       if (!this.urlConverter)\r
+                               this.urlConverter = eval(tinyMCE.settings.urlconverter_callback);\r
+\r
+                       return this.urlConverter(v, n, true);\r
+               }\r
+\r
+               return v;\r
+       },\r
+\r
+       _arrayToRe : function(a, op, be, af) {\r
+               var i, r;\r
+\r
+               op = typeof(op) == "undefined" ? "gi" : op;\r
+               be = typeof(be) == "undefined" ? "^(" : be;\r
+               af = typeof(af) == "undefined" ? ")$" : af;\r
+\r
+               r = be;\r
+\r
+               for (i=0; i<a.length; i++)\r
+                       r += this._wildcardToRe(a[i]) + (i != a.length-1 ? "|" : "");\r
+\r
+               r += af;\r
+\r
+               return new RegExp(r, op);\r
+       },\r
+\r
+       _wildcardToRe : function(s) {\r
+               s = s.replace(/\?/g, '(\\S?)');\r
+               s = s.replace(/\+/g, '(\\S+)');\r
+               s = s.replace(/\*/g, '(\\S*)');\r
+\r
+               return s;\r
+       },\r
+\r
+       _setupEntities : function() {\r
+               var n, a, i, s = this.settings;\r
+\r
+               // Setup entities\r
+               if (s.entity_encoding == "named") {\r
+                       n = tinyMCE.clearArray([]);\r
+                       a = this.split(',', s.entities);\r
+                       for (i=0; i<a.length; i+=2)\r
+                               n[a[i]] = a[i+1];\r
+\r
+                       this.entities = n;\r
+               }\r
+\r
+               this.entitiesDone = true;\r
+       },\r
+\r
+       _setupRules : function() {\r
+               var s = this.settings;\r
+\r
+               // Setup default rule\r
+               this.addRuleStr(s.valid_elements);\r
+               this.addRuleStr(s.extended_valid_elements);\r
+               this.addChildRemoveRuleStr(s.valid_child_elements);\r
+\r
+               this.rulesDone = true;\r
+       },\r
+\r
+       _isDuplicate : function(n) {\r
+               var i, l, sn;\r
+\r
+               if (!this.settings.fix_content_duplication)\r
+                       return false;\r
+\r
+               if (tinyMCE.isRealIE && n.nodeType == 1) {\r
+                       // Mark elements\r
+                       if (n.mce_serialized == this.serializationId)\r
+                               return true;\r
+\r
+                       n.setAttribute('mce_serialized', this.serializationId);\r
+               } else {\r
+                       sn = this.serializedNodes;\r
+\r
+                       // Search lookup table for text nodes  and comments\r
+                       for (i=0, l = sn.length; i<l; i++) {\r
+                               if (sn[i] == n)\r
+                                       return true;\r
+                       }\r
+\r
+                       sn.push(n);\r
+               }\r
+\r
+               return false;\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_DOMUtils.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       createTagHTML : function(tn, a, h) {\r
+               var o = '', f = tinyMCE.xmlEncode, n;\r
+\r
+               o = '<' + tn;\r
+\r
+               if (a) {\r
+                       for (n in a) {\r
+                               if (typeof(a[n]) != 'function' && a[n] != null)\r
+                                       o += ' ' + f(n) + '="' + f('' + a[n]) + '"';\r
+                       }\r
+               }\r
+\r
+               o += !h ? ' />' : '>' + h + '</' + tn + '>';\r
+\r
+               return o;\r
+       },\r
+\r
+       createTag : function(d, tn, a, h) {\r
+               var o = d.createElement(tn), n;\r
+\r
+               if (a) {\r
+                       for (n in a) {\r
+                               if (typeof(a[n]) != 'function' && a[n] != null)\r
+                                       tinyMCE.setAttrib(o, n, a[n]);\r
+                       }\r
+               }\r
+\r
+               if (h)\r
+                       o.innerHTML = h;\r
+\r
+               return o;\r
+       },\r
+\r
+       getElementByAttributeValue : function(n, e, a, v) {\r
+               return (n = this.getElementsByAttributeValue(n, e, a, v)).length == 0 ? null : n[0];\r
+       },\r
+\r
+       getElementsByAttributeValue : function(n, e, a, v) {\r
+               var i, nl = n.getElementsByTagName(e), o = [];\r
+\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (tinyMCE.getAttrib(nl[i], a).indexOf(v) != -1)\r
+                               o[o.length] = nl[i];\r
+               }\r
+\r
+               return o;\r
+       },\r
+\r
+       isBlockElement : function(n) {\r
+               return n != null && n.nodeType == 1 && this.blockRegExp.test(n.nodeName);\r
+       },\r
+\r
+       getParentBlockElement : function(n, r) {\r
+               return this.getParentNode(n, function(n) {\r
+                       return tinyMCE.isBlockElement(n);\r
+               }, r);\r
+\r
+               return null;\r
+       },\r
+\r
+       insertAfter : function(n, r){\r
+               if (r.nextSibling)\r
+                       r.parentNode.insertBefore(n, r.nextSibling);\r
+               else\r
+                       r.parentNode.appendChild(n);\r
+       },\r
+\r
+       setInnerHTML : function(e, h) {\r
+               var i, nl, n;\r
+\r
+               // Convert all strong/em to b/i in Gecko\r
+               if (tinyMCE.isGecko) {\r
+                       h = h.replace(/<embed([^>]*)>/gi, '<tmpembed$1>');\r
+                       h = h.replace(/<em([^>]*)>/gi, '<i$1>');\r
+                       h = h.replace(/<tmpembed([^>]*)>/gi, '<embed$1>');\r
+                       h = h.replace(/<strong([^>]*)>/gi, '<b$1>');\r
+                       h = h.replace(/<\/strong>/gi, '</b>');\r
+                       h = h.replace(/<\/em>/gi, '</i>');\r
+               }\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       // Since MSIE handles invalid HTML better that valid XHTML we\r
+                       // need to make some things invalid. <hr /> gets converted to <hr>.\r
+                       h = h.replace(/\s\/>/g, '>');\r
+\r
+                       // Since MSIE auto generated emtpy P tags some times we must tell it to keep the real ones\r
+                       h = h.replace(/<p([^>]*)>\u00A0?<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs\r
+                       h = h.replace(/<p([^>]*)>\s*&nbsp;\s*<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs\r
+                       h = h.replace(/<p([^>]*)>\s+<\/p>/gi, '<p$1 mce_keep="true">&nbsp;</p>'); // Keep empty paragraphs\r
+\r
+                       // Remove first comment\r
+                       e.innerHTML = tinyMCE.uniqueTag + h;\r
+                       e.firstChild.removeNode(true);\r
+\r
+                       // Remove weird auto generated empty paragraphs unless it's supposed to be there\r
+                       nl = e.getElementsByTagName("p");\r
+                       for (i=nl.length-1; i>=0; i--) {\r
+                               n = nl[i];\r
+\r
+                               if (n.nodeName == 'P' && !n.hasChildNodes() && !n.mce_keep)\r
+                                       n.parentNode.removeChild(n);\r
+                       }\r
+               } else {\r
+                       h = this.fixGeckoBaseHREFBug(1, e, h);\r
+                       e.innerHTML = h;\r
+                       this.fixGeckoBaseHREFBug(2, e, h);\r
+               }\r
+       },\r
+\r
+       getOuterHTML : function(e) {\r
+               var d;\r
+\r
+               if (tinyMCE.isIE)\r
+                       return e.outerHTML;\r
+\r
+               d = e.ownerDocument.createElement("body");\r
+               d.appendChild(e.cloneNode(true));\r
+\r
+               return d.innerHTML;\r
+       },\r
+\r
+       setOuterHTML : function(e, h, d) {\r
+               var d = typeof(d) == "undefined" ? e.ownerDocument : d, i, nl, t;\r
+\r
+               if (tinyMCE.isIE && e.nodeType == 1)\r
+                       e.outerHTML = h;\r
+               else {\r
+                       t = d.createElement("body");\r
+                       t.innerHTML = h;\r
+\r
+                       for (i=0, nl=t.childNodes; i<nl.length; i++)\r
+                               e.parentNode.insertBefore(nl[i].cloneNode(true), e);\r
+\r
+                       e.parentNode.removeChild(e);\r
+               }\r
+       },\r
+\r
+       _getElementById : function(id, d) {\r
+               var e, i, j, f;\r
+\r
+               if (typeof(d) == "undefined")\r
+                       d = document;\r
+\r
+               e = d.getElementById(id);\r
+               if (!e) {\r
+                       f = d.forms;\r
+\r
+                       for (i=0; i<f.length; i++) {\r
+                               for (j=0; j<f[i].elements.length; j++) {\r
+                                       if (f[i].elements[j].name == id) {\r
+                                               e = f[i].elements[j];\r
+                                               break;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+\r
+               return e;\r
+       },\r
+\r
+       getNodeTree : function(n, na, t, nn) {\r
+               return this.selectNodes(n, function(n) {\r
+                       return (!t || n.nodeType == t) && (!nn || n.nodeName == nn);\r
+               }, na ? na : []);\r
+       },\r
+\r
+       getParentElement : function(n, na, f, r) {\r
+               var re = na ? new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$') : 0, v;\r
+\r
+               // Compatiblity with old scripts where f param was a attribute string\r
+               if (f && typeof(f) == 'string')\r
+                       return this.getParentElement(n, na, function(no) {return tinyMCE.getAttrib(no, f) !== '';});\r
+\r
+               return this.getParentNode(n, function(n) {\r
+                       return ((n.nodeType == 1 && !re) || (re && re.test(n.nodeName))) && (!f || f(n));\r
+               }, r);\r
+       },\r
+\r
+       getParentNode : function(n, f, r) {\r
+               while (n) {\r
+                       if (n == r)\r
+                               return null;\r
+\r
+                       if (f(n))\r
+                               return n;\r
+\r
+                       n = n.parentNode;\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       getAttrib : function(elm, name, dv) {\r
+               var v;\r
+\r
+               if (typeof(dv) == "undefined")\r
+                       dv = "";\r
+\r
+               // Not a element\r
+               if (!elm || elm.nodeType != 1)\r
+                       return dv;\r
+\r
+               try {\r
+                       v = elm.getAttribute(name, 0);\r
+               } catch (ex) {\r
+                       // IE 7 may cast exception on invalid attributes\r
+                       v = elm.getAttribute(name, 2);\r
+               }\r
+\r
+               // Try className for class attrib\r
+               if (name == "class" && !v)\r
+                       v = elm.className;\r
+\r
+               // Workaround for a issue with Firefox 1.5rc2+\r
+               if (tinyMCE.isGecko) {\r
+                       if (name == "src" && elm.src != null && elm.src !== '')\r
+                               v = elm.src;\r
+\r
+                       // Workaround for a issue with Firefox 1.5rc2+\r
+                       if (name == "href" && elm.href != null && elm.href !== '')\r
+                               v = elm.href;\r
+               } else if (tinyMCE.isIE) {\r
+                       switch (name) {\r
+                               case "http-equiv":\r
+                                       v = elm.httpEquiv;\r
+                                       break;\r
+\r
+                               case "width":\r
+                               case "height":\r
+                                       v = elm.getAttribute(name, 2);\r
+                                       break;\r
+                       }\r
+               }\r
+\r
+               if (name == "style" && !tinyMCE.isOpera)\r
+                       v = elm.style.cssText;\r
+\r
+               return (v && v !== '') ? v : dv;\r
+       },\r
+\r
+       setAttrib : function(el, name, va, fix) {\r
+               if (typeof(va) == "number" && va != null)\r
+                       va = "" + va;\r
+\r
+               if (fix) {\r
+                       if (va == null)\r
+                               va = "";\r
+\r
+                       va = va.replace(/[^0-9%]/g, '');\r
+               }\r
+\r
+               if (name == "style")\r
+                       el.style.cssText = va;\r
+\r
+               if (name == "class")\r
+                       el.className = va;\r
+\r
+               if (va != null && va !== '' && va != -1)\r
+                       el.setAttribute(name, va);\r
+               else\r
+                       el.removeAttribute(name);\r
+       },\r
+\r
+       setStyleAttrib : function(e, n, v) {\r
+               e.style[n] = v;\r
+\r
+               // Style attrib deleted in IE\r
+               if (tinyMCE.isIE && v == null || v == '') {\r
+                       v = tinyMCE.serializeStyle(tinyMCE.parseStyle(e.style.cssText));\r
+                       e.style.cssText = v;\r
+                       e.setAttribute("style", v);\r
+               }\r
+       },\r
+\r
+       switchClass : function(ei, c) {\r
+               var e;\r
+\r
+               if (tinyMCE.switchClassCache[ei])\r
+                       e = tinyMCE.switchClassCache[ei];\r
+               else\r
+                       e = tinyMCE.switchClassCache[ei] = document.getElementById(ei);\r
+\r
+               if (e) {\r
+                       // Keep tile mode\r
+                       if (tinyMCE.settings.button_tile_map && e.className && e.className.indexOf('mceTiledButton') == 0)\r
+                               c = 'mceTiledButton ' + c;\r
+\r
+                       e.className = c;\r
+               }\r
+       },\r
+\r
+       getAbsPosition : function(n, cn) {\r
+               var l = 0, t = 0;\r
+\r
+               while (n && n != cn) {\r
+                       l += n.offsetLeft;\r
+                       t += n.offsetTop;\r
+                       n = n.offsetParent;\r
+               }\r
+\r
+               return {absLeft : l, absTop : t};\r
+       },\r
+\r
+       prevNode : function(e, n) {\r
+               var a = n.split(','), i;\r
+\r
+               while ((e = e.previousSibling) != null) {\r
+                       for (i=0; i<a.length; i++) {\r
+                               if (e.nodeName == a[i])\r
+                                       return e;\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       nextNode : function(e, n) {\r
+               var a = n.split(','), i;\r
+\r
+               while ((e = e.nextSibling) != null) {\r
+                       for (i=0; i<a.length; i++) {\r
+                               if (e.nodeName == a[i])\r
+                                       return e;\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       selectElements : function(n, na, f) {\r
+               var i, a = [], nl, x;\r
+\r
+               for (x=0, na = na.split(','); x<na.length; x++)\r
+                       for (i=0, nl = n.getElementsByTagName(na[x]); i<nl.length; i++)\r
+                               (!f || f(nl[i])) && a.push(nl[i]);\r
+\r
+               return a;\r
+       },\r
+\r
+       selectNodes : function(n, f, a) {\r
+               var i;\r
+\r
+               if (!a)\r
+                       a = [];\r
+\r
+               if (f(n))\r
+                       a[a.length] = n;\r
+\r
+               if (n.hasChildNodes()) {\r
+                       for (i=0; i<n.childNodes.length; i++)\r
+                               tinyMCE.selectNodes(n.childNodes[i], f, a);\r
+               }\r
+\r
+               return a;\r
+       },\r
+\r
+       addCSSClass : function(e, c, b) {\r
+               var o = this.removeCSSClass(e, c);\r
+               return e.className = b ? c + (o !== '' ? (' ' + o) : '') : (o !== '' ? (o + ' ') : '') + c;\r
+       },\r
+\r
+       removeCSSClass : function(e, c) {\r
+               c = e.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');\r
+               return e.className = c != ' ' ? c : '';\r
+       },\r
+\r
+       hasCSSClass : function(n, c) {\r
+               return new RegExp('\\b' + c + '\\b', 'g').test(n.className);\r
+       },\r
+\r
+       renameElement : function(e, n, d) {\r
+               var ne, i, ar;\r
+\r
+               d = typeof(d) == "undefined" ? tinyMCE.selectedInstance.getDoc() : d;\r
+\r
+               if (e) {\r
+                       ne = d.createElement(n);\r
+\r
+                       ar = e.attributes;\r
+                       for (i=ar.length-1; i>-1; i--) {\r
+                               if (ar[i].specified && ar[i].nodeValue)\r
+                                       ne.setAttribute(ar[i].nodeName.toLowerCase(), ar[i].nodeValue);\r
+                       }\r
+\r
+                       ar = e.childNodes;\r
+                       for (i=0; i<ar.length; i++)\r
+                               ne.appendChild(ar[i].cloneNode(true));\r
+\r
+                       e.parentNode.replaceChild(ne, e);\r
+               }\r
+       },\r
+\r
+       getViewPort : function(w) {\r
+               var d = w.document, m = d.compatMode == 'CSS1Compat', b = d.body, de = d.documentElement;\r
+\r
+               return {\r
+                       left : w.pageXOffset || (m ? de.scrollLeft : b.scrollLeft),\r
+                       top : w.pageYOffset || (m ? de.scrollTop : b.scrollTop),\r
+                       width : w.innerWidth || (m ? de.clientWidth : b.clientWidth),\r
+                       height : w.innerHeight || (m ? de.clientHeight : b.clientHeight)\r
+               };\r
+       },\r
+\r
+       getStyle : function(n, na, d) {\r
+               if (!n)\r
+                       return false;\r
+\r
+               // Gecko\r
+               if (tinyMCE.isGecko && n.ownerDocument.defaultView) {\r
+                       try {\r
+                               return n.ownerDocument.defaultView.getComputedStyle(n, null).getPropertyValue(na);\r
+                       } catch (n) {\r
+                               // Old safari might fail\r
+                               return null;\r
+                       }\r
+               }\r
+\r
+               // Camelcase it, if needed\r
+               na = na.replace(/-(\D)/g, function(a, b){\r
+                       return b.toUpperCase();\r
+               });\r
+\r
+               // IE & Opera\r
+               if (n.currentStyle)\r
+                       return n.currentStyle[na];\r
+\r
+               return false;\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_URL.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       parseURL : function(url_str) {\r
+               var urlParts = [], i, pos, lastPos, chr;\r
+\r
+               if (url_str) {\r
+                       // Parse protocol part\r
+                       pos = url_str.indexOf('://');\r
+                       if (pos != -1) {\r
+                               urlParts.protocol = url_str.substring(0, pos);\r
+                               lastPos = pos + 3;\r
+                       }\r
+\r
+                       // Find port or path start\r
+                       for (i=lastPos; i<url_str.length; i++) {\r
+                               chr = url_str.charAt(i);\r
+\r
+                               if (chr == ':')\r
+                                       break;\r
+\r
+                               if (chr == '/')\r
+                                       break;\r
+                       }\r
+                       pos = i;\r
+\r
+                       // Get host\r
+                       urlParts.host = url_str.substring(lastPos, pos);\r
+\r
+                       // Get port\r
+                       urlParts.port = "";\r
+                       lastPos = pos;\r
+                       if (url_str.charAt(pos) == ':') {\r
+                               pos = url_str.indexOf('/', lastPos);\r
+                               urlParts.port = url_str.substring(lastPos+1, pos);\r
+                       }\r
+\r
+                       // Get path\r
+                       lastPos = pos;\r
+                       pos = url_str.indexOf('?', lastPos);\r
+\r
+                       if (pos == -1)\r
+                               pos = url_str.indexOf('#', lastPos);\r
+\r
+                       if (pos == -1)\r
+                               pos = url_str.length;\r
+\r
+                       urlParts.path = url_str.substring(lastPos, pos);\r
+\r
+                       // Get query\r
+                       lastPos = pos;\r
+                       if (url_str.charAt(pos) == '?') {\r
+                               pos = url_str.indexOf('#');\r
+                               pos = (pos == -1) ? url_str.length : pos;\r
+                               urlParts.query = url_str.substring(lastPos+1, pos);\r
+                       }\r
+\r
+                       // Get anchor\r
+                       lastPos = pos;\r
+                       if (url_str.charAt(pos) == '#') {\r
+                               pos = url_str.length;\r
+                               urlParts.anchor = url_str.substring(lastPos+1, pos);\r
+                       }\r
+               }\r
+\r
+               return urlParts;\r
+       },\r
+\r
+       serializeURL : function(up) {\r
+               var o = "";\r
+\r
+               if (up.protocol)\r
+                       o += up.protocol + "://";\r
+\r
+               if (up.host)\r
+                       o += up.host;\r
+\r
+               if (up.port)\r
+                       o += ":" + up.port;\r
+\r
+               if (up.path)\r
+                       o += up.path;\r
+\r
+               if (up.query)\r
+                       o += "?" + up.query;\r
+\r
+               if (up.anchor)\r
+                       o += "#" + up.anchor;\r
+\r
+               return o;\r
+       },\r
+\r
+       convertAbsoluteURLToRelativeURL : function(base_url, url_to_relative) {\r
+               var baseURL = this.parseURL(base_url), targetURL = this.parseURL(url_to_relative);\r
+               var i, strTok1, strTok2, breakPoint = 0, outPath = "", forceSlash = false;\r
+               var fileName, pos;\r
+\r
+               if (targetURL.path == '')\r
+                       targetURL.path = "/";\r
+               else\r
+                       forceSlash = true;\r
+\r
+               // Crop away last path part\r
+               base_url = baseURL.path.substring(0, baseURL.path.lastIndexOf('/'));\r
+               strTok1 = base_url.split('/');\r
+               strTok2 = targetURL.path.split('/');\r
+\r
+               if (strTok1.length >= strTok2.length) {\r
+                       for (i=0; i<strTok1.length; i++) {\r
+                               if (i >= strTok2.length || strTok1[i] != strTok2[i]) {\r
+                                       breakPoint = i + 1;\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (strTok1.length < strTok2.length) {\r
+                       for (i=0; i<strTok2.length; i++) {\r
+                               if (i >= strTok1.length || strTok1[i] != strTok2[i]) {\r
+                                       breakPoint = i + 1;\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (breakPoint == 1)\r
+                       return targetURL.path;\r
+\r
+               for (i=0; i<(strTok1.length-(breakPoint-1)); i++)\r
+                       outPath += "../";\r
+\r
+               for (i=breakPoint-1; i<strTok2.length; i++) {\r
+                       if (i != (breakPoint-1))\r
+                               outPath += "/" + strTok2[i];\r
+                       else\r
+                               outPath += strTok2[i];\r
+               }\r
+\r
+               targetURL.protocol = null;\r
+               targetURL.host = null;\r
+               targetURL.port = null;\r
+               targetURL.path = outPath == '' && forceSlash ? "/" : outPath;\r
+\r
+               // Remove document prefix from local anchors\r
+               fileName = baseURL.path;\r
+\r
+               if ((pos = fileName.lastIndexOf('/')) != -1)\r
+                       fileName = fileName.substring(pos + 1);\r
+\r
+               // Is local anchor\r
+               if (fileName == targetURL.path && targetURL.anchor !== '')\r
+                       targetURL.path = "";\r
+\r
+               // If empty and not local anchor force filename or slash\r
+               if (targetURL.path == '' && !targetURL.anchor)\r
+                       targetURL.path = fileName !== '' ? fileName : "/";\r
+\r
+               return this.serializeURL(targetURL);\r
+       },\r
+\r
+       convertRelativeToAbsoluteURL : function(base_url, relative_url) {\r
+               var baseURL = this.parseURL(base_url), baseURLParts, relURLParts, newRelURLParts, numBack, relURL = this.parseURL(relative_url), i;\r
+               var len, absPath, start, end, newBaseURLParts;\r
+\r
+               if (relative_url == '' || relative_url.indexOf('://') != -1 || /^(mailto:|javascript:|#|\/)/.test(relative_url))\r
+                       return relative_url;\r
+\r
+               // Split parts\r
+               baseURLParts = baseURL.path.split('/');\r
+               relURLParts = relURL.path.split('/');\r
+\r
+               // Remove empty chunks\r
+               newBaseURLParts = [];\r
+               for (i=baseURLParts.length-1; i>=0; i--) {\r
+                       if (baseURLParts[i].length == 0)\r
+                               continue;\r
+\r
+                       newBaseURLParts[newBaseURLParts.length] = baseURLParts[i];\r
+               }\r
+               baseURLParts = newBaseURLParts.reverse();\r
+\r
+               // Merge relURLParts chunks\r
+               newRelURLParts = [];\r
+               numBack = 0;\r
+               for (i=relURLParts.length-1; i>=0; i--) {\r
+                       if (relURLParts[i].length == 0 || relURLParts[i] == ".")\r
+                               continue;\r
+\r
+                       if (relURLParts[i] == '..') {\r
+                               numBack++;\r
+                               continue;\r
+                       }\r
+\r
+                       if (numBack > 0) {\r
+                               numBack--;\r
+                               continue;\r
+                       }\r
+\r
+                       newRelURLParts[newRelURLParts.length] = relURLParts[i];\r
+               }\r
+\r
+               relURLParts = newRelURLParts.reverse();\r
+\r
+               // Remove end from absolute path\r
+               len = baseURLParts.length-numBack;\r
+               absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/');\r
+               start = "";\r
+               end = "";\r
+\r
+               // Build output URL\r
+               relURL.protocol = baseURL.protocol;\r
+               relURL.host = baseURL.host;\r
+               relURL.port = baseURL.port;\r
+\r
+               // Re-add trailing slash if it's removed\r
+               if (relURL.path.charAt(relURL.path.length-1) == "/")\r
+                       absPath += "/";\r
+\r
+               relURL.path = absPath;\r
+\r
+               return this.serializeURL(relURL);\r
+       },\r
+\r
+       convertURL : function(url, node, on_save) {\r
+               var dl = document.location, start, portPart, urlParts, baseUrlParts, tmpUrlParts, curl;\r
+               var prot = dl.protocol, host = dl.hostname, port = dl.port;\r
+\r
+               // Pass through file protocol\r
+               if (prot == "file:")\r
+                       return url;\r
+\r
+               // Something is wrong, remove weirdness\r
+               url = tinyMCE.regexpReplace(url, '(http|https):///', '/');\r
+\r
+               // Mailto link or anchor (Pass through)\r
+               if (url.indexOf('mailto:') != -1 || url.indexOf('javascript:') != -1 || /^[ \t\r\n\+]*[#\?]/.test(url))\r
+                       return url;\r
+\r
+               // Fix relative/Mozilla\r
+               if (!tinyMCE.isIE && !on_save && url.indexOf("://") == -1 && url.charAt(0) != '/')\r
+                       return tinyMCE.settings.base_href + url;\r
+\r
+               // Handle relative URLs\r
+               if (on_save && tinyMCE.getParam('relative_urls')) {\r
+                       curl = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, url);\r
+                       if (curl.charAt(0) == '/')\r
+                               curl = tinyMCE.settings.document_base_prefix + curl;\r
+\r
+                       urlParts = tinyMCE.parseURL(curl);\r
+                       tmpUrlParts = tinyMCE.parseURL(tinyMCE.settings.document_base_url);\r
+\r
+                       // Force relative\r
+                       if (urlParts.host == tmpUrlParts.host && (urlParts.port == tmpUrlParts.port))\r
+                               return tinyMCE.convertAbsoluteURLToRelativeURL(tinyMCE.settings.document_base_url, curl);\r
+               }\r
+\r
+               // Handle absolute URLs\r
+               if (!tinyMCE.getParam('relative_urls')) {\r
+                       urlParts = tinyMCE.parseURL(url);\r
+                       baseUrlParts = tinyMCE.parseURL(tinyMCE.settings.base_href);\r
+\r
+                       // Force absolute URLs from relative URLs\r
+                       url = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, url);\r
+\r
+                       // If anchor and path is the same page\r
+                       if (urlParts.anchor && urlParts.path == baseUrlParts.path)\r
+                               return "#" + urlParts.anchor;\r
+               }\r
+\r
+               // Remove current domain\r
+               if (tinyMCE.getParam('remove_script_host')) {\r
+                       start = "";\r
+                       portPart = "";\r
+\r
+                       if (port !== '')\r
+                               portPart = ":" + port;\r
+\r
+                       start = prot + "//" + host + portPart + "/";\r
+\r
+                       if (url.indexOf(start) == 0)\r
+                               url = url.substring(start.length-1);\r
+               }\r
+\r
+               return url;\r
+       },\r
+\r
+       convertAllRelativeURLs : function(body) {\r
+               var i, elms, src, href, mhref, msrc;\r
+\r
+               // Convert all image URL:s to absolute URL\r
+               elms = body.getElementsByTagName("img");\r
+               for (i=0; i<elms.length; i++) {\r
+                       src = tinyMCE.getAttrib(elms[i], 'src');\r
+\r
+                       msrc = tinyMCE.getAttrib(elms[i], 'mce_src');\r
+                       if (msrc !== '')\r
+                               src = msrc;\r
+\r
+                       if (src !== '') {\r
+                               src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, src);\r
+                               elms[i].setAttribute("src", src);\r
+                       }\r
+               }\r
+\r
+               // Convert all link URL:s to absolute URL\r
+               elms = body.getElementsByTagName("a");\r
+               for (i=0; i<elms.length; i++) {\r
+                       href = tinyMCE.getAttrib(elms[i], 'href');\r
+\r
+                       mhref = tinyMCE.getAttrib(elms[i], 'mce_href');\r
+                       if (mhref !== '')\r
+                               href = mhref;\r
+\r
+                       if (href && href !== '') {\r
+                               href = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings.base_href, href);\r
+                               elms[i].setAttribute("href", href);\r
+                       }\r
+               }\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Array.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       clearArray : function(a) {\r
+               var n;\r
+\r
+               for (n in a)\r
+                       a[n] = null;\r
+\r
+               return a;\r
+       },\r
+\r
+       explode : function(d, s) {\r
+               var ar = s.split(d), oar = [], i;\r
+\r
+               for (i = 0; i<ar.length; i++) {\r
+                       if (ar[i] !== '')\r
+                               oar[oar.length] = ar[i];\r
+               }\r
+\r
+               return oar;\r
+       }\r
+});\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Event.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       _setEventsEnabled : function(node, state) {\r
+               var evs, x, y, elms, i, event;\r
+               var events = ['onfocus','onblur','onclick','ondblclick',\r
+                                       'onmousedown','onmouseup','onmouseover','onmousemove',\r
+                                       'onmouseout','onkeypress','onkeydown','onkeydown','onkeyup'];\r
+\r
+               evs = tinyMCE.settings.event_elements.split(',');\r
+               for (y=0; y<evs.length; y++){\r
+                       elms = node.getElementsByTagName(evs[y]);\r
+                       for (i=0; i<elms.length; i++) {\r
+                               event = "";\r
+\r
+                               for (x=0; x<events.length; x++) {\r
+                                       if ((event = tinyMCE.getAttrib(elms[i], events[x])) !== '') {\r
+                                               event = tinyMCE.cleanupEventStr("" + event);\r
+\r
+                                               if (!state)\r
+                                                       event = "return true;" + event;\r
+                                               else\r
+                                                       event = event.replace(/^return true;/gi, '');\r
+\r
+                                               elms[i].removeAttribute(events[x]);\r
+                                               elms[i].setAttribute(events[x], event);\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       },\r
+\r
+       _eventPatch : function(editor_id) {\r
+               var n, inst, win, e;\r
+\r
+               // Remove odd, error\r
+               if (typeof(tinyMCE) == "undefined")\r
+                       return true;\r
+\r
+               try {\r
+                       // Try selected instance first\r
+                       if (tinyMCE.selectedInstance) {\r
+                               win = tinyMCE.selectedInstance.getWin();\r
+\r
+                               if (win && win.event) {\r
+                                       e = win.event;\r
+\r
+                                       if (!e.target)\r
+                                               e.target = e.srcElement;\r
+\r
+                                       TinyMCE_Engine.prototype.handleEvent(e);\r
+                                       return;\r
+                               }\r
+                       }\r
+\r
+                       // Search for it\r
+                       for (n in tinyMCE.instances) {\r
+                               inst = tinyMCE.instances[n];\r
+\r
+                               if (!tinyMCE.isInstance(inst))\r
+                                       continue;\r
+\r
+                               inst.select();\r
+                               win = inst.getWin();\r
+\r
+                               if (win && win.event) {\r
+                                       e = win.event;\r
+\r
+                                       if (!e.target)\r
+                                               e.target = e.srcElement;\r
+\r
+                                       TinyMCE_Engine.prototype.handleEvent(e);\r
+                                       return;\r
+                               }\r
+                       }\r
+               } catch (ex) {\r
+                       // Ignore error if iframe is pointing to external URL\r
+               }\r
+       },\r
+\r
+       findEvent : function(e) {\r
+               var n, inst;\r
+\r
+               if (e)\r
+                       return e;\r
+\r
+               for (n in tinyMCE.instances) {\r
+                       inst = tinyMCE.instances[n];\r
+\r
+                       if (tinyMCE.isInstance(inst) && inst.getWin().event)\r
+                               return inst.getWin().event;\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       unloadHandler : function() {\r
+               tinyMCE.triggerSave(true, true);\r
+       },\r
+\r
+       addEventHandlers : function(inst) {\r
+               this.setEventHandlers(inst, 1);\r
+       },\r
+\r
+       setEventHandlers : function(inst, s) {\r
+               var doc = inst.getDoc(), ie, ot, i, f = s ? tinyMCE.addEvent : tinyMCE.removeEvent;\r
+\r
+               ie = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'controlselect', 'dblclick'];\r
+               ot = ['keypress', 'keyup', 'keydown', 'click', 'mouseup', 'mousedown', 'focus', 'blur', 'dragdrop'];\r
+\r
+               inst.switchSettings();\r
+\r
+               if (tinyMCE.isIE) {\r
+                       for (i=0; i<ie.length; i++)\r
+                               f(doc, ie[i], TinyMCE_Engine.prototype._eventPatch);\r
+               } else {\r
+                       for (i=0; i<ot.length; i++)\r
+                               f(doc, ot[i], tinyMCE.handleEvent);\r
+\r
+                       // Force designmode\r
+                       try {\r
+                               doc.designMode = "On";\r
+                       } catch (e) {\r
+                               // Ignore\r
+                       }\r
+               }\r
+       },\r
+\r
+       onMouseMove : function() {\r
+               var inst, lh;\r
+\r
+               // Fix for IE7 bug where it's not restoring hover on anchors correctly\r
+               if (tinyMCE.lastHover) {\r
+                       lh = tinyMCE.lastHover;\r
+\r
+                       // Call out on menus and refresh class on normal buttons\r
+                       if (lh.className.indexOf('mceMenu') != -1)\r
+                               tinyMCE._menuButtonEvent('out', lh);\r
+                       else\r
+                               lh.className = lh.className;\r
+\r
+                       tinyMCE.lastHover = null;\r
+               }\r
+\r
+               if (!tinyMCE.hasMouseMoved) {\r
+                       inst = tinyMCE.selectedInstance;\r
+\r
+                       // Workaround for bug #1437457 (Odd MSIE bug)\r
+                       if (inst.isFocused) {\r
+                               inst.undoBookmark = inst.selection.getBookmark();\r
+                               tinyMCE.hasMouseMoved = true;\r
+                       }\r
+               }\r
+\r
+       //      tinyMCE.cancelEvent(inst.getWin().event);\r
+       //      return false;\r
+       },\r
+\r
+       cancelEvent : function(e) {\r
+               if (!e)\r
+                       return false;\r
+\r
+               if (tinyMCE.isIE) {\r
+                       e.returnValue = false;\r
+                       e.cancelBubble = true;\r
+               } else {\r
+                       e.preventDefault();\r
+                       e.stopPropagation && e.stopPropagation();\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       addEvent : function(o, n, h) {\r
+               // Add cleanup for all non unload events\r
+               if (n != 'unload') {\r
+                       function clean() {\r
+                               var ex;\r
+\r
+                               try {\r
+                                       tinyMCE.removeEvent(o, n, h);\r
+                                       tinyMCE.removeEvent(window, 'unload', clean);\r
+                                       o = n = h = null;\r
+                               } catch (ex) {\r
+                                       // IE may produce access denied exception on unload\r
+                               }\r
+                       }\r
+\r
+                       // Add memory cleaner\r
+                       tinyMCE.addEvent(window, 'unload', clean);\r
+               }\r
+\r
+               if (o.attachEvent)\r
+                       o.attachEvent("on" + n, h);\r
+               else\r
+                       o.addEventListener(n, h, false);\r
+       },\r
+\r
+       removeEvent : function(o, n, h) {\r
+               if (o.detachEvent)\r
+                       o.detachEvent("on" + n, h);\r
+               else\r
+                       o.removeEventListener(n, h, false);\r
+       },\r
+\r
+       addSelectAccessibility : function(e, s, w) {\r
+               // Add event handlers \r
+               if (!s._isAccessible) {\r
+                       s.onkeydown = tinyMCE.accessibleEventHandler;\r
+                       s.onblur = tinyMCE.accessibleEventHandler;\r
+                       s._isAccessible = true;\r
+                       s._win = w;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       accessibleEventHandler : function(e) {\r
+               var elm, win = this._win;\r
+\r
+               e = tinyMCE.isIE ? win.event : e;\r
+               elm = tinyMCE.isIE ? e.srcElement : e.target;\r
+\r
+               // Unpiggyback onchange on blur\r
+               if (e.type == "blur") {\r
+                       if (elm.oldonchange) {\r
+                               elm.onchange = elm.oldonchange;\r
+                               elm.oldonchange = null;\r
+                       }\r
+\r
+                       return true;\r
+               }\r
+\r
+               // Piggyback onchange\r
+               if (elm.nodeName == "SELECT" && !elm.oldonchange) {\r
+                       elm.oldonchange = elm.onchange;\r
+                       elm.onchange = null;\r
+               }\r
+\r
+               // Execute onchange and remove piggyback\r
+               if (e.keyCode == 13 || e.keyCode == 32) {\r
+                       elm.onchange = elm.oldonchange;\r
+                       elm.onchange();\r
+                       elm.oldonchange = null;\r
+\r
+                       tinyMCE.cancelEvent(e);\r
+                       return false;\r
+               }\r
+\r
+               return true;\r
+       },\r
+\r
+       _resetIframeHeight : function() {\r
+               var ife;\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       ife = tinyMCE.selectedInstance.iframeElement;\r
+\r
+       /*              if (ife._oldWidth) {\r
+                               ife.style.width = ife._oldWidth;\r
+                               ife.width = ife._oldWidth;\r
+                       }*/\r
+\r
+                       if (ife._oldHeight) {\r
+                               ife.style.height = ife._oldHeight;\r
+                               ife.height = ife._oldHeight;\r
+                       }\r
+               }\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Selection.class.js */\r
+\r
+function TinyMCE_Selection(inst) {\r
+       this.instance = inst;\r
+};\r
+\r
+TinyMCE_Selection.prototype = {\r
+       getSelectedHTML : function() {\r
+               var inst = this.instance, e, r = this.getRng(), h;\r
+\r
+               if (!r)\r
+                       return null;\r
+\r
+               e = document.createElement("body");\r
+\r
+               if (r.cloneContents)\r
+                       e.appendChild(r.cloneContents());\r
+               else if (typeof(r.item) != 'undefined' || typeof(r.htmlText) != 'undefined')\r
+                       e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;\r
+               else\r
+                       e.innerHTML = r.toString(); // Failed, use text for now\r
+\r
+               h = tinyMCE._cleanupHTML(inst, inst.contentDocument, inst.settings, e, e, false, true, false);\r
+\r
+               // When editing always use fonts internaly\r
+               //if (tinyMCE.getParam("convert_fonts_to_spans"))\r
+               //      tinyMCE.convertSpansToFonts(inst.getDoc());\r
+\r
+               return h;\r
+       },\r
+\r
+       getSelectedText : function() {\r
+               var inst = this.instance, d, r, s, t;\r
+\r
+               if (tinyMCE.isIE) {\r
+                       d = inst.getDoc();\r
+\r
+                       if (d.selection.type == "Text") {\r
+                               r = d.selection.createRange();\r
+                               t = r.text;\r
+                       } else\r
+                               t = '';\r
+               } else {\r
+                       s = this.getSel();\r
+\r
+                       if (s && s.toString)\r
+                               t = s.toString();\r
+                       else\r
+                               t = '';\r
+               }\r
+\r
+               return t;\r
+       },\r
+\r
+       getBookmark : function(simple) {\r
+               var inst = this.instance, rng = this.getRng(), doc = inst.getDoc(), b = inst.getBody();\r
+               var trng, sx, sy, xx = -999999999, vp = inst.getViewPort();\r
+               var sp, le, s, e, nl, i, si, ei, w;\r
+\r
+               sx = vp.left;\r
+               sy = vp.top;\r
+\r
+               if (simple)\r
+                       return {rng : rng, scrollX : sx, scrollY : sy};\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       if (rng.item) {\r
+                               e = rng.item(0);\r
+\r
+                               nl = b.getElementsByTagName(e.nodeName);\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       if (e == nl[i]) {\r
+                                               sp = i;\r
+                                               break;\r
+                                       }\r
+                               }\r
+\r
+                               return {\r
+                                       tag : e.nodeName,\r
+                                       index : sp,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       } else {\r
+                               trng = doc.body.createTextRange();\r
+                               trng.moveToElementText(inst.getBody());\r
+                               trng.collapse(true);\r
+                               bp = Math.abs(trng.move('character', xx));\r
+\r
+                               trng = rng.duplicate();\r
+                               trng.collapse(true);\r
+                               sp = Math.abs(trng.move('character', xx));\r
+\r
+                               trng = rng.duplicate();\r
+                               trng.collapse(false);\r
+                               le = Math.abs(trng.move('character', xx)) - sp;\r
+\r
+                               return {\r
+                                       start : sp - bp,\r
+                                       length : le,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       }\r
+               } else {\r
+                       s = this.getSel();\r
+                       e = this.getFocusElement();\r
+\r
+                       if (!s)\r
+                               return null;\r
+\r
+                       if (e && e.nodeName == 'IMG') {\r
+                               /*nl = b.getElementsByTagName('IMG');\r
+                               for (i=0; i<nl.length; i++) {\r
+                                       if (e == nl[i]) {\r
+                                               sp = i;\r
+                                               break;\r
+                                       }\r
+                               }*/\r
+\r
+                               return {\r
+                                       start : -1,\r
+                                       end : -1,\r
+                                       index : sp,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       }\r
+\r
+                       // Caret or selection\r
+                       if (s.anchorNode == s.focusNode && s.anchorOffset == s.focusOffset) {\r
+                               e = this._getPosText(b, s.anchorNode, s.focusNode);\r
+\r
+                               if (!e)\r
+                                       return {scrollX : sx, scrollY : sy};\r
+\r
+                               return {\r
+                                       start : e.start + s.anchorOffset,\r
+                                       end : e.end + s.focusOffset,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       } else {\r
+                               e = this._getPosText(b, rng.startContainer, rng.endContainer);\r
+\r
+                               if (!e)\r
+                                       return {scrollX : sx, scrollY : sy};\r
+\r
+                               return {\r
+                                       start : e.start + rng.startOffset,\r
+                                       end : e.end + rng.endOffset,\r
+                                       scrollX : sx,\r
+                                       scrollY : sy\r
+                               };\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       moveToBookmark : function(bookmark) {\r
+               var inst = this.instance, rng, nl, i, ex, b = inst.getBody(), sd;\r
+               var doc = inst.getDoc(), win = inst.getWin(), sel = this.getSel();\r
+\r
+               if (!bookmark)\r
+                       return false;\r
+\r
+               if (tinyMCE.isSafari && bookmark.rng) {\r
+                       sel.setBaseAndExtent(bookmark.rng.startContainer, bookmark.rng.startOffset, bookmark.rng.endContainer, bookmark.rng.endOffset);\r
+                       return true;\r
+               }\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       if (bookmark.rng) {\r
+                               try {\r
+                                       bookmark.rng.select();\r
+                               } catch (ex) {\r
+                                       // Ignore\r
+                               }\r
+\r
+                               return true;\r
+                       }\r
+\r
+                       win.focus();\r
+\r
+                       if (bookmark.tag) {\r
+                               rng = b.createControlRange();\r
+\r
+                               nl = b.getElementsByTagName(bookmark.tag);\r
+\r
+                               if (nl.length > bookmark.index) {\r
+                                       try {\r
+                                               rng.addElement(nl[bookmark.index]);\r
+                                       } catch (ex) {\r
+                                               // Might be thrown if the node no longer exists\r
+                                       }\r
+                               }\r
+                       } else {\r
+                               // Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs\r
+                               try {\r
+                                       // Incorrect bookmark\r
+                                       if (bookmark.start < 0)\r
+                                               return true;\r
+\r
+                                       rng = inst.getSel().createRange();\r
+                                       rng.moveToElementText(inst.getBody());\r
+                                       rng.collapse(true);\r
+                                       rng.moveStart('character', bookmark.start);\r
+                                       rng.moveEnd('character', bookmark.length);\r
+                               } catch (ex) {\r
+                                       return true;\r
+                               }\r
+                       }\r
+\r
+                       rng.select();\r
+\r
+                       win.scrollTo(bookmark.scrollX, bookmark.scrollY);\r
+                       return true;\r
+               }\r
+\r
+               if (tinyMCE.isGecko || tinyMCE.isOpera) {\r
+                       if (!sel)\r
+                               return false;\r
+\r
+                       if (bookmark.rng) {\r
+                               sel.removeAllRanges();\r
+                               sel.addRange(bookmark.rng);\r
+                       }\r
+\r
+                       if (bookmark.start != -1 && bookmark.end != -1) {\r
+                               try {\r
+                                       sd = this._getTextPos(b, bookmark.start, bookmark.end);\r
+                                       rng = doc.createRange();\r
+                                       rng.setStart(sd.startNode, sd.startOffset);\r
+                                       rng.setEnd(sd.endNode, sd.endOffset);\r
+                                       sel.removeAllRanges();\r
+                                       sel.addRange(rng);\r
+\r
+                                       if (!tinyMCE.isOpera)\r
+                                               win.focus();\r
+                               } catch (ex) {\r
+                                       // Ignore\r
+                               }\r
+                       }\r
+\r
+                       /*\r
+                       if (typeof(bookmark.index) != 'undefined') {\r
+                               tinyMCE.selectElements(b, 'IMG', function (n) {\r
+                                       if (bookmark.index-- == 0) {\r
+                                               // Select image in Gecko here\r
+                                       }\r
+\r
+                                       return false;\r
+                               });\r
+                       }\r
+                       */\r
+\r
+                       win.scrollTo(bookmark.scrollX, bookmark.scrollY);\r
+                       return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       _getPosText : function(r, sn, en) {\r
+               var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};\r
+\r
+               while ((n = w.nextNode()) != null) {\r
+                       if (n == sn)\r
+                               d.start = p;\r
+\r
+                       if (n == en) {\r
+                               d.end = p;\r
+                               return d;\r
+                       }\r
+\r
+                       p += n.nodeValue ? n.nodeValue.length : 0;\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       _getTextPos : function(r, sp, ep) {\r
+               var w = document.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {};\r
+\r
+               while ((n = w.nextNode()) != null) {\r
+                       p += n.nodeValue ? n.nodeValue.length : 0;\r
+\r
+                       if (p >= sp && !d.startNode) {\r
+                               d.startNode = n;\r
+                               d.startOffset = sp - (p - n.nodeValue.length);\r
+                       }\r
+\r
+                       if (p >= ep) {\r
+                               d.endNode = n;\r
+                               d.endOffset = ep - (p - n.nodeValue.length);\r
+\r
+                               return d;\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       },\r
+\r
+       selectNode : function(node, collapse, select_text_node, to_start) {\r
+               var inst = this.instance, sel, rng, nodes;\r
+\r
+               if (!node)\r
+                       return;\r
+\r
+               if (typeof(collapse) == "undefined")\r
+                       collapse = true;\r
+\r
+               if (typeof(select_text_node) == "undefined")\r
+                       select_text_node = false;\r
+\r
+               if (typeof(to_start) == "undefined")\r
+                       to_start = true;\r
+\r
+               if (inst.settings.auto_resize)\r
+                       inst.resizeToContent();\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       rng = inst.getDoc().body.createTextRange();\r
+\r
+                       try {\r
+                               rng.moveToElementText(node);\r
+\r
+                               if (collapse)\r
+                                       rng.collapse(to_start);\r
+\r
+                               rng.select();\r
+                       } catch (e) {\r
+                               // Throws illigal agrument in MSIE some times\r
+                       }\r
+               } else {\r
+                       sel = this.getSel();\r
+\r
+                       if (!sel)\r
+                               return;\r
+\r
+                       if (tinyMCE.isSafari) {\r
+                               sel.setBaseAndExtent(node, 0, node, node.innerText.length);\r
+\r
+                               if (collapse) {\r
+                                       if (to_start)\r
+                                               sel.collapseToStart();\r
+                                       else\r
+                                               sel.collapseToEnd();\r
+                               }\r
+\r
+                               this.scrollToNode(node);\r
+\r
+                               return;\r
+                       }\r
+\r
+                       rng = inst.getDoc().createRange();\r
+\r
+                       if (select_text_node) {\r
+                               // Find first textnode in tree\r
+                               nodes = tinyMCE.getNodeTree(node, [], 3);\r
+                               if (nodes.length > 0)\r
+                                       rng.selectNodeContents(nodes[0]);\r
+                               else\r
+                                       rng.selectNodeContents(node);\r
+                       } else\r
+                               rng.selectNode(node);\r
+\r
+                       if (collapse) {\r
+                               // Special treatment of textnode collapse\r
+                               if (!to_start && node.nodeType == 3) {\r
+                                       rng.setStart(node, node.nodeValue.length);\r
+                                       rng.setEnd(node, node.nodeValue.length);\r
+                               } else\r
+                                       rng.collapse(to_start);\r
+                       }\r
+\r
+                       sel.removeAllRanges();\r
+                       sel.addRange(rng);\r
+               }\r
+\r
+               this.scrollToNode(node);\r
+\r
+               // Set selected element\r
+               tinyMCE.selectedElement = null;\r
+               if (node.nodeType == 1)\r
+                       tinyMCE.selectedElement = node;\r
+       },\r
+\r
+       scrollToNode : function(node) {\r
+               var inst = this.instance, w = inst.getWin(), vp = inst.getViewPort(), pos = tinyMCE.getAbsPosition(node), cvp, p, cwin;\r
+\r
+               // Only scroll if out of visible area\r
+               if (pos.absLeft < vp.left || pos.absLeft > vp.left + vp.width || pos.absTop < vp.top || pos.absTop > vp.top + (vp.height-25))\r
+                       w.scrollTo(pos.absLeft, pos.absTop - vp.height + 25);\r
+\r
+               // Scroll container window\r
+               if (inst.settings.auto_resize) {\r
+                       cwin = inst.getContainerWin();\r
+                       cvp = tinyMCE.getViewPort(cwin);\r
+                       p = this.getAbsPosition(node);\r
+\r
+                       if (p.absLeft < cvp.left || p.absLeft > cvp.left + cvp.width || p.absTop < cvp.top || p.absTop > cvp.top + cvp.height)\r
+                               cwin.scrollTo(p.absLeft, p.absTop - cvp.height + 25);\r
+               }\r
+       },\r
+\r
+       getAbsPosition : function(n) {\r
+               var pos = tinyMCE.getAbsPosition(n), ipos = tinyMCE.getAbsPosition(this.instance.iframeElement);\r
+\r
+               return {\r
+                       absLeft : ipos.absLeft + pos.absLeft,\r
+                       absTop : ipos.absTop + pos.absTop\r
+               };\r
+       },\r
+\r
+       getSel : function() {\r
+               var inst = this.instance;\r
+\r
+               if (tinyMCE.isRealIE)\r
+                       return inst.getDoc().selection;\r
+\r
+               return inst.contentWindow.getSelection();\r
+       },\r
+\r
+       getRng : function() {\r
+               var s = this.getSel();\r
+\r
+               if (s == null)\r
+                       return null;\r
+\r
+               if (tinyMCE.isRealIE)\r
+                       return s.createRange();\r
+\r
+               if (tinyMCE.isSafari && !s.getRangeAt)\r
+                       return '' + window.getSelection();\r
+\r
+               if (s.rangeCount > 0)\r
+                       return s.getRangeAt(0);\r
+\r
+               return null;\r
+       },\r
+\r
+       isCollapsed : function() {\r
+               var r = this.getRng();\r
+\r
+               if (r.item)\r
+                       return false;\r
+\r
+               return r.boundingWidth == 0 || this.getSel().isCollapsed;\r
+       },\r
+\r
+       collapse : function(b) {\r
+               var r = this.getRng(), s = this.getSel();\r
+\r
+               if (r.select) {\r
+                       r.collapse(b);\r
+                       r.select();\r
+               } else {\r
+                       if (b)\r
+                               s.collapseToStart();\r
+                       else\r
+                               s.collapseToEnd();\r
+               }\r
+       },\r
+\r
+       getFocusElement : function() {\r
+               var inst = this.instance, doc, rng, sel, elm;\r
+\r
+               if (tinyMCE.isRealIE) {\r
+                       doc = inst.getDoc();\r
+                       rng = doc.selection.createRange();\r
+\r
+       //              if (rng.collapse)\r
+       //                      rng.collapse(true);\r
+\r
+                       elm = rng.item ? rng.item(0) : rng.parentElement();\r
+               } else {\r
+                       if (!tinyMCE.isSafari && inst.isHidden())\r
+                               return inst.getBody();\r
+\r
+                       sel = this.getSel();\r
+                       rng = this.getRng();\r
+\r
+                       if (!sel || !rng)\r
+                               return null;\r
+\r
+                       elm = rng.commonAncestorContainer;\r
+                       //elm = (sel && sel.anchorNode) ? sel.anchorNode : null;\r
+\r
+                       // Handle selection a image or other control like element such as anchors\r
+                       if (!rng.collapsed) {\r
+                               // Is selection small\r
+                               if (rng.startContainer == rng.endContainer) {\r
+                                       if (rng.startOffset - rng.endOffset < 2) {\r
+                                               if (rng.startContainer.hasChildNodes())\r
+                                                       elm = rng.startContainer.childNodes[rng.startOffset];\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       // Get the element parent of the node\r
+                       elm = tinyMCE.getParentElement(elm);\r
+\r
+                       //if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "img")\r
+                       //      elm = tinyMCE.selectedElement;\r
+               }\r
+\r
+               return elm;\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_UndoRedo.class.js */\r
+\r
+function TinyMCE_UndoRedo(inst) {\r
+       this.instance = inst;\r
+       this.undoLevels = [];\r
+       this.undoIndex = 0;\r
+       this.typingUndoIndex = -1;\r
+       this.undoRedo = true;\r
+};\r
+\r
+TinyMCE_UndoRedo.prototype = {\r
+       add : function(l) {\r
+               var b, customUndoLevels, newHTML, inst = this.instance, i, ul, ur;\r
+\r
+               if (l) {\r
+                       this.undoLevels[this.undoLevels.length] = l;\r
+                       return true;\r
+               }\r
+\r
+               if (this.typingUndoIndex != -1) {\r
+                       this.undoIndex = this.typingUndoIndex;\r
+\r
+                       if (tinyMCE.typingUndoIndex != -1)\r
+                               tinyMCE.undoIndex = tinyMCE.typingUndoIndex;\r
+               }\r
+\r
+               newHTML = tinyMCE.trim(inst.getBody().innerHTML);\r
+               if (this.undoLevels[this.undoIndex] && newHTML != this.undoLevels[this.undoIndex].content) {\r
+                       //tinyMCE.debug(newHTML, this.undoLevels[this.undoIndex].content);\r
+\r
+                       // Is dirty again\r
+                       inst.isNotDirty = false;\r
+\r
+                       tinyMCE.dispatchCallback(inst, 'onchange_callback', 'onChange', inst);\r
+\r
+                       // Time to compress\r
+                       customUndoLevels = tinyMCE.settings.custom_undo_redo_levels;\r
+                       if (customUndoLevels != -1 && this.undoLevels.length > customUndoLevels) {\r
+                               for (i=0; i<this.undoLevels.length-1; i++)\r
+                                       this.undoLevels[i] = this.undoLevels[i+1];\r
+\r
+                               this.undoLevels.length--;\r
+                               this.undoIndex--;\r
+\r
+                               // Todo: Implement global undo/redo logic here\r
+                       }\r
+\r
+                       b = inst.undoBookmark;\r
+\r
+                       if (!b)\r
+                               b = inst.selection.getBookmark();\r
+\r
+                       this.undoIndex++;\r
+                       this.undoLevels[this.undoIndex] = {\r
+                               content : newHTML,\r
+                               bookmark : b\r
+                       };\r
+\r
+                       // Remove all above from global undo/redo\r
+                       ul = tinyMCE.undoLevels;\r
+                       for (i=tinyMCE.undoIndex + 1; i<ul.length; i++) {\r
+                               ur = ul[i].undoRedo;\r
+\r
+                               if (ur.undoIndex == ur.undoLevels.length -1)\r
+                                       ur.undoIndex--;\r
+\r
+                               ur.undoLevels.length--;\r
+                       }\r
+\r
+                       // Add global undo level\r
+                       tinyMCE.undoLevels[tinyMCE.undoIndex++] = inst;\r
+                       tinyMCE.undoLevels.length = tinyMCE.undoIndex;\r
+\r
+                       this.undoLevels.length = this.undoIndex + 1;\r
+\r
+                       return true;\r
+               }\r
+\r
+               return false;\r
+       },\r
+\r
+       undo : function() {\r
+               var inst = this.instance;\r
+\r
+               // Do undo\r
+               if (this.undoIndex > 0) {\r
+                       this.undoIndex--;\r
+\r
+                       tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);\r
+                       inst.repaint();\r
+\r
+                       if (inst.settings.custom_undo_redo_restore_selection)\r
+                               inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);\r
+               }\r
+       },\r
+\r
+       redo : function() {\r
+               var inst = this.instance;\r
+\r
+               tinyMCE.execCommand("mceEndTyping");\r
+\r
+               if (this.undoIndex < (this.undoLevels.length-1)) {\r
+                       this.undoIndex++;\r
+\r
+                       tinyMCE.setInnerHTML(inst.getBody(), this.undoLevels[this.undoIndex].content);\r
+                       inst.repaint();\r
+\r
+                       if (inst.settings.custom_undo_redo_restore_selection)\r
+                               inst.selection.moveToBookmark(this.undoLevels[this.undoIndex].bookmark);\r
+               }\r
+\r
+               tinyMCE.triggerNodeChange();\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_ForceParagraphs.class.js */\r
+\r
+var TinyMCE_ForceParagraphs = {\r
+       _insertPara : function(inst, e) {\r
+               var doc = inst.getDoc(), sel = inst.getSel(), body = inst.getBody(), win = inst.contentWindow, rng = sel.getRangeAt(0);\r
+               var rootElm = doc.documentElement, blockName = "P", startNode, endNode, startBlock, endBlock;\r
+               var rngBefore, rngAfter, direct, startNode, startOffset, endNode, endOffset, b = tinyMCE.isOpera ? inst.selection.getBookmark() : null;\r
+               var paraBefore, paraAfter, startChop, endChop, contents, i;\r
+\r
+               function isEmpty(para) {\r
+                       var nodes;\r
+\r
+                       function isEmptyHTML(html) {\r
+                               return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == '';\r
+                       }\r
+\r
+                       // Check for images\r
+                       if (para.getElementsByTagName("img").length > 0)\r
+                               return false;\r
+\r
+                       // Check for tables\r
+                       if (para.getElementsByTagName("table").length > 0)\r
+                               return false;\r
+\r
+                       // Check for HRs\r
+                       if (para.getElementsByTagName("hr").length > 0)\r
+                               return false;\r
+\r
+                       // Check all textnodes\r
+                       nodes = tinyMCE.getNodeTree(para, [], 3);\r
+                       for (i=0; i<nodes.length; i++) {\r
+                               if (!isEmptyHTML(nodes[i].nodeValue))\r
+                                       return false;\r
+                       }\r
+\r
+                       // No images, no tables, no hrs, no text content then it's empty\r
+                       return true;\r
+               }\r
+\r
+       //      tinyMCE.debug(body.innerHTML);\r
+\r
+       //      debug(e.target, sel.anchorNode.nodeName, sel.focusNode.nodeName, rng.startContainer, rng.endContainer, rng.commonAncestorContainer, sel.anchorOffset, sel.focusOffset, rng.toString());\r
+\r
+               // Setup before range\r
+               rngBefore = doc.createRange();\r
+               rngBefore.setStart(sel.anchorNode, sel.anchorOffset);\r
+               rngBefore.collapse(true);\r
+\r
+               // Setup after range\r
+               rngAfter = doc.createRange();\r
+               rngAfter.setStart(sel.focusNode, sel.focusOffset);\r
+               rngAfter.collapse(true);\r
+\r
+               // Setup start/end points\r
+               direct = rngBefore.compareBoundaryPoints(rngBefore.START_TO_END, rngAfter) < 0;\r
+               startNode = direct ? sel.anchorNode : sel.focusNode;\r
+               startOffset = direct ? sel.anchorOffset : sel.focusOffset;\r
+               endNode = direct ? sel.focusNode : sel.anchorNode;\r
+               endOffset = direct ? sel.focusOffset : sel.anchorOffset;\r
+\r
+               startNode = startNode.nodeName == "BODY" ? startNode.firstChild : startNode;\r
+               endNode = endNode.nodeName == "BODY" ? endNode.firstChild : endNode;\r
+\r
+               // Get block elements\r
+               startBlock = inst.getParentBlockElement(startNode);\r
+               endBlock = inst.getParentBlockElement(endNode);\r
+\r
+               // If absolute force paragraph generation within\r
+               if (startBlock && (startBlock.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(startBlock.style.position)))\r
+                       startBlock = null;\r
+\r
+               if (endBlock && (endBlock.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(endBlock.style.position)))\r
+                       endBlock = null;\r
+\r
+               // Use current block name\r
+               if (startBlock != null) {\r
+                       blockName = startBlock.nodeName;\r
+\r
+                       // Use P instead\r
+                       if (/(TD|TABLE|TH|CAPTION)/.test(blockName) || (blockName == "DIV" && /left|right/gi.test(startBlock.style.cssFloat)))\r
+                               blockName = "P";\r
+               }\r
+\r
+               // Within a list use normal behaviour\r
+               if (tinyMCE.getParentElement(startBlock, "OL,UL", null, body) != null)\r
+                       return false;\r
+\r
+               // Within a table create new paragraphs\r
+               if ((startBlock != null && startBlock.nodeName == "TABLE") || (endBlock != null && endBlock.nodeName == "TABLE"))\r
+                       startBlock = endBlock = null;\r
+\r
+               // Setup new paragraphs\r
+               paraBefore = (startBlock != null && startBlock.nodeName == blockName) ? startBlock.cloneNode(false) : doc.createElement(blockName);\r
+               paraAfter = (endBlock != null && endBlock.nodeName == blockName) ? endBlock.cloneNode(false) : doc.createElement(blockName);\r
+\r
+               // Is header, then force paragraph under\r
+               if (/^(H[1-6])$/.test(blockName))\r
+                       paraAfter = doc.createElement("p");\r
+\r
+               // Setup chop nodes\r
+               startChop = startNode;\r
+               endChop = endNode;\r
+\r
+               // Get startChop node\r
+               node = startChop;\r
+               do {\r
+                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))\r
+                               break;\r
+\r
+                       startChop = node;\r
+               } while ((node = node.previousSibling ? node.previousSibling : node.parentNode));\r
+\r
+               // Get endChop node\r
+               node = endChop;\r
+               do {\r
+                       if (node == body || node.nodeType == 9 || tinyMCE.isBlockElement(node))\r
+                               break;\r
+\r
+                       endChop = node;\r
+               } while ((node = node.nextSibling ? node.nextSibling : node.parentNode));\r
+\r
+               // Fix when only a image is within the TD\r
+               if (startChop.nodeName == "TD")\r
+                       startChop = startChop.firstChild;\r
+\r
+               if (endChop.nodeName == "TD")\r
+                       endChop = endChop.lastChild;\r
+\r
+               // If not in a block element\r
+               if (startBlock == null) {\r
+                       // Delete selection\r
+                       rng.deleteContents();\r
+\r
+                       if (!tinyMCE.isSafari)\r
+                               sel.removeAllRanges();\r
+\r
+                       if (startChop != rootElm && endChop != rootElm) {\r
+                               // Insert paragraph before\r
+                               rngBefore = rng.cloneRange();\r
+\r
+                               if (startChop == body)\r
+                                       rngBefore.setStart(startChop, 0);\r
+                               else\r
+                                       rngBefore.setStartBefore(startChop);\r
+\r
+                               paraBefore.appendChild(rngBefore.cloneContents());\r
+\r
+                               // Insert paragraph after\r
+                               if (endChop.parentNode.nodeName == blockName)\r
+                                       endChop = endChop.parentNode;\r
+\r
+                               // If not after image\r
+                               //if (rng.startContainer.nodeName != "BODY" && rng.endContainer.nodeName != "BODY")\r
+                                       rng.setEndAfter(endChop);\r
+\r
+                               if (endChop.nodeName != "#text" && endChop.nodeName != "BODY")\r
+                                       rngBefore.setEndAfter(endChop);\r
+\r
+                               contents = rng.cloneContents();\r
+                               if (contents.firstChild && (contents.firstChild.nodeName == blockName || contents.firstChild.nodeName == "BODY"))\r
+                                       paraAfter.innerHTML = contents.firstChild.innerHTML;\r
+                               else\r
+                                       paraAfter.appendChild(contents);\r
+\r
+                               // Check if it's a empty paragraph\r
+                               if (isEmpty(paraBefore))\r
+                                       paraBefore.innerHTML = "&nbsp;";\r
+\r
+                               // Check if it's a empty paragraph\r
+                               if (isEmpty(paraAfter))\r
+                                       paraAfter.innerHTML = "&nbsp;";\r
+\r
+                               // Delete old contents\r
+                               rng.deleteContents();\r
+                               rngAfter.deleteContents();\r
+                               rngBefore.deleteContents();\r
+\r
+                               // Insert new paragraphs\r
+                               if (tinyMCE.isOpera) {\r
+                                       paraBefore.normalize();\r
+                                       rngBefore.insertNode(paraBefore);\r
+                                       paraAfter.normalize();\r
+                                       rngBefore.insertNode(paraAfter);\r
+                               } else {\r
+                                       paraAfter.normalize();\r
+                                       rngBefore.insertNode(paraAfter);\r
+                                       paraBefore.normalize();\r
+                                       rngBefore.insertNode(paraBefore);\r
+                               }\r
+\r
+                               //tinyMCE.debug("1: ", paraBefore.innerHTML, paraAfter.innerHTML);\r
+                       } else {\r
+                               body.innerHTML = "<" + blockName + ">&nbsp;</" + blockName + "><" + blockName + ">&nbsp;</" + blockName + ">";\r
+                               paraAfter = body.childNodes[1];\r
+                       }\r
+\r
+                       inst.selection.moveToBookmark(b);\r
+                       inst.selection.selectNode(paraAfter, true, true);\r
+\r
+                       return true;\r
+               }\r
+\r
+               // Place first part within new paragraph\r
+               if (startChop.nodeName == blockName)\r
+                       rngBefore.setStart(startChop, 0);\r
+               else\r
+                       rngBefore.setStartBefore(startChop);\r
+\r
+               rngBefore.setEnd(startNode, startOffset);\r
+               paraBefore.appendChild(rngBefore.cloneContents());\r
+\r
+               // Place secound part within new paragraph\r
+               rngAfter.setEndAfter(endChop);\r
+               rngAfter.setStart(endNode, endOffset);\r
+               contents = rngAfter.cloneContents();\r
+\r
+               if (contents.firstChild && contents.firstChild.nodeName == blockName) {\r
+       /*              var nodes = contents.firstChild.childNodes;\r
+                       for (i=0; i<nodes.length; i++) {\r
+                               //tinyMCE.debug(nodes[i].nodeName);\r
+                               if (nodes[i].nodeName != "BODY")\r
+                                       paraAfter.appendChild(nodes[i]);\r
+                       }\r
+       */\r
+                       paraAfter.innerHTML = contents.firstChild.innerHTML;\r
+               } else\r
+                       paraAfter.appendChild(contents);\r
+\r
+               // Check if it's a empty paragraph\r
+               if (isEmpty(paraBefore))\r
+                       paraBefore.innerHTML = "&nbsp;";\r
+\r
+               // Check if it's a empty paragraph\r
+               if (isEmpty(paraAfter))\r
+                       paraAfter.innerHTML = "&nbsp;";\r
+\r
+               // Create a range around everything\r
+               rng = doc.createRange();\r
+\r
+               if (!startChop.previousSibling && startChop.parentNode.nodeName.toUpperCase() == blockName) {\r
+                       rng.setStartBefore(startChop.parentNode);\r
+               } else {\r
+                       if (rngBefore.startContainer.nodeName.toUpperCase() == blockName && rngBefore.startOffset == 0)\r
+                               rng.setStartBefore(rngBefore.startContainer);\r
+                       else\r
+                               rng.setStart(rngBefore.startContainer, rngBefore.startOffset);\r
+               }\r
+\r
+               if (!endChop.nextSibling && endChop.parentNode.nodeName.toUpperCase() == blockName)\r
+                       rng.setEndAfter(endChop.parentNode);\r
+               else\r
+                       rng.setEnd(rngAfter.endContainer, rngAfter.endOffset);\r
+\r
+               // Delete all contents and insert new paragraphs\r
+               rng.deleteContents();\r
+\r
+               if (tinyMCE.isOpera) {\r
+                       rng.insertNode(paraBefore);\r
+                       rng.insertNode(paraAfter);\r
+               } else {\r
+                       rng.insertNode(paraAfter);\r
+                       rng.insertNode(paraBefore);\r
+               }\r
+\r
+               //tinyMCE.debug("2", paraBefore.innerHTML, paraAfter.innerHTML);\r
+\r
+               // Normalize\r
+               paraAfter.normalize();\r
+               paraBefore.normalize();\r
+\r
+               inst.selection.moveToBookmark(b);\r
+               inst.selection.selectNode(paraAfter, true, true);\r
+\r
+               return true;\r
+       },\r
+\r
+       _handleBackSpace : function(inst) {\r
+               var r = inst.getRng(), sn = r.startContainer, nv, s = false;\r
+\r
+               // Added body check for bug #1527787\r
+               if (sn && sn.nextSibling && sn.nextSibling.nodeName == "BR" && sn.parentNode.nodeName != "BODY") {\r
+                       nv = sn.nodeValue;\r
+\r
+                       // Handle if a backspace is pressed after a space character #bug 1466054 removed since fix for #1527787\r
+                       /*if (nv != null && nv.length >= r.startOffset && nv.charAt(r.startOffset - 1) == ' ')\r
+                               s = true;*/\r
+\r
+                       // Only remove BRs if we are at the end of line #bug 1464152\r
+                       if (nv != null && r.startOffset == nv.length)\r
+                               sn.nextSibling.parentNode.removeChild(sn.nextSibling);\r
+               }\r
+\r
+               if (inst.settings.auto_resize)\r
+                       inst.resizeToContent();\r
+\r
+               return s;\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Layer.class.js */\r
+\r
+function TinyMCE_Layer(id, bm) {\r
+       this.id = id;\r
+       this.blockerElement = null;\r
+       this.events = false;\r
+       this.element = null;\r
+       this.blockMode = typeof(bm) != 'undefined' ? bm : true;\r
+       this.doc = document;\r
+};\r
+\r
+TinyMCE_Layer.prototype = {\r
+       moveRelativeTo : function(re, p) {\r
+               var rep = this.getAbsPosition(re), e = this.getElement(), x, y;\r
+               var w = parseInt(re.offsetWidth), h = parseInt(re.offsetHeight);\r
+               var ew = parseInt(e.offsetWidth), eh = parseInt(e.offsetHeight);\r
+\r
+               switch (p) {\r
+                       case "tl":\r
+                               x = rep.absLeft;\r
+                               y = rep.absTop;\r
+                               break;\r
+\r
+                       case "tr":\r
+                               x = rep.absLeft + w;\r
+                               y = rep.absTop;\r
+                               break;\r
+\r
+                       case "bl":\r
+                               x = rep.absLeft;\r
+                               y = rep.absTop + h;\r
+                               break;\r
+\r
+                       case "br":\r
+                               x = rep.absLeft + w;\r
+                               y = rep.absTop + h;\r
+                               break;\r
+\r
+                       case "cc":\r
+                               x = rep.absLeft + (w / 2) - (ew / 2);\r
+                               y = rep.absTop + (h / 2) - (eh / 2);\r
+                               break;\r
+               }\r
+\r
+               this.moveTo(x, y);\r
+       },\r
+\r
+       moveBy : function(x, y) {\r
+               var e = this.getElement();\r
+               this.moveTo(parseInt(e.style.left) + x, parseInt(e.style.top) + y);\r
+       },\r
+\r
+       moveTo : function(x, y) {\r
+               var e = this.getElement();\r
+\r
+               e.style.left = x + "px";\r
+               e.style.top = y + "px";\r
+\r
+               this.updateBlocker();\r
+       },\r
+\r
+       resizeBy : function(w, h) {\r
+               var e = this.getElement();\r
+               this.resizeTo(parseInt(e.style.width) + w, parseInt(e.style.height) + h);\r
+       },\r
+\r
+       resizeTo : function(w, h) {\r
+               var e = this.getElement();\r
+\r
+               if (w != null)\r
+                       e.style.width = w + "px";\r
+\r
+               if (h != null)\r
+                       e.style.height = h + "px";\r
+\r
+               this.updateBlocker();\r
+       },\r
+\r
+       show : function() {\r
+               var el = this.getElement();\r
+\r
+               if (el) {\r
+                       el.style.display = 'block';\r
+                       this.updateBlocker();\r
+               }\r
+       },\r
+\r
+       hide : function() {\r
+               var el = this.getElement();\r
+\r
+               if (el) {\r
+                       el.style.display = 'none';\r
+                       this.updateBlocker();\r
+               }\r
+       },\r
+\r
+       isVisible : function() {\r
+               return this.getElement().style.display == 'block';\r
+       },\r
+\r
+       getElement : function() {\r
+               if (!this.element)\r
+                       this.element = this.doc.getElementById(this.id);\r
+\r
+               return this.element;\r
+       },\r
+\r
+       setBlockMode : function(s) {\r
+               this.blockMode = s;\r
+       },\r
+\r
+       updateBlocker : function() {\r
+               var e, b, x, y, w, h;\r
+\r
+               b = this.getBlocker();\r
+               if (b) {\r
+                       if (this.blockMode) {\r
+                               e = this.getElement();\r
+                               x = this.parseInt(e.style.left);\r
+                               y = this.parseInt(e.style.top);\r
+                               w = this.parseInt(e.offsetWidth);\r
+                               h = this.parseInt(e.offsetHeight);\r
+\r
+                               b.style.left = x + 'px';\r
+                               b.style.top = y + 'px';\r
+                               b.style.width = w + 'px';\r
+                               b.style.height = h + 'px';\r
+                               b.style.display = e.style.display;\r
+                       } else\r
+                               b.style.display = 'none';\r
+               }\r
+       },\r
+\r
+       getBlocker : function() {\r
+               var d, b;\r
+\r
+               if (!this.blockerElement && this.blockMode) {\r
+                       d = this.doc;\r
+                       b = d.getElementById(this.id + "_blocker");\r
+\r
+                       if (!b) {\r
+                               b = d.createElement("iframe");\r
+\r
+                               b.setAttribute('id', this.id + "_blocker");\r
+                               b.style.cssText = 'display: none; position: absolute; left: 0; top: 0';\r
+                               b.src = 'javascript:false;';\r
+                               b.frameBorder = '0';\r
+                               b.scrolling = 'no';\r
+       \r
+                               d.body.appendChild(b);\r
+                       }\r
+\r
+                       this.blockerElement = b;\r
+               }\r
+\r
+               return this.blockerElement;\r
+       },\r
+\r
+       getAbsPosition : function(n) {\r
+               var p = {absLeft : 0, absTop : 0};\r
+\r
+               while (n) {\r
+                       p.absLeft += n.offsetLeft;\r
+                       p.absTop += n.offsetTop;\r
+                       n = n.offsetParent;\r
+               }\r
+\r
+               return p;\r
+       },\r
+\r
+       create : function(n, c, p, h) {\r
+               var d = this.doc, e = d.createElement(n);\r
+\r
+               e.setAttribute('id', this.id);\r
+\r
+               if (c)\r
+                       e.className = c;\r
+\r
+               if (!p)\r
+                       p = d.body;\r
+\r
+               if (h)\r
+                       e.innerHTML = h;\r
+\r
+               p.appendChild(e);\r
+\r
+               return this.element = e;\r
+       },\r
+\r
+       exists : function() {\r
+               return this.doc.getElementById(this.id) != null;\r
+       },\r
+\r
+       parseInt : function(s) {\r
+               if (s == null || s == '')\r
+                       return 0;\r
+\r
+               return parseInt(s);\r
+       },\r
+\r
+       remove : function() {\r
+               var e = this.getElement(), b = this.getBlocker();\r
+\r
+               if (e)\r
+                       e.parentNode.removeChild(e);\r
+\r
+               if (b)\r
+                       b.parentNode.removeChild(b);\r
+       }\r
+\r
+       };\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Menu.class.js */\r
+\r
+function TinyMCE_Menu() {\r
+       var id;\r
+\r
+       if (typeof(tinyMCE.menuCounter) == "undefined")\r
+               tinyMCE.menuCounter = 0;\r
+\r
+       id = "mc_menu_" + tinyMCE.menuCounter++;\r
+\r
+       TinyMCE_Layer.call(this, id, true);\r
+\r
+       this.id = id;\r
+       this.items = [];\r
+       this.needsUpdate = true;\r
+};\r
+\r
+TinyMCE_Menu.prototype = tinyMCE.extend(TinyMCE_Layer.prototype, {\r
+       init : function(s) {\r
+               var n;\r
+\r
+               // Default params\r
+               this.settings = {\r
+                       separator_class : 'mceMenuSeparator',\r
+                       title_class : 'mceMenuTitle',\r
+                       disabled_class : 'mceMenuDisabled',\r
+                       menu_class : 'mceMenu',\r
+                       drop_menu : true\r
+               };\r
+\r
+               for (n in s)\r
+                       this.settings[n] = s[n];\r
+\r
+               this.create('div', this.settings.menu_class);\r
+       },\r
+\r
+       clear : function() {\r
+               this.items = [];\r
+       },\r
+\r
+       addTitle : function(t) {\r
+               this.add({type : 'title', text : t});\r
+       },\r
+\r
+       addDisabled : function(t) {\r
+               this.add({type : 'disabled', text : t});\r
+       },\r
+\r
+       addSeparator : function() {\r
+               this.add({type : 'separator'});\r
+       },\r
+\r
+       addItem : function(t, js) {\r
+               this.add({text : t, js : js});\r
+       },\r
+\r
+       add : function(mi) {\r
+               this.items[this.items.length] = mi;\r
+               this.needsUpdate = true;\r
+       },\r
+\r
+       update : function() {\r
+               var e = this.getElement(), h = '', i, t, m = this.items, s = this.settings;\r
+\r
+               if (this.settings.drop_menu)\r
+                       h += '<span class="mceMenuLine"></span>';\r
+\r
+               h += '<table border="0" cellpadding="0" cellspacing="0">';\r
+\r
+               for (i=0; i<m.length; i++) {\r
+                       t = tinyMCE.xmlEncode(m[i].text);\r
+                       c = m[i].class_name ? ' class="' + m[i].class_name + '"' : '';\r
+\r
+                       switch (m[i].type) {\r
+                               case 'separator':\r
+                                       h += '<tr class="' + s.separator_class + '"><td>';\r
+                                       break;\r
+\r
+                               case 'title':\r
+                                       h += '<tr class="' + s.title_class + '"><td><span' + c +'>' + t + '</span>';\r
+                                       break;\r
+\r
+                               case 'disabled':\r
+                                       h += '<tr class="' + s.disabled_class + '"><td><span' + c +'>' + t + '</span>';\r
+                                       break;\r
+\r
+                               default:\r
+                                       h += '<tr><td><a href="' + tinyMCE.xmlEncode(m[i].js) + '" onmousedown="' + tinyMCE.xmlEncode(m[i].js) + ';return tinyMCE.cancelEvent(event);" onclick="return tinyMCE.cancelEvent(event);" onmouseup="return tinyMCE.cancelEvent(event);"><span' + c +'>' + t + '</span></a>';\r
+                       }\r
+\r
+                       h += '</td></tr>';\r
+               }\r
+\r
+               h += '</table>';\r
+\r
+               e.innerHTML = h;\r
+\r
+               this.needsUpdate = false;\r
+               this.updateBlocker();\r
+       },\r
+\r
+       show : function() {\r
+               var nl, i;\r
+\r
+               if (tinyMCE.lastMenu == this)\r
+                       return;\r
+\r
+               if (this.needsUpdate)\r
+                       this.update();\r
+\r
+               if (tinyMCE.lastMenu && tinyMCE.lastMenu != this)\r
+                       tinyMCE.lastMenu.hide();\r
+\r
+               TinyMCE_Layer.prototype.show.call(this);\r
+\r
+               if (!tinyMCE.isOpera) {\r
+                       // Accessibility stuff\r
+/*                     nl = this.getElement().getElementsByTagName("a");\r
+                       if (nl.length > 0)\r
+                               nl[0].focus();*/\r
+               }\r
+\r
+               tinyMCE.lastMenu = this;\r
+       }\r
+\r
+       });\r
+\r
+/* file:jscripts/tiny_mce/classes/TinyMCE_Debug.class.js */\r
+\r
+tinyMCE.add(TinyMCE_Engine, {\r
+       debug : function() {\r
+               var m = "", a, i, l = tinyMCE.log.length;\r
+\r
+               for (i=0, a = this.debug.arguments; i<a.length; i++) {\r
+                       m += a[i];\r
+\r
+                       if (i<a.length-1)\r
+                               m += ', ';\r
+               }\r
+\r
+               if (l < 1000)\r
+                       tinyMCE.log[l] = "[debug] " + m;\r
+       }\r
+\r
+       });\r
+\r
diff --git a/media/tiny_mce/utils/editable_selects.js b/media/tiny_mce/utils/editable_selects.js
new file mode 100755 (executable)
index 0000000..e723365
--- /dev/null
@@ -0,0 +1,61 @@
+/**\r
+ * $Id: editable_selects.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Makes select boxes editable.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+var TinyMCE_EditableSelects = {\r
+       editSelectElm : null,\r
+\r
+       init : function() {\r
+               var nl = document.getElementsByTagName("select"), i, d = document, o;\r
+\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (nl[i].className.indexOf('mceEditableSelect') != -1) {\r
+                               o = new Option('(value)', '__mce_add_custom__');\r
+\r
+                               o.className = 'mceAddSelectValue';\r
+\r
+                               nl[i].options[nl[i].options.length] = o;\r
+                               nl[i].setAttribute('onchange', 'TinyMCE_EditableSelects.onChangeEditableSelect(this);');\r
+                       }\r
+               }\r
+       },\r
+\r
+       onChangeEditableSelect : function(se) {\r
+               var d = document, ne;\r
+\r
+               if (se.options[se.selectedIndex].value == '__mce_add_custom__') {\r
+                       ne = d.createElement("input");\r
+                       ne.id = se.id + "_custom";\r
+                       ne.name = se.name + "_custom";\r
+                       ne.type = "text";\r
+\r
+                       ne.style.width = se.clientWidth;\r
+                       se.parentNode.insertBefore(ne, se);\r
+                       se.style.display = 'none';\r
+                       ne.focus();\r
+                       ne.onblur = TinyMCE_EditableSelects.onBlurEditableSelectInput;\r
+                       TinyMCE_EditableSelects.editSelectElm = se;\r
+               }\r
+       },\r
+\r
+       onBlurEditableSelectInput : function() {\r
+               var se = TinyMCE_EditableSelects.editSelectElm;\r
+\r
+               if (se) {\r
+                       if (se.previousSibling.value != '') {\r
+                               addSelectValue(document.forms[0], se.id, se.previousSibling.value, se.previousSibling.value);\r
+                               selectByValue(document.forms[0], se.id, se.previousSibling.value);\r
+                       } else\r
+                               selectByValue(document.forms[0], se.id, '');\r
+\r
+                       se.style.display = 'inline';\r
+                       se.parentNode.removeChild(se.previousSibling);\r
+                       TinyMCE_EditableSelects.editSelectElm = null;\r
+               }\r
+       }\r
+};\r
diff --git a/media/tiny_mce/utils/form_utils.js b/media/tiny_mce/utils/form_utils.js
new file mode 100755 (executable)
index 0000000..ec9dbb3
--- /dev/null
@@ -0,0 +1,210 @@
+/**\r
+ * $Id: form_utils.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Various form utilitiy functions.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+var themeBaseURL = tinyMCE.baseURL + '/themes/' + tinyMCE.getParam("theme");\r
+\r
+function getColorPickerHTML(id, target_form_element) {\r
+       var h = "";\r
+\r
+       h += '<a id="' + id + '_link" href="javascript:void(0);" onkeydown="pickColor(event,\'' + target_form_element +'\');" onmousedown="pickColor(event,\'' + target_form_element +'\');return false;">';\r
+       h += '<img id="' + id + '" src="' + themeBaseURL + '/images/color.gif"';\r
+       h += ' onmouseover="this.className=\'mceButtonOver\'"';\r
+       h += ' onmouseout="this.className=\'mceButtonNormal\'"';\r
+       h += ' onmousedown="this.className=\'mceButtonDown\'"';\r
+       h += ' width="20" height="16" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';\r
+       h += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';\r
+\r
+       return h;\r
+}\r
+\r
+function pickColor(e, target_form_element) {\r
+       if ((e.keyCode == 32 || e.keyCode == 13) || e.type == "mousedown")\r
+               tinyMCEPopup.pickColor(e, target_form_element);\r
+}\r
+\r
+function updateColor(img_id, form_element_id) {\r
+       document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value;\r
+}\r
+\r
+function setBrowserDisabled(id, state) {\r
+       var img = document.getElementById(id);\r
+       var lnk = document.getElementById(id + "_link");\r
+\r
+       if (lnk) {\r
+               if (state) {\r
+                       lnk.setAttribute("realhref", lnk.getAttribute("href"));\r
+                       lnk.removeAttribute("href");\r
+                       tinyMCE.switchClass(img, 'mceButtonDisabled', true);\r
+               } else {\r
+                       lnk.setAttribute("href", lnk.getAttribute("realhref"));\r
+                       tinyMCE.switchClass(img, 'mceButtonNormal', false);\r
+               }\r
+       }\r
+}\r
+\r
+function getBrowserHTML(id, target_form_element, type, prefix) {\r
+       var option = prefix + "_" + type + "_browser_callback";\r
+       var cb = tinyMCE.getParam(option, tinyMCE.getParam("file_browser_callback"));\r
+       if (cb == null)\r
+               return "";\r
+\r
+       var html = "";\r
+\r
+       html += '<a id="' + id + '_link" href="javascript:openBrower(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;">';\r
+       html += '<img id="' + id + '" src="' + themeBaseURL + '/images/browse.gif"';\r
+       html += ' onmouseover="this.className=\'mceButtonOver\';"';\r
+       html += ' onmouseout="this.className=\'mceButtonNormal\';"';\r
+       html += ' onmousedown="this.className=\'mceButtonDown\';"';\r
+       html += ' width="20" height="18" border="0" title="' + tinyMCE.getLang('lang_browse') + '"';\r
+       html += ' class="mceButtonNormal" alt="' + tinyMCE.getLang('lang_browse') + '" /></a>';\r
+\r
+       return html;\r
+}\r
+\r
+function openBrower(img_id, target_form_element, type, option) {\r
+       var img = document.getElementById(img_id);\r
+\r
+       if (img.className != "mceButtonDisabled")\r
+               tinyMCEPopup.openBrowser(target_form_element, type, option);\r
+}\r
+\r
+function selectByValue(form_obj, field_name, value, add_custom, ignore_case) {\r
+       if (!form_obj || !form_obj.elements[field_name])\r
+               return;\r
+\r
+       var sel = form_obj.elements[field_name];\r
+\r
+       var found = false;\r
+       for (var i=0; i<sel.options.length; i++) {\r
+               var option = sel.options[i];\r
+\r
+               if (option.value == value || (ignore_case && option.value.toLowerCase() == value.toLowerCase())) {\r
+                       option.selected = true;\r
+                       found = true;\r
+               } else\r
+                       option.selected = false;\r
+       }\r
+\r
+       if (!found && add_custom && value != '') {\r
+               var option = new Option(value, value);\r
+               option.selected = true;\r
+               sel.options[sel.options.length] = option;\r
+               sel.selectedIndex = sel.options.length - 1;\r
+       }\r
+\r
+       return found;\r
+}\r
+\r
+function getSelectValue(form_obj, field_name) {\r
+       var elm = form_obj.elements[field_name];\r
+\r
+       if (elm == null || elm.options == null)\r
+               return "";\r
+\r
+       return elm.options[elm.selectedIndex].value;\r
+}\r
+\r
+function addSelectValue(form_obj, field_name, name, value) {\r
+       var s = form_obj.elements[field_name];\r
+       var o = new Option(name, value);\r
+       s.options[s.options.length] = o;\r
+}\r
+\r
+function addClassesToList(list_id, specific_option) {\r
+       // Setup class droplist\r
+       var styleSelectElm = document.getElementById(list_id);\r
+       var styles = tinyMCE.getParam('theme_advanced_styles', false);\r
+       styles = tinyMCE.getParam(specific_option, styles);\r
+\r
+       if (styles) {\r
+               var stylesAr = styles.split(';');\r
+\r
+               for (var i=0; i<stylesAr.length; i++) {\r
+                       if (stylesAr != "") {\r
+                               var key, value;\r
+\r
+                               key = stylesAr[i].split('=')[0];\r
+                               value = stylesAr[i].split('=')[1];\r
+\r
+                               styleSelectElm.options[styleSelectElm.length] = new Option(key, value);\r
+                       }\r
+               }\r
+       } else {\r
+               // Use auto impored classes\r
+               var csses = tinyMCE.getCSSClasses(tinyMCE.getWindowArg('editor_id'));\r
+               for (var i=0; i<csses.length; i++)\r
+                       styleSelectElm.options[styleSelectElm.length] = new Option(csses[i], csses[i]);\r
+       }\r
+}\r
+\r
+function isVisible(element_id) {\r
+       var elm = document.getElementById(element_id);\r
+\r
+       return elm && elm.style.display != "none";\r
+}\r
+\r
+function convertRGBToHex(col) {\r
+       var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");\r
+\r
+       var rgb = col.replace(re, "$1,$2,$3").split(',');\r
+       if (rgb.length == 3) {\r
+               r = parseInt(rgb[0]).toString(16);\r
+               g = parseInt(rgb[1]).toString(16);\r
+               b = parseInt(rgb[2]).toString(16);\r
+\r
+               r = r.length == 1 ? '0' + r : r;\r
+               g = g.length == 1 ? '0' + g : g;\r
+               b = b.length == 1 ? '0' + b : b;\r
+\r
+               return "#" + r + g + b;\r
+       }\r
+\r
+       return col;\r
+}\r
+\r
+function convertHexToRGB(col) {\r
+       if (col.indexOf('#') != -1) {\r
+               col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');\r
+\r
+               r = parseInt(col.substring(0, 2), 16);\r
+               g = parseInt(col.substring(2, 4), 16);\r
+               b = parseInt(col.substring(4, 6), 16);\r
+\r
+               return "rgb(" + r + "," + g + "," + b + ")";\r
+       }\r
+\r
+       return col;\r
+}\r
+\r
+function trimSize(size) {\r
+       return size.replace(new RegExp('[^0-9%]', 'gi'), '');\r
+}\r
+\r
+function getCSSSize(size) {\r
+       size = trimSize(size);\r
+\r
+       if (size == "")\r
+               return "";\r
+\r
+       return size.indexOf('%') != -1 ? size : size + "px";\r
+}\r
+\r
+function getStyle(elm, attrib, style) {\r
+       var val = tinyMCE.getAttrib(elm, attrib);\r
+\r
+       if (val != '')\r
+               return '' + val;\r
+\r
+       if (typeof(style) == 'undefined')\r
+               style = attrib;\r
+\r
+       val = eval('elm.style.' + style);\r
+\r
+       return val == null ? '' : '' + val;\r
+}\r
diff --git a/media/tiny_mce/utils/mclayer.js b/media/tiny_mce/utils/mclayer.js
new file mode 100755 (executable)
index 0000000..1b347f7
--- /dev/null
@@ -0,0 +1,210 @@
+/**\r
+ * $Id: mclayer.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Moxiecode floating layer script.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function MCLayer(id) {\r
+       this.id = id;\r
+       this.settings = new Array();\r
+       this.blockerElement = null;\r
+       this.isMSIE = navigator.appName == "Microsoft Internet Explorer";\r
+       this.events = false;\r
+       this.autoHideCallback = null;\r
+}\r
+\r
+MCLayer.prototype = {\r
+       moveRelativeTo : function(re, p, a) {\r
+               var rep = this.getAbsPosition(re);\r
+               var w = parseInt(re.offsetWidth);\r
+               var h = parseInt(re.offsetHeight);\r
+               var x, y;\r
+\r
+               switch (p) {\r
+                       case "tl":\r
+                               break;\r
+\r
+                       case "tr":\r
+                               x = rep.absLeft + w;\r
+                               y = rep.absTop;\r
+                               break;\r
+\r
+                       case "bl":\r
+                               break;\r
+\r
+                       case "br":\r
+                               break;\r
+               }\r
+\r
+               this.moveTo(x, y);\r
+       },\r
+\r
+       moveBy : function(dx, dy) {\r
+               var e = this.getElement();\r
+               var x = parseInt(e.style.left);\r
+               var y = parseInt(e.style.top);\r
+\r
+               e.style.left = (x + dx) + "px";\r
+               e.style.top = (y + dy) + "px";\r
+\r
+               this.updateBlocker();\r
+       },\r
+\r
+       moveTo : function(x, y) {\r
+               var e = this.getElement();\r
+\r
+               e.style.left = x + "px";\r
+               e.style.top = y + "px";\r
+\r
+               this.updateBlocker();\r
+       },\r
+\r
+       show : function() {\r
+               MCLayer.visibleLayer = this;\r
+\r
+               this.getElement().style.display = 'block';\r
+               this.updateBlocker();\r
+       },\r
+\r
+       hide : function() {\r
+               this.getElement().style.display = 'none';\r
+               this.updateBlocker();\r
+       },\r
+\r
+       setAutoHide : function(s, cb) {\r
+               this.autoHideCallback = cb;\r
+               this.registerEventHandlers();\r
+       },\r
+\r
+       getElement : function() {\r
+               return document.getElementById(this.id);\r
+       },\r
+\r
+       updateBlocker : function() {\r
+               if (!this.isMSIE)\r
+                       return;\r
+\r
+               var e = this.getElement();\r
+               var b = this.getBlocker();\r
+               var x = this.parseInt(e.style.left);\r
+               var y = this.parseInt(e.style.top);\r
+               var w = this.parseInt(e.offsetWidth);\r
+               var h = this.parseInt(e.offsetHeight);\r
+\r
+               b.style.left = x + 'px';\r
+               b.style.top = y + 'px';\r
+               b.style.width = w + 'px';\r
+               b.style.height = h + 'px';\r
+               b.style.display = e.style.display;\r
+       },\r
+\r
+       getBlocker : function() {\r
+               if (!this.blockerElement) {\r
+                       var d = document, b = d.createElement("iframe");\r
+\r
+                       b.style.cssText = 'display: none; left: 0px; position: absolute; top: 0';\r
+                       b.src = 'javascript:false;';\r
+                       b.frameBorder = '0';\r
+                       b.scrolling = 'no';\r
+\r
+                       d.body.appendChild(b);\r
+                       this.blockerElement = b;\r
+               }\r
+\r
+               return this.blockerElement;\r
+       },\r
+\r
+       getAbsPosition : function(n) {\r
+               var p = {absLeft : 0, absTop : 0};\r
+\r
+               while (n) {\r
+                       p.absLeft += n.offsetLeft;\r
+                       p.absTop += n.offsetTop;\r
+                       n = n.offsetParent;\r
+               }\r
+\r
+               return p;\r
+       },\r
+\r
+       registerEventHandlers : function() {\r
+               if (!this.events) {\r
+                       var d = document;\r
+\r
+                       this.addEvent(d, 'mousedown', MCLayer.prototype.onMouseDown);\r
+\r
+                       this.events = true;\r
+               }\r
+       },\r
+\r
+       addEvent : function(o, n, h) {\r
+               if (o.attachEvent)\r
+                       o.attachEvent("on" + n, h);\r
+               else\r
+                       o.addEventListener(n, h, false);\r
+       },\r
+\r
+       onMouseDown : function(e) {\r
+               e = typeof(e) == "undefined" ? window.event : e;\r
+               var b = document.body;\r
+               var l = MCLayer.visibleLayer;\r
+\r
+               if (l) {\r
+                       var mx = l.isMSIE ? e.clientX + b.scrollLeft : e.pageX;\r
+                       var my = l.isMSIE ? e.clientY + b.scrollTop : e.pageY;\r
+                       var el = l.getElement();\r
+                       var x = parseInt(el.style.left);\r
+                       var y = parseInt(el.style.top);\r
+                       var w = parseInt(el.offsetWidth);\r
+                       var h = parseInt(el.offsetHeight);\r
+\r
+                       if (!(mx > x && mx < x + w && my > y && my < y + h)) {\r
+                               MCLayer.visibleLayer = null;\r
+\r
+                               if (l.autoHideCallback && l.autoHideCallback(l, e, mx, my))\r
+                                       return true;\r
+\r
+                               l.hide();\r
+                       }\r
+               }\r
+       },\r
+\r
+       addCSSClass : function(e, c) {\r
+               this.removeCSSClass(e, c);\r
+               var a = this.explode(' ', e.className);\r
+               a[a.length] = c;\r
+               e.className = a.join(' ');\r
+       },\r
+\r
+       removeCSSClass : function(e, c) {\r
+               var a = this.explode(' ', e.className), i;\r
+\r
+               for (i=0; i<a.length; i++) {\r
+                       if (a[i] == c)\r
+                               a[i] = '';\r
+               }\r
+\r
+               e.className = a.join(' ');\r
+       },\r
+\r
+       explode : function(d, s) {\r
+               var ar = s.split(d);\r
+               var oar = new Array();\r
+\r
+               for (var i = 0; i<ar.length; i++) {\r
+                       if (ar[i] != "")\r
+                               oar[oar.length] = ar[i];\r
+               }\r
+\r
+               return oar;\r
+       },\r
+\r
+       parseInt : function(s) {\r
+               if (s == null || s == '')\r
+                       return 0;\r
+\r
+               return parseInt(s);\r
+       }\r
+}\r
diff --git a/media/tiny_mce/utils/mctabs.js b/media/tiny_mce/utils/mctabs.js
new file mode 100755 (executable)
index 0000000..fae038d
--- /dev/null
@@ -0,0 +1,74 @@
+/**\r
+ * $Id: mctabs.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Moxiecode DHTML Tabs script.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+function MCTabs() {\r
+       this.settings = new Array();\r
+};\r
+\r
+MCTabs.prototype.init = function(settings) {\r
+       this.settings = settings;\r
+};\r
+\r
+MCTabs.prototype.getParam = function(name, default_value) {\r
+       var value = null;\r
+\r
+       value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name];\r
+\r
+       // Fix bool values\r
+       if (value == "true" || value == "false")\r
+               return (value == "true");\r
+\r
+       return value;\r
+};\r
+\r
+MCTabs.prototype.displayTab = function(tab_id, panel_id) {\r
+       var panelElm = document.getElementById(panel_id);\r
+       var panelContainerElm = panelElm ? panelElm.parentNode : null;\r
+       var tabElm = document.getElementById(tab_id);\r
+       var tabContainerElm = tabElm ? tabElm.parentNode : null;\r
+       var selectionClass = this.getParam('selection_class', 'current');\r
+\r
+       if (tabElm && tabContainerElm) {\r
+               var nodes = tabContainerElm.childNodes;\r
+\r
+               // Hide all other tabs\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       if (nodes[i].nodeName == "LI")\r
+                               nodes[i].className = '';\r
+               }\r
+\r
+               // Show selected tab\r
+               tabElm.className = 'current';\r
+       }\r
+\r
+       if (panelElm && panelContainerElm) {\r
+               var nodes = panelContainerElm.childNodes;\r
+\r
+               // Hide all other panels\r
+               for (var i=0; i<nodes.length; i++) {\r
+                       if (nodes[i].nodeName == "DIV")\r
+                               nodes[i].className = 'panel';\r
+               }\r
+\r
+               // Show selected panel\r
+               panelElm.className = 'current';\r
+       }\r
+};\r
+\r
+MCTabs.prototype.getAnchor = function() {\r
+       var pos, url = document.location.href;\r
+\r
+       if ((pos = url.lastIndexOf('#')) != -1)\r
+               return url.substring(pos + 1);\r
+\r
+       return "";\r
+};\r
+\r
+// Global instance\r
+var mcTabs = new MCTabs();\r
diff --git a/media/tiny_mce/utils/validate.js b/media/tiny_mce/utils/validate.js
new file mode 100755 (executable)
index 0000000..b8931f4
--- /dev/null
@@ -0,0 +1,219 @@
+/**\r
+ * $Id: validate.js 162 2007-01-03 16:16:52Z spocke $\r
+ *\r
+ * Various form validation methods.\r
+ *\r
+ * @author Moxiecode\r
+ * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved.\r
+ */\r
+\r
+/**\r
+       // String validation:\r
+\r
+       if (!Validator.isEmail('myemail'))\r
+               alert('Invalid email.');\r
+\r
+       // Form validation:\r
+\r
+       var f = document.forms['myform'];\r
+\r
+       if (!Validator.isEmail(f.myemail))\r
+               alert('Invalid email.');\r
+*/\r
+\r
+var Validator = {\r
+       isEmail : function(s) {\r
+               return this.test(s, '^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+@[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$');\r
+       },\r
+\r
+       isAbsUrl : function(s) {\r
+               return this.test(s, '^(news|telnet|nttp|file|http|ftp|https)://[-A-Za-z0-9\\.]+\\/?.*$');\r
+       },\r
+\r
+       isSize : function(s) {\r
+               return this.test(s, '^[0-9]+(px|%)?$');\r
+       },\r
+\r
+       isId : function(s) {\r
+               return this.test(s, '^[A-Za-z_]([A-Za-z0-9_])*$');\r
+       },\r
+\r
+       isEmpty : function(s) {\r
+               var nl, i;\r
+\r
+               if (s.nodeName == 'SELECT' && s.selectedIndex < 1)\r
+                       return true;\r
+\r
+               if (s.type == 'checkbox' && !s.checked)\r
+                       return true;\r
+\r
+               if (s.type == 'radio') {\r
+                       for (i=0, nl = s.form.elements; i<nl.length; i++) {\r
+                               if (nl[i].type == "radio" && nl[i].name == s.name && nl[i].checked)\r
+                                       return false;\r
+                       }\r
+\r
+                       return true;\r
+               }\r
+\r
+               return new RegExp('^\\s*$').test(s.nodeType == 1 ? s.value : s);\r
+       },\r
+\r
+       isNumber : function(s, d) {\r
+               return !isNaN(s.nodeType == 1 ? s.value : s) && (!d || !this.test(s, '^-?[0-9]*\\.[0-9]*$'));\r
+       },\r
+\r
+       test : function(s, p) {\r
+               s = s.nodeType == 1 ? s.value : s;\r
+\r
+               return s == '' || new RegExp(p).test(s);\r
+       }\r
+};\r
+\r
+var AutoValidator = {\r
+       settings : {\r
+               id_cls : 'id',\r
+               int_cls : 'int',\r
+               url_cls : 'url',\r
+               number_cls : 'number',\r
+               email_cls : 'email',\r
+               size_cls : 'size',\r
+               required_cls : 'required',\r
+               invalid_cls : 'invalid',\r
+               min_cls : 'min',\r
+               max_cls : 'max'\r
+       },\r
+\r
+       init : function(s) {\r
+               var n;\r
+\r
+               for (n in s)\r
+                       this.settings[n] = s[n];\r
+       },\r
+\r
+       validate : function(f) {\r
+               var i, nl, s = this.settings, c = 0;\r
+\r
+               nl = this.tags(f, 'label');\r
+               for (i=0; i<nl.length; i++)\r
+                       this.removeClass(nl[i], s.invalid_cls);\r
+\r
+               c += this.validateElms(f, 'input');\r
+               c += this.validateElms(f, 'select');\r
+               c += this.validateElms(f, 'textarea');\r
+\r
+               return c == 3;\r
+       },\r
+\r
+       invalidate : function(n) {\r
+               this.mark(n.form, n);\r
+       },\r
+\r
+       reset : function(e) {\r
+               var t = new Array('label', 'input', 'select', 'textarea');\r
+               var i, j, nl, s = this.settings;\r
+\r
+               if (e == null)\r
+                       return;\r
+\r
+               for (i=0; i<t.length; i++) {\r
+                       nl = this.tags(e.form ? e.form : e, t[i]);\r
+                       for (j=0; j<nl.length; j++)\r
+                               this.removeClass(nl[j], s.invalid_cls);\r
+               }\r
+       },\r
+\r
+       validateElms : function(f, e) {\r
+               var nl, i, n, s = this.settings, st = true, va = Validator, v;\r
+\r
+               nl = this.tags(f, e);\r
+               for (i=0; i<nl.length; i++) {\r
+                       n = nl[i];\r
+\r
+                       this.removeClass(n, s.invalid_cls);\r
+\r
+                       if (this.hasClass(n, s.required_cls) && va.isEmpty(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.number_cls) && !va.isNumber(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.int_cls) && !va.isNumber(n, true))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.url_cls) && !va.isAbsUrl(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.email_cls) && !va.isEmail(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.size_cls) && !va.isSize(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.id_cls) && !va.isId(n))\r
+                               st = this.mark(f, n);\r
+\r
+                       if (this.hasClass(n, s.min_cls, true)) {\r
+                               v = this.getNum(n, s.min_cls);\r
+\r
+                               if (isNaN(v) || parseInt(n.value) < parseInt(v))\r
+                                       st = this.mark(f, n);\r
+                       }\r
+\r
+                       if (this.hasClass(n, s.max_cls, true)) {\r
+                               v = this.getNum(n, s.max_cls);\r
+\r
+                               if (isNaN(v) || parseInt(n.value) > parseInt(v))\r
+                                       st = this.mark(f, n);\r
+                       }\r
+               }\r
+\r
+               return st;\r
+       },\r
+\r
+       hasClass : function(n, c, d) {\r
+               return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className);\r
+       },\r
+\r
+       getNum : function(n, c) {\r
+               c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0];\r
+               c = c.replace(/[^0-9]/g, '');\r
+\r
+               return c;\r
+       },\r
+\r
+       addClass : function(n, c, b) {\r
+               var o = this.removeClass(n, c);\r
+               n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c;\r
+       },\r
+\r
+       removeClass : function(n, c) {\r
+               c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' ');\r
+               return n.className = c != ' ' ? c : '';\r
+       },\r
+\r
+       tags : function(f, s) {\r
+               return f.getElementsByTagName(s);\r
+       },\r
+\r
+       mark : function(f, n) {\r
+               var s = this.settings;\r
+\r
+               this.addClass(n, s.invalid_cls);\r
+               this.markLabels(f, n, s.invalid_cls);\r
+\r
+               return false;\r
+       },\r
+\r
+       markLabels : function(f, n, ic) {\r
+               var nl, i;\r
+\r
+               nl = this.tags(f, "label");\r
+               for (i=0; i<nl.length; i++) {\r
+                       if (nl[i].getAttribute("for") == n.id || nl[i].htmlFor == n.id)\r
+                               this.addClass(nl[i], ic);\r
+               }\r
+\r
+               return null;\r
+       }\r
+};\r